HarmonyOS 鸿蒙Next Map Kit添加点注释问题
HarmonyOS 鸿蒙Next Map Kit添加点注释问题
地图中使用addPointAnnotation for循环添加点注释,首个添加行为耗时500ms左右 ,后续耗时正常 1、创建地图 2、添加点注释
import { systemDateTime } from '@kit.BasicServicesKit';
import { ArrayList } from '@kit.ArkTS';
import hilog from '@ohos.hilog';
export class StopWatchUtil {
private static Tag: string = this.name;
private static isBegin: boolean = false;
private static taskName: string;
private static startTime: number;
private static splitTime: number;
private static taskBeanList: ArrayList<TaskBean> = new ArrayList();
/**
* 开始计时
*/
static begin(task: string) {
StopWatchUtil.isBegin = true;
StopWatchUtil.taskName = task;
StopWatchUtil.startTime = systemDateTime.getTime();
StopWatchUtil.splitTime = 0;
StopWatchUtil.taskBeanList.clear();
StopWatchUtil.taskBeanList.add({ time: 0, taskName: 'begin' });
}
/**
* 事务记录
*/
static split(subtaskName: string) {
if (StopWatchUtil.isBegin) {
if (StopWatchUtil.splitTime === 0) {
StopWatchUtil.splitTime = systemDateTime.getTime() - StopWatchUtil.startTime;
} else {
StopWatchUtil.splitTime = systemDateTime.getTime() - StopWatchUtil.splitTime;
}
StopWatchUtil.taskBeanList.add({ time: StopWatchUtil.splitTime, taskName: subtaskName });
StopWatchUtil.splitTime = systemDateTime.getTime();
} else {
hilog.debug(0, StopWatchUtil.Tag, "请先调用 StopWatch.begin(task:string)");
}
}
/**
* 结束计时并输出log
*/
static writeLog() {
if (StopWatchUtil.isBegin) {
let totalTime = systemDateTime.getTime() - StopWatchUtil.startTime;
for (let taskBean of StopWatchUtil.taskBeanList) {
let time = taskBean.time;
let data: string;
if ("begin" === taskBean.taskName) {
data = taskBean.taskName;
} else {
if (totalTime == 0) {
data = ` ${time} ms, 0%, ${taskBean.taskName}`;
} else {
let percentage = time / totalTime * 100;
data = ` ${time} ms, ${Math.round(percentage)}%, ${taskBean.taskName}`;
}
}
hilog.debug(0, StopWatchUtil.Tag, '%{public}s %{public}s', StopWatchUtil.taskName, data);
}
hilog.debug(0, StopWatchUtil.Tag, "%{public}s end 总耗时: %{public}d ms", StopWatchUtil.taskName,
totalTime);
} else {
hilog.debug(0, StopWatchUtil.Tag, "请先调用 StopWatch.begin(task:string)");
}
StopWatchUtil.isBegin = false;
StopWatchUtil.taskBeanList.clear();
}
}
interface TaskBean {
time: number
taskName: string
}
//计时工具类结束
//添加marker代码,日志以通过 “小象upup” 过滤,具体marker数据请技术老师自己随意构造
async markerInit() {
this.mapController?.clear();
this.markerList.length = 0;
StopWatchUtil.begin('小象upup');
for (let bean of this.targetMarkerBeans) {
// 转换经纬度坐标
let gcj02Position: mapCommon.LatLng =
map.convertCoordinateSync(mapCommon.CoordinateType.WGS84, mapCommon.CoordinateType.GCJ02, bean.latLng);
let pointAnnotationOptions: mapCommon.PointAnnotationParams = {
// 定义点注释图标锚点
position: gcj02Position,
// 定义点注释名称与地图poi名称相同时,是否支持去重
repeatable: true,
// 定义点注释的碰撞规则
collisionRule: mapCommon.CollisionRule.NAME,
// 定义点注释的标题,数组长度最小为1,最大为3
titles: [{
// 定义标题内容
content: bean.customerName,
// 定义标题字体颜色
color: 0x80000000,
// 定义标题字体大小
fontSize: 14,
// 定义标题描边颜色
strokeColor: 0xFFFFFFFF,
// 定义标题描边宽度
strokeWidth: 2,
// 定义标题字体样式
fontStyle: mapCommon.FontStyle.ITALIC
}],
// 定义点注释是否展示图标
showIcon: true,
// 定义点注释的锚点在水平方向上的位置
anchorU: 0.5,
// 定义点注释的锚点在垂直方向上的位置
anchorV: 1,
// 定义点注释的显示属性,为true时,在被碰撞后仍能显示
forceVisible: true,
// 定义点注释展示的最小层级
minZoom: 2,
// 定义点注释展示的最大层级
maxZoom: 22,
// 定义点注释是否可见
visible: true,
// 定义点注释叠加层级属性
zIndex: 0
}
switch (bean.type) {
case 0:
pointAnnotationOptions.icon =
PixelMapUtil.getPixelMapByResource($r('app.media.map_contact_marker'), 200);
break;
case 1:
pointAnnotationOptions.icon =
bean.isDone ?
PixelMapUtil.getPixelMapByResource($r('app.media.map_schedule_done_marker'), 200) :
PixelMapUtil.getPixelMapByResource($r('app.media.map_schedule_undone_marker'), 200)
break;
case 2:
pointAnnotationOptions.icon =
bean.isDone ? PixelMapUtil.getPixelMapByResource($r('app.media.map_work_done_marker'), 200) :
PixelMapUtil.getPixelMapByResource($r('app.media.map_work_undone_marker'), 200);
break;
default:
pointAnnotationOptions.icon = PixelMapUtil.getPixelMapByResource($r('app.media.icon'), 200)
break
}
StopWatchUtil.split('marker参数完成')
let pointAnnotation = await this.mapController?.addPointAnnotation(pointAnnotationOptions);
StopWatchUtil.split(`第${this.targetMarkerBeans.indexOf(bean)}个marker添加完成`)
if (pointAnnotation) {
pointAnnotation.setTag(bean);
this.markerList.push(pointAnnotation);
}
}
StopWatchUtil.writeLog();
}
1 回复
针对HarmonyOS 鸿蒙Next Map Kit添加点注释的问题,以下是一些专业的解答:
在HarmonyOS 鸿蒙Next Map Kit中,添加点注释功能主要由PointAnnotationParams
、addPointAnnotation
和PointAnnotation
提供。你可以通过以下步骤实现点注释的添加:
- 初始化地图并设置相关参数,包括中心点坐标、缩放层级等。
- 创建
PointAnnotationParams
对象,并设置点注释的相关属性,如位置、标题、图标、是否显示图标、碰撞规则等。 - 调用
mapController
的addPointAnnotation
方法,将PointAnnotationParams
对象作为参数传入,以添加点注释。 - 如果需要,你可以修改已添加的点注释的属性,如显示层级、碰撞优先级等。
此外,你还可以为点注释设置点击事件监听,以便在用户点击点注释时执行相关操作。
如果在添加点注释过程中遇到问题,建议检查以下几点:
- 确保已正确引入Map Kit组件和相关模块。
- 确保
mapController
对象已正确初始化。 - 检查
PointAnnotationParams
对象的属性设置是否正确。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html