HarmonyOS花瓣地图自定义点聚合功能

背景

项目中需要实现点聚合效果,但是花瓣地图目前的点聚合功能无法满足业务需求

下载安装

text 复制代码
ohpm install @zhongrui/poi_cluster

点聚合开源仓库
源码地址

导入模块

typescript 复制代码
import { ClusterManager , ClusterPoint , Poi} from 'poi_cluster'

效果图

用法

typescript 复制代码
import { Poi } from "poi_cluster";

export class MarkerPoiInfo extends Poi {
  private lat: number = 0
  private lng: number = 0

  constructor(lat: number, lng: number) {
    super()
    this.lat = lat
    this.lng = lng
  }
  getLat(): number {
    return this.lat
  }
  getLng(): number {
    return this.lng
  }
  getExtra(): string {
    return ""
  }
  getDataId(): string {
    return ''
  }
}
typescript 复制代码
  private poiList: MarkerPoiInfo[] = []
aboutToAppear(): void {
  //添加需要聚合的poi点
  this.poiList.push(new MarkerPoiInfo(40.428, 116.887))
  this.poiList.push(new MarkerPoiInfo(39.639, 116.791))
  this.poiList.push(new MarkerPoiInfo(40.345, 116.004))
  this.poiList.push(new MarkerPoiInfo(39.716, 116.938))
  this.poiList.push(new MarkerPoiInfo(40.192, 116.424))
}
typescript 复制代码
  mapZoom: number = 0
//监听相机移动结束事件,重新进行聚合计算
this.mapController?.on('cameraIdle', () => {
  const mapCurrentZoom = this.mapController.getCameraPosition().zoom
  if (Math.abs(this.mapZoom - mapCurrentZoom) < 0.3) {
    return
  }
  this.mapZoom = mapCurrentZoom
  this.initCluster()
})
typescript 复制代码
  //1:创建ClusterManager
//(构造参数100代表两个poi在屏幕的直线距离小于等于100px时进行聚合)
private manager = new ClusterManager(100)

private initCluster() {
  //停止之前的聚合计算
  this.manager.end()
  this.manager = new ClusterManager(100)
  //2:设置mapController
  this.manager.setMapController(this.mapController)
  //3:设置聚合完成监听
  this.manager.setCompleteListener((result: ClusterPoint<MarkerPoiInfo>[]) => {
    //获取聚合结果
    this.addCluster(result)
  })
  //4:开始聚合(获取聚合结果)
  const result = this.manager.cluster(this.poiList)
  // this.addCluster(result)
}
typescript 复制代码
private addCluster(result: ClusterPoint<MarkerPoiInfo>[]) {
  if (!this.mapController) {
    return
  }
  //根据业务逻辑设置聚合poi对应的图片
  let clusterImage: (string | image.PixelMap | Resource)|undefined = undefined
  result?.forEach((item) => {
    const count = item.getPoiCount()
    //如果聚合类有多个poi,在地图上添加聚合poi
    if (count > 1) {
      this.mapController?.addMarker({
        position: { latitude: item.getLat(), longitude: item.getLng() },
        icon: clusterImage, //clusterImage为聚合poi图片
        anchorV: 1,
        anchorU: 0.5
      })
    } else {
      //如果聚合类只有1个poi,在地图上添加普通poi
      this.mapController?.addMarker({
        position: { latitude: item.getLat(), longitude: item.getLng() },
        icon: $r("app.media.marker_icon"),
        anchorV: 1,
        anchorU: 0.5
      })
    }
  })
}
typescript 复制代码
  aboutToDisappear(): void {
  //及时结束聚合操作()
  this.manager.end()
}

历史文章

HarmonyOS NEXT多环境+多渠道+自定义路径输出+自定义名称一键打app和hap包

HarmonyOS NEXT一行代码实现任意处弹窗

HarmonyOS NEXT数据列表加载更多(无需监听列表滑到最底部)

HarmonyOS NEXT下拉刷新+上拉加载(纵向横向都支持)(v1+v2装饰器)

HarmonyOS NEXT图片压缩(支持fd,uri,网络图片,沙箱路径,base64,ArrayBuffer)

HarmonyOS弹窗+bindSheet半模态+浮层通用解决方案覆盖全业务场景

相关推荐
数智工坊7 小时前
机器人运动控制:采样、优化与学习三大流派深度对比与实战
android·学习·机器人
故渊at9 小时前
第二板块:Android 四大组件标准化学理 | 第八篇:Service 后台执行实体与优先级
android·gitee·service·前台服务·后台服务
不爱吃糖的程序媛9 小时前
鸿蒙服务卡片实战:为新华字典应用添加桌面快捷查询卡片
华为·harmonyos
会Tk矩阵群控的小木9 小时前
安卓群控系统对于游戏工作室实战教程
android·运维·游戏·adb·开源软件·个人开发
qeen8710 小时前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习
故渊at10 小时前
第二板块:Android 四大组件标准化学理 | 第九篇:BroadcastReceiver 事件分发与有序广播
android·gitee·broadcast·广播·动态注册·静态注册
JohnnyDeng9411 小时前
【Android】Room 数据库高级用法与性能调优:从查询瓶颈到毫秒级响应
android·性能优化·kotlin·room
zeqinjie11 小时前
Flutter 折叠屏 iPad / 宽屏适配实践
android·前端·flutter
ab_dg_dp11 小时前
Android 17+ 提取 AIDL 生成 Java 文件的实用脚本
android·java·python