前言

在地图相关应用的开发中,我们常常遇到一个问题,当地图标注点过多的时候,会造成用户体验差、应用卡顿的情况。所以,我们需要一套高效的算法来解决标注的聚合、分散的逻辑。

先上代码:

算法思想不局限于平台,如果你是Android开发者,大可浏览思路,然后看高德地图的示例C代码

分析

接下来一步步分析整体解决方案。

1、地图上标注显示逻辑

为了保证规律性和平均分配,采用区域划分方法显示标注。简单来说就是把屏幕分割成若干个区域,每个区域最多显示一个标注,然后根据地图缩放比例动态的设置这些区域的大小以达到最佳的用户体验。

2、为何要引入四叉树

如果有100条数据,我们可以嵌套循环找到合适的点放入相应的区域,循环10000次,如果有10000条数据,可能我们的操作系统就要抓狂了。这种计算方法是低效的,时间复杂度至少为O(n^2)。

所以,这里引入四叉树是必要的,它非常适合这个场景,看一张百度百科的图:

四叉树图解

我们将数据逐个放入这个树状结构(具体做法DEMO中有,本文只说思路),给每一个节点(可以想象成树干)一个范围,如图上所示。这个范围对于我们的需求来说是至关重要的。

3、如果从四叉树查找出需要的标注

首先,我们要理清一个逻辑,如果数据量很大,构建四叉树仍然需要一些时间,但是这个时间是我们允许的,相信你也不会频繁的请求大量标注数据。

关键问题就是在用户拖拽旋转结束的时候,我们需要调整我们界面的显示UI,也就是说,关键问题就是从这个四叉树里面查找出需要的标注,这部分的速度至关重要。

主要逻辑:

第一步:遍历屏幕划分的区域

第二步:比较该区域是否和四叉树元素范围有交集,无交集则舍弃,有交集继续向下查找

如此,时间复杂度被极大的降低。

优化:我对查找逻辑做了小优化。在第二步的时候,如果有交集,给是否继续向下查找做了一个开关。理由是,我们查找出所有在该划分区域内的标注,如果目的只是为了算出他们的平均中心点,就显得意义不大,大可查找出几个就停止查找。下面是大致的时间复杂度区别:(主要看‘查找标注次数’,执行效率在demo业务逻辑少的情况下看不出太大的区别而且浮动较大)

优化前

优化后

注意:由于地图是可以旋转视角和方向的,这两者变量决定了地图的处理需要格外的谨慎。地图的经纬度不能按照正常的坐标系来理解,通常采用经纬度范围来就行比对,所以进行经纬度复杂计算的时候不要企图全部转换为屏幕pt坐标系来计算。

四叉树算法:iOS地图点标记聚合方案相关推荐

  1. iOS 地图与指南针使用方案

    CoreLocation框架 定位(iOS8.0- iOS8.0- 的定位实现 设置授权说明(段子写得好,用户授权的概率大) 设置位置更新的距离过滤(防止过于频繁的调用代理方法) 设置定位精度(精度越 ...

  2. 算法:根据四色定理(Four color theorem),求出地图的所有着色方案

    地图着色,需要每一个区域都使用一种颜色来进行填充,然后为了与相邻接壤的区域分开,就要求两个接壤的区域需要使用不同的颜色.四色定理的意思是,最多只需要四种颜色,就可以为所有的地图进行全部区域着色,且任意 ...

  3. 百度地图 标记聚合器MarkerClusterer结合TextIconOverlay,根据标记点的属性更换聚合器的样式

    一.问题 公司的项目中在百度地图上生成了成千上万的点,所以使用了标记聚合器MarkerClusterer来处理海量点,但是每个点根据异常类型,分为正常(绿色)和异常(红色),这时如果用了聚合器,只有没 ...

  4. 急速收藏:4套iOS SDK的H5打通方案

    在介绍 iOS SDK 的 H5 打通方案之前,我们先了解一下什么是 App 与 H5 打通. 所谓 "打通",是指 H5 集成 JavaScript 数据采集 SDK 后,H5 ...

  5. 地平线:发布线NavNet众包高精地图采集与定位方案,牵手韩国最大通讯企业 | CES 2019...

    今年的CES,有关于自动驾驶的讨论比往年冷静了许多,但依旧是担纲主角之一.在本届的CES上,定位为Tier 2 的地平线机器人也带来了自己对于自动驾驶的思考和成果. 地平线创始人兼CEO余凯认为:在 ...

  6. ios 地图 省市轮廓_iOS 14中的新增功能:视觉轮廓检测

    ios 地图 省市轮廓 WWDC20 (WWDC20) Apple's WWDC 2020 (digital-only) event kickstarted with a bang. There we ...

  7. android版 地图标注物聚合

    本程序根据地图zoom大小来聚合标注物,clusterer标记聚合器用来解决加载大量点要素到地图上产生覆盖现象的问题,并提高性能,本代码为android版.

  8. 高德地图聚合android,GitHub - lingyanluoxue/android-togetherMap: 实现高德地图的marker聚合功能...

    android-togetherMap 本文我将讲解一下我最近实现的高德地图Marker的聚合功能.在项目开发中需要使用到地图Marker的聚合功能,但是高德地图并没有实现对Marker的聚合功能,所 ...

  9. php微信地图定位导航,微信公众服务号下实现地图语音导航的方案

    微信公众服务号下实现地图语音导航的方案 如何在微信公众号里面实现多商家用户,店铺详情页的语音导航功能这个问题一直困惑着我. 现在有一个解决方案供大家参考. 具体步骤如下: 1.打开:http://ma ...

最新文章

  1. mysql cronjob 备份_了解cron以及使用cron定时备份MySQL
  2. linux fcntl注销信号,fcntl · Linux C API 参考手册 · 看云
  3. Web应用漏洞评估工具Paros
  4. Python基础day04 作业解析【3道 字典题】
  5. 4 Git 分支 - 分支开发工作流
  6. iOS 动画基础总结篇
  7. 全面拥抱 FastApi — 多应用程序项目结构规划
  8. 使用Visual Studio开发游戏——微软宣布与Unity、Unreal Engine和Cocos展开全新合作
  9. 阿里巴巴美股股价大跌:创在美上市以来最大单日跌幅
  10. vue项目中更新element-ui版本
  11. 使用jquery.cookie操作Cookie实例
  12. java系统参数表有哪些_Java 设置系统参数和运行参数
  13. SPSS视频教程大合集
  14. 阿里云 vs Azure-大数据
  15. BH1750光强度传感器Stm32f103驱动(已测试ok)
  16. Python之解决tkinter.PhotoImage不显示图片的问题 Python3
  17. [答疑]举报卖家、举报买家还是举报
  18. C# 打印小票 POS
  19. 【图像复原】RDN论文详解(Residual Dense Network for Image Restoration)
  20. 真机最小化安装centos7 网卡驱动

热门文章

  1. windows下搭建Vue手脚架
  2. JAVA与海康威视人脸机对接,使用ISUP方式
  3. wildfly服务启动,关闭
  4. 使用icomoon引入字体图标及扩充字体图标的方法
  5. 科技创新如何托举湖湘未来?岳麓峰会夯实“长沙厚度”
  6. 泰坦尼克号python数据预处理_sklearn preprocessing 数据预处理(OneHotEncoder)
  7. EMQ-保留消息 概述和案例
  8. 什么是局域网域名?如何解析?
  9. Redis是什么?Redis有哪些数据类型?Redis怎么集群?
  10. 威纶触摸屏与三菱PLC的以太网通讯