背景
在公司商家参谋项目的开发过程中,场景是根据选取的活动城市选项,展示对应的简易行政区地图。

大概有700+城市。如果把所有的城市文件都下载下来打包到项目中,会导致项目体积过大(几百兆),并且以后可能会频繁增加活动城市。所以想通过某些服务按需引用对应城市的地图数据。
先是对比了几款图表绘制工具,Echarts,D3都可以根据地图边界数据绘制地图,并且提供了丰富的交互与细节的处理。但是都需要从第三方获取地图边界数据,因为它们是图表绘制,不提供获取地图边界数据的服务。
然后看有没有现成的地图服务可以直接获取地图数据,就调研了百度地图和高德地图。
一.高德地图 DistrictExplorer
这里需要用到插件geo/DistrictExplorer,查看DistrictExplorer所有属性和方法


用Echarts和geo数据绘制地图,因为有定制化浮层与自定义样式,所以配合Echart可以更加高效地达到想要的效果。

但是公司只和百度地图有合作,如果使用个人开发者权限可能会涉及到法律问题。
而且个人开发者每天的行政区查询日配额最高只有3w上限,而项目需求预估每天PV有5w+,所以只有成为企业认证开发者才能获取更高上限。
二. 百度地图 Boundary
在百度地图中没有找到和高德地图DistrictExplorer类似的工具,但找到最接近的Boundary类,可以返回一个行政区域的边界。
这个类通过调用自身的get方法,参数是行政区域名和回调函数。获取到非标准的边界数据。


调用boundary实例的get方法,得到的rs.boundaries是一个非标准的geo数据字符串,二维坐标点之间用分号分隔。

可得到这样可以绘制外边界的数据

如果想用Boundary提供的数据源绘制含有子级行政区域的地图,可以通过遍历其子级行政区域的名字,循环调用get方法得到所有的子级行政区的数据,再把所有数据进行改造,拼接成标准的geo数据,提供给Echarts直接使用。

但是这样的缺点也是很明显的,请求次数多,增加服务压力,另外还需要拼接数据。
另外本次需求的城市并不是真正的城市,而是把所需要的地级市,县级市和县打平构成了抽象概念的”活动城市“,数据中也只有“城市“名和业务ID,如果直接使用“城市”名作为Boundary的get方法的参数,得到的行政区域边界数据可能与预期不符。
所以最后的解决方案是通过阿里云的一个可以下载geojson的工具,将全国所有级别的包含直接子级行政区域边界数据拉到我们自己的库,提供自己的服务。通过映射表将“活动城市“和真实数据对应上。
最好的解决方案其实是利用高德地图拉取数据,通过定时任务定时拉取数据更新本地服务中静态数据,如此既可以避免了高德每天限制的问题,又可以利用高德强大的数据源提供数据服务。
网友评论