一、华为地图开发准备工作
1. 设置 Client ID:
在完成基本准备及公钥指纹设置后,登录 AppGallery Connect(AGC) 平台获取目标应用的 Client ID(非项目的),并于工程 entry 模块的 module.json5 文件里,在 metadata 中新增设置,名称设为 client_id,值为所取 Client ID。
- "module": {
- "name": "xxxx",
- "type": "entry",
- "description": "xxxx",
- "mainElement": "xxxx",
- "deviceTypes": [
- 'phone',
- 'tablet'
- ],
- "pages": "xxxx",
- "abilities": [],
- "metadata": [
- {
- "name": "client_id",
- "value": "xxxxxx" // 配置为获取的Client ID
- }
- ]
- }
复制代码 2. 开通地图服务:
登录 AGC 网站,选 “我的项目”,在项目下挑中需开地图服务的应用,经 API 管理寻地图服务开关开启,为地图开发筑牢根基,助开发者提升应用 LBS 体验、实现地图个性化呈现与交互。
二、表现地图
1.导入 Map Kit 模块
- import { MapComponent, mapCommon, map } from '@kit.MapKit';
- import { AsyncCallback } from '@kit.BasicServicesKit';
复制代码 2. 设 mapOptions 定地图中心及层级
- @Entry
- @Component
- struct MapApp {
- // 地图初始化参数
- private mapOptions: mapCommon.MapOptions = {
- position: {
- target: {
- latitude: 39.9, // 地图中心纬度,可按需修改
- longitude: 116.4 // 地图中心经度,可按需修改
- },
- zoom: 10 // 地图层级,可调整
- },
- // 可按需设置其他地图属性,如是否支持旋转手势等
- rotateGesturesEnabled: true,
- scrollGesturesEnabled: true,
- zoomGesturesEnabled: true,
- tiltGesturesEnabled: true,
- mapType: mapCommon.MapType.STANDARD, // 地图类型,可切换
- myLocationControlsEnabled: false, // 是否展示我的位置按钮,可设为 true 开启
- compassControlsEnabled: true, // 是否展示指南针控件
- scaleControlsEnabled: false // 是否展示比例尺,可设为 true 展示
- };
复制代码 MapOptions包含以部属性
属性
描述
mapType
地图类型,默认值:MapType.STANDARD。
position
地图相机位置。
bounds
地图展示框。
minZoom
地图最小图层,有效范围[2, 20],默认值:2。
maxZoom
地图最大图层,有效范围[2, 20],默认值:20。
rotateGesturesEnabled
是否支持旋转手势,默认值:true。
scrollGesturesEnabled
是否支持滑动手势,默认值:true。
zoomGesturesEnabled
是否支持缩放手势,默认值:true。
tiltGesturesEnabled
是否支持倾斜手势,默认值:true。
zoomControlsEnabled
是否展示缩放控件,默认值:true。
myLocationControlsEnabled
是否展示我的位置按钮,默认值:false。
compassControlsEnabled
是否展示指南针控件,默认值:true。
scaleControlsEnabled
是否展示比例尺,默认值:false。
alwaysShowScaleEnabled
是否始终表现比例尺,默认值:false。
padding
设置地图和界限的间隔。
styleId
自定义样式ID。
dayNightMode
日间夜间模式,默认值:DayNightMode.DAY(日间模式)。
3. 经 callback 取 MapComponentController
- private callback: AsyncCallback<map.MapComponentController> = () => {
- }
- private mapController?: map.MapComponentController
- private mapEventManager?: map.MapEventManager
- aboutToAppear() {
- this.callback = async (err, mapController) => {
- if (!err) {
- this.mapController = mapController;
- this.mapEventManager = this.mapController.getEventManager();
- let callback = () => {
- console.info("MapApp", `on-mapLoad`);
- };
- this.mapEventManager.on("mapLoad", callback);
- }
- };
- }
复制代码 4. 调 MapComponent 初始化地图以呈如今 APP
- onPageShow() {
- if (this.mapController) {
- this.mapController.show();
- }
- }
- onPageHide() {
- if (this.mapController) {
- this.mapController.hide();
- }
- }
- build() {
- Stack() {
- // 初始化地图组件
- MapComponent({ mapOptions: this.mapOptions, mapCallback: this.callback })
- .width('100%')
- .height('100%');
- }.height('100%')
- }
复制代码 三、获取我的位置
接口阐释:
MapComponentController 含多关键方法:
- setMyLocationEnabled 控 “我的位置” 图层开关及表现效果;
- setMyLocationControlsEnabled 管按钮启用;
- setMyLocation 设位置坐标;
- setMyLocationStyle 定样式;
- on 与 off 分别监听、取消监听按钮点击事件,各方法依规则与参数精准操控功能细节。
1. 权限获取 + 功能启用:
依权限获取方式在适当时机调用 setMyLocationEnabled 与 setMyLocationControlsEnabled 激活功能,过程含权限校验、申请授权及状态处理逻辑链。
方式一用安全控件 LocationButton;
在 ArkUI 框架下创建一个按钮组件,用于触发安全控件 LocationButton 的点击事件以申请权限并开启地图与 “我的位置” 功能:
- import { LocationButton, LocationButtonOptions, LocationIconStyle, LocationDescription, ButtonType, ClickEvent, LocationButtonOnClickResult } from '@ohos.security.components';
- @Entry
- @Component
- struct MapLocationApp {
- build() {
- Column() {
- // 创建默认样式的 LocationButton 并监听点击事件
- LocationButton()
- .onClick((event: ClickEvent, result: LocationButtonOnClickResult) => {
- console.info("点击结果: " + result);
- if (result === LocationButtonOnClickResult.SUCCESS) {
- // 在此处添加成功获取权限后开启地图及“我的位置”功能的代码
- // 假设已获取到 mapController 实例
- this.mapController.setMyLocationEnabled(true);
- this.mapController.setMyLocationControlsEnabled(true);
- } else if (result === LocationButtonOnClickResult.TEMPORARY_AUTHORIZATION_FAILED) {
- console.error("位置权限授权失败");
- }
- })
- // 创建仅显示线条样式图标的 LocationButton
- LocationButton({ icon: LocationIconStyle.LINES })
- // 创建显示线条样式图标与胶囊背景的 LocationButton,并设置背景色(注意背景色高八位的α值限制)
- LocationButton({ icon: LocationIconStyle.LINES, buttonType: ButtonType.Capsule })
- .backgroundColor(0x10007dff)
- // 创建显示线条样式图标、“当前位置”文本与胶囊背景的 LocationButton,并设置字体大小与尺寸(处理文本换行与控件完整性)
- LocationButton({ icon: LocationIconStyle.LINES, text: LocationDescription.CURRENT_LOCATION, buttonType: ButtonType.Capsule })
- .fontSize(16)
- .width(30)
- }
- }
- }
复制代码 方式二则在 module.json5 声明 ohos.permission.LOCATION 与 ohos.permission.APPROXIMATELY_LOCATION 权限后申请,且需精心设置权限理由及应用场景等。
- {
- "module": {
- // 其他配置项...
- "requestPermissions":[
- {
- "name": "ohos.permission.LOCATION",
- "reason": "$string:location_permission",
- "usedScene": {
- "abilities": [
- "EntryAbility"
- ],
- "when":"inuse"
- }
- },
- {
- "name": "ohos.permission.APPROXIMATELY_LOCATION",
- "reason": "$string:approximately_location_permission",
- "usedScene": {
- "abilities": [
- "EntryAbility"
- ],
- "when":"inuse"
- }
- }
- ]
- }
- }
复制代码- import { abilityAccessCtrl, bundleManager, common, PermissionRequestResult, Permissions } from '@kit.AbilityKit';
- import { BusinessError } from '@kit.BasicServicesKit';
- @Entry
- @Component
- struct MapLocationApp {
- // 假设已在其他地方获取到 MapComponentController 实例 mapController
- private mapController: MapComponentController;
- async checkPermissions(): Promise<boolean> {
- const permissions: Array<Permissions> = ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'];
- for (let permission of permissions) {
- let grantStatus: abilityAccessCtrl.GrantStatus = await this.checkAccessToken(permission);
- if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
- // 启用我的位置图层
- this.mapController?.setMyLocationEnabled(true);
- // 启用我的位置按钮
- this.mapController?.setMyLocationControlsEnabled(true);
- return true;
- }
- }
- return false;
- }
- requestPermissions(): void {
- let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
- atManager.requestPermissionsFromUser(getContext() as common.UIAbilityContext, ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'])
- .then((data: PermissionRequestResult) => {
- // 启用我的位置图层
- this.mapController?.setMyLocationEnabled(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;
- let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
- console.info('Succeeded in getting Bundle.');
- let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
- tokenId = appInfo.accessTokenId;
- // 校验应用是否被授予权限
- grantStatus = await atManager.checkAccessToken(tokenId, permission);
- console.info('Succeeded in checking access token.');
- return grantStatus;
- }
- build() {
- Column() {
- Button('检查并申请权限')
- .onClick(() => {
- if (!this.checkPermissions()) {
- this.requestPermissions();
- }
- })
- }
- }
- }
复制代码 2. 功能检查与拓展操作:
查功能启用状态看按钮及定位表现;
借 geoLocationManager 接口获坐标设位置,留意坐标系转换;
- // 需要引入@kit.LocationKit模块
- import { geoLocationManager } from '@kit.LocationKit';
- // ...
- // 获取用户位置坐标
- let location = await geoLocationManager.getCurrentLocation();
- // 设置用户的位置
- this.mapController.setMyLocation(location);
复制代码 用 on 方法监听按钮点击事件,定制交互;
- let callback = () => {
- console.info("myLocationButtonClick", `myLocationButtonClick`);
- };
- this.mapEventManager.on("myLocationButtonClick", callback);
复制代码 setMyLocationStyle 依 mapCommon.MyLocationStyle 规则自定义图标样式,全方位构建灵活、精准的 “我的位置” 功能体系,提升地图用户体验与交互性。
- let style: mapCommon.MyLocationStyle = {
- anchorU: 0.5,
- anchorV: 0.5,
- radiusFillColor: 0xffff0000,
- // icon为自定义图标资源,使用时需要替换
- // 图标存放在resources/rawfile,icon参数传入rawfile文件夹下的相对路径
- icon: 'test.png'
- };
- await this.mapController.setMyLocationStyle(style);
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |