HarmonyOS 鸿蒙Next sceneMap(场景化控件)自定义地图

发布于 1周前 作者 gougou168 来自 鸿蒙OS

HarmonyOS 鸿蒙Next sceneMap(场景化控件)自定义地图 sceneMap(场景化控件)中的chooseLocation方法拉的Ui界面怎么自定义,或者说怎么设置中心定位点,效果是拖动地图不变

2 回复

参考下此demo,看能否实现您要的效果

import { map, mapCommon, MapComponent } from '@kit.MapKit';
import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';
import { abilityAccessCtrl, bundleManager, common, PermissionRequestResult, Permissions } from '@kit.AbilityKit';
import { geoLocationManager } from '@kit.LocationKit';

@Entry
@Component
struct HuaweiMyLocationDemo {
  async checkPermission(): Promise<void> {
    let applyResult: boolean = false;
    const permissions: Array<Permissions> = ['ohos.permission.LOCATION','ohos.permission.APPROXIMATELY_LOCATION','ohos.permission.INTERNET'];
    for(let permission of permissions) {
      let grantStatus: abilityAccessCtrl.GrantStatus = await this.checkAccessToken(permission);
      if(grantStatus == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
        applyResult = true;
      } else {
        applyResult = false
      }
    }
    if(!applyResult) {
      this.requestPermissions();
    } else {
      //启用我的位置图层,mapController为地图操作类对象,获取方式详见地图呈现章节
      this.mapController?.setMyLocationEnabled(true);
      //启用我的位置按钮
      this.mapController?.setMyLocationControlsEnabled(true);
    }
  }

  //如果没有被授予定位权限,动态向用户申请授权
  requestPermissions(): void {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    atManager.requestPermissionsFromUser(getContext() as common.UIAbilityContext,[ 'ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION','ohos.permission.INTERNET'])
      .then((data: PermissionRequestResult) => {
        //启用我的位置图层
        this.mapController?.setMyLocationEnabled(true);
        //启用我的位置按钮
        this.mapController?.setMyLocationControlsEnabled(true);
      })
      .catch((err: BusinessError) => {
        console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`)
      })
  }

  async checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;

    //获取应用程序的accessTokenID
    let tokenId: number = 0;
    try {
      let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
      let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
      tokenId = appInfo.accessTokenId;
    } catch ( error ) {
      let err: BusinessError = error as BusinessError;
      console.error(`Failed to get bundle info for self. Code is ${err.code},message is ${err.message}`)
    }
    //校验应用是否被授予权限
    try{
      grantStatus = await atManager.checkAccessToken(tokenId,permission);
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(`Failed to check access token. Code is ${err.code}, message is ${err.message}`)
    }
    return grantStatus;
  }

  //定义参数mapOption,设置地图中心点坐标以及层级。
  private mapOption?: mapCommon.MapOptions;
  //定义参数callback,通过callback回调的方式获取MapComponentController对象,用来操作地图。
  private callback?: AsyncCallback<MapComponentController>
  //定义TAG
  private TAG = 'HuaweiMyLocationDemo';
  //地定义地图参数mapController,获取地图的控制器类,用来操作地图
  private mapController?: map.MapComponentController;

  aboutToAppear(): void {
    this.checkPermission();
    // 地图初始化参数,设置地图中心坐标以及层级
    this.mapOption = {
      position: {
        target: {
          latitude: 39.9,
          longitude:116.4
        },
        zoom: 10
      },
      myLocationControlsEnabled: true,
      scaleControlsEnabled: true,
    };
    
// 地图初始化的回调
    this.callback = async (err, mapController) => {
      if(!err) {
        //获取地图的控制器类,用来操作地图
        this.mapController = mapController;
        // 启用我的位置图层
        this.mapController?.setMyLocationEnabled(true);
        //启用我的位置按钮。
        this.mapController?.setMyLocationControlsEnabled(true);

        this.mapController.setZoomControlsEnabled(true);
        // 指南针开关
        this.mapController.setCompassControlsEnabled(true);
        //滚动相机,将相机按照指定的像素点移动
        let x = 100.0;
        let y = 100.0;
        let cameraUpdate = map.scrollBy(x, y);
        // 以动画方式移动地图相机
        this.mapController.animateCamera(cameraUpdate, 1000);
        // 设置最小偏好缩放级别,范围为[2,20]
        this.mapController.setMinZoom(6);
        // 设置最大偏好缩放级别,范围为[2,20]
        this.mapController.setMaxZoom(14);
        let style: mapCommon.MyLocationStyle = {
          anchorU: 0.5,
          anchorV: 0.5,
          radiusFillColor: 0xffff0000,
          // icon为自定义图标资源,使用时需要替换
          // 图标存放在resources/rawfile,icon参数传入rawfile文件夹下的相对路径
          icon: 'icon.png',
        };
        await this.mapController.setMyLocationStyle(style);
        //初始化我的位置
        this.getMyLocation()
      }
    }
  }
  build() {
    Stack() {
      MapComponent({mapOptions: this.mapOption, mapCallback: this.callback}).width('100%').height('100%');
    }.height('100%')
  }
  // 获取当前位置并视图移动过去
  getMyLocation() {
    geoLocationManager.getCurrentLocation().then(async (result) => {
      console.log('MapSignIn', 'getMyLocation = ' + JSON.stringify(result))
      let position: geoLocationManager.Location = {
        "latitude": result.latitude,
        "longitude": result.longitude,
        "altitude": 0,
        "accuracy": 0,
        "speed": 0,
        "timeStamp": 0,
        "direction": 0,
        "timeSinceBoot": 0
      };
      this.mapController?.setMyLocation(position)

//创建CameraUpdate对象
      let gcj02Position: mapCommon.LatLng = await this.convertCoordinate(result.latitude,result.longitude)
      let latLng: mapCommon.LatLng = {
        latitude: gcj02Position.latitude,
        longitude:gcj02Position.longitude
      }
      let zoom = 14;
      let cameraUpdate = map.newLatLng(latLng,zoom)
      // 以动画方式移动地图相机
      this.mapController?.animateCamera(cameraUpdate,1000);
    })
  }

  async convertCoordinate(latitude: number, longitude: number): Promise<mapCommon.LatLng> {
    let wgs84Position: mapCommon.LatLng = {
      latitude: latitude,
      longitude: longitude
    }
    let gcj02Postion: mapCommon.LatLng = await map.convertCoordinate(mapCommon.CoordinateType.WGS84, mapCommon.CoordinateType.GCJ02,wgs84Position);
    return gcj02Postion;
  }
}

更多关于HarmonyOS 鸿蒙Next sceneMap(场景化控件)自定义地图的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS 鸿蒙中的Next sceneMap(场景化控件)允许开发者自定义地图界面,为用户提供更为丰富和个性化的场景体验。自定义地图通常涉及地图数据的加载、地图元素的绘制以及用户交互的实现。

在鸿蒙系统中,自定义地图通常通过特定的地图服务API或SDK来完成。开发者需要首先集成相应的地图服务SDK,这通常包括在项目的构建配置中引入SDK依赖,以及遵循SDK提供的接口规范。

一旦SDK集成完成,开发者可以开始定义地图的基本属性,如地图的中心点、缩放级别、地图类型(如卫星图、街景图等)。接下来,开发者可以在地图上添加自定义元素,这些元素可以是标记(Marker)、多边形(Polygon)、折线(Polyline)等,用于展示特定的地理位置信息或用户数据。

此外,为了实现丰富的用户交互,开发者还需要处理地图事件,如点击事件、拖拽事件、缩放事件等。这些事件的处理通常通过监听器模式来实现,开发者可以在事件触发时执行相应的逻辑代码。

需要注意的是,自定义地图的具体实现细节可能因地图服务SDK的不同而有所差异。开发者应参考所选SDK的官方文档,以确保正确实现自定义地图功能。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部