HarmonyOS 鸿蒙Next 使用花瓣地图显示10万 个头像

发布于 1周前 作者 htzhanglong 最后一次编辑是 5天前 来自 鸿蒙OS

便了么是一款通过为用户提供每日记录、监测、分析排便情况,继而为用户提供健康建议和方案的应用程序,用户数过千万,每天有超过10万人来记录便便。每天会有一张这个全球便便地图需要显示出来。

00e1071a9696a2edb0b854a92669c7ee.JPG

这个每日地图上需要显示超过10万个图,一到晚上积累了一天的大量的拉便便的人的时候,在苹果和安卓上就会地图打不开,有时候直接导致手机app强退,监测地图的内存占用会飙升到1.6G以上。大家给出的解决方案大部分是让不要直接显示这么多的点,而是直接显示成数字,比如这个区域有多少人,然后再点进去。但是我们觉得效果就没有这么震撼了,所以我们也一直保持这种方式。

解决方案 我们抱着试一试的心态集成了HarmonyOS的地图能力,也就是大家说的花瓣地图。我们同样使用相同的方式将每天的1万个图加到地图上,你猜如何?到晚上也能打开了!这充分说明了鸿蒙的地图性能有多强!

关于集成华为这个地图能力可以参考官网这个链接

集成华为地图能力

我重点给大家演示下便了么里面是如何把这些点显示在地图上的

设置地图的初始化位置,我这里拿到我的用户最近一次便便的位置,这样地图打开时默认就会以那个点位为中心,这样他上次是在成都拉的便便,不会下次打开,给他默认到北京去。

  aboutToAppear(): void {

    let position = getLastBianLocation()

    // 地图初始化参数,设置地图中心点坐标及层级
    this.mapOptions = {
      position: {
        target: position,
        zoom: this.chooseIndex == 0 ? 5 : 10
      },
      dayNightMode: mapCommon.DayNightMode.NIGHT
    };

    // 地图初始化的回调
    this.callback = async (err, mapController) => {
      if (!err) {
        // 获取地图的控制器类
        this.mapController = mapController;
        this.mapEventManager = this.mapController.getEventManager();
        let callback = async () => {
        }
        this.mapEventManager.on("mapLoad", callback);
      }
    };
  }

然后在页面build方法里面进行地图组件的初始化

build() {
    Stack({alignContent: Alignment.Top}) {

      // 调用MapComponent组件初始化地图
      MapComponent({
        mapOptions: this.mapOptions,
        mapCallback: this.callback,
        customInfoWindow: this.customInfoWindow
      }).width('100%').height('100%');

好了,重点来了!因为我的数据都是要从服务器去拿的,如果你一次把10万以上的信息都拿过来,那先不要说地图能不能一下处理过来,光服务器就扛不住了。所以这里我也是分页获取的信息,然后进行手动分页信息的获取,再把每页的头像信息分批次加点到地图上去。

先在页面加载的时候也就是onAppear方法里面异步获取服务器第一页的数据

        this.bianTotal = await BianMapApi.getWorldMapBiansCount()
        this.pageCount = this.bianTotal.last_bian_page_count

        if (this.pageCount > 0) {
          this.getPageData(1)
        }

这里是取单页数据的方法

  async getPageData(page: number) {
    if (page <= this.pageCount) {
      this.pageData = await BianMapApi.getWorldMapBiansPage(page)
    }
  }

然后我监听pageData数据的变化,如果数据取到了,我就调用我的pageDataChange回调方法

  @State @Watch('pageDataChange') pageData: MapBiansModel = new MapBiansModel()
  async pageDataChange() {
    for (let i = 0; i < this.pageData.bians.length; i++) {
      let bian = this.pageData.bians[i]
      let headImgUrl = bian.headimgurl.replaceAll('"', '')
      if (headImgUrl.length > 4) {
        try {
              let userBian = new UserBianModel()
              userBian.headimgurl = headImgUrl
              userBian.nickname = bian.nickname
              userBian.endTime = bian.endTime
              this.drawOneUser(userBian, bian.latitude, bian.longitude, pixmap)
            })
        } catch (e) {
          console.log(e)
        }
      }
    }

    if (this.page < this.pageCount) {
      // 最后一条,取下一页
      console.log(`page=${this.page}`)

      let t2 = setTimeout(() => {
        this.page++
        clearTimeout(t2)
      }, 100)

    }

  }

在上面那个方法里面会将一页的数据的放到地图上面去,然后放完后,会将page加1,这样在page变量上的监听函数会继续取下一页的数据。

具体的在地图上加图片的方法很简单

  async drawOneUser(bian: UserBianModel, latitude: number, longitude: number, headPixelMap: image.PixelMap) {
    let infoStr = getMapInfoStr(bian)

    let markerOptions: mapCommon.MarkerOptions = {
      position: {
        latitude: latitude,
        longitude: longitude
      },
      rotation: 0,
      visible: true,
      zIndex: 0,
      alpha: 1,
      anchorU: 0.5,
      anchorV: 1,
      clickable: true,
      title: infoStr,
      flat: false,
      icon: headPixelMap
    };
    await this.mapController?.addMarker(markerOptions);
  }

好了,这样就可以把你想要的大量的图片加到花瓣地图上了,你可以自己去玩玩鸿蒙版便了么的每日便便地图,体验一下花瓣地图的强大!


更多关于HarmonyOS 鸿蒙Next 使用花瓣地图显示10万 个头像的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next 使用花瓣地图显示10万 个头像的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对《HarmonyOS 鸿蒙Next <便了么>APP开发技术分享一 —— 使用花瓣地图显示10万+个头像》的帖子,以下是专业回复:

在HarmonyOS鸿蒙Next环境中开发《便了么》APP,并集成花瓣地图以显示大量头像,关键在于优化地图渲染和头像数据管理。

首先,确保使用花瓣地图SDK的最新版本,以充分利用其性能优化和API改进。在地图上显示大量头像时,应考虑使用标记聚类技术,以减少地图上的标记数量,提高渲染效率。聚类技术可以将附近的多个头像合并为一个,当用户缩放地图时,聚类会自动解散,显示单独的头像。

其次,优化头像数据的加载和管理。可以使用分页加载策略,根据用户当前位置和地图缩放级别,动态加载和卸载头像数据。同时,利用缓存机制减少重复加载,提高数据加载速度。

最后,注意内存管理和性能监控。在显示大量头像时,应用可能会消耗大量内存和CPU资源。因此,应定期监控应用性能,及时释放不再使用的资源,避免内存泄漏和性能瓶颈。

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

回到顶部