最近工作中碰到了海量点绘制需求,由于坐标点的数量级达到了200多万,研究过程耗费了不少的时间。最后完成了这项需求,还是很开心的。总结一番吧~
-
关于选用SDK遇到的坑
- 海量点绘制高德的SDK提供了海量点绘制接口。这个功能是在5.2.0版本开始的是我目前使用的绘制方式。
- 百度地图SDK提供了覆盖物功能,而并没有这样海量点的绘制功能,我使用百度SDK绘制到20多万坐标点数据时,界面会变得非常卡顿。移动一下都举步维艰...
- 百度web版提供了海量点绘制。使用oc与js交互的方式,加载web版的百度地图进行海量点绘制,我尝试过加载200多万坐标点,这种情况下界面流畅度比直接使用SDK好很多。
-
关于使用高德SDK绘制时遇到的坑与解决办法
-
使用高德地图海量点,官方建议坐标点数量在10万左右。目前我认为是一个海量点对象最适宜添加10万坐标点。(实际上我最多时添加了20多万)。这里想说明的坑是,引起界面卡顿最主要的原因是由于界面上加载了太多的对象,导致帧率偏低。所以请尽量将坐标点放入一个海量点对象中。
- 加载数据并绘制UI的过程,是一个很吃内存的过程,需要在didReceiveMemoryWorning中做好内存释放工作。避免崩溃问题。
-
-
具体实现思路 :
- 加载点的过程一定是要在子线程中进行。
- 子线程的开辟会占用一定的内存,并且需要绘制的点越多,内存占用量就越大。建议采用递归方式处理线程的开启与销毁,我的做法是通过for循环进行点的解析与加载的。
- 首先解析文件,将文件中的点放在一个数组中。使用for循环遍历这个数组。
- 设置一个循环最大次数值n,让for循环n+1次,保存每次遍历得到的点。判断当for循环达到最大次数,则将当前循环得到的点进行一次绘制。并跳出循环,并将这些绘制过的点从数组中移除。
- 之后将剩余点个数与最大次数进行比较,大于最大次数,开辟新的子线程,使用递归方式,开始新一轮的绘制,直到小于等于最大次数时,则将剩余点一次性添加到地图上。这样就可以有效的控制内存占用。
之后会写一个Demo供参考.