本期投稿
作者:许新昆
Coding让交通更智能
网络上对高德POI接口的介绍仅限于能用的层面, 离好用还差很远. 本文通过实际案例, 分享一些技术细节, 以期提高获取POI的效率, 涉及ArcMap中渔网创建、路段抽稀取点以及OSM路网筛选等。
这几天有个需求, 需要获取全国高速公路收费站的POI数据, 全国! 这是非常大的一个范围, 而我们调用POI接口的次数是很有限的. 如何用最低的调用次数获取完整的收费站POI信息, 这里面其实有很多技巧, 下面将详细介绍。
先说下大家最容易想到的, 也是我以前常用的做法. 先选定所研究的区域范围, 用经纬度矩阵表示, 如起点119, 26; 终点119.5, 26.5, 表示地图上左下角为起点左边, 右上角为终点坐标所围起来的一个矩形, 然后把这个矩形用ArcMap的创建渔网工具 (数据管理工具–采样–创建渔网) 切割得到等间距的M*N个小矩形(见下图), 高德对矩形大小有限制, 不能太大, 我一般取1KM, 然后把这些小矩形当作高德POI接口多边形搜索中的polygon参数, 逐个查询. 这种方法理论上可行, 但是很笨, 以1km间距来算, 得生成几千万个小矩形, 意味着得调用接口几千万次. 这种方法过于费时费力不可取, 必须得优化。
图1 渔网工具生成polygon矩阵
我们知道, 收费站必然位于高速公路沿线, 因此如果能沿着高速公路连续、均匀地取出点坐标, 再以这些点为中心, 再调用POI接口, 则可过滤掉无关区域, 调用次数将大幅降低. 因此现在的问题是: 如何连续均匀地取得高速公路的经纬度点坐标。
连续均匀地取得高速公路的经纬度点坐标, 通过以下几个步骤实现:
1. 用OSM路网提取高速公路线路段。
OSM路网矢量数据用FCLASS表示路段的道路类型, 取motorway和 motorway_link即可筛选出高速公路线数据。
图2 OSM高速路网
图3 OSM高速公路部分路段记录
2. 根据路段数据(矢量线数据)得到经纬度点坐标。
取出所有线数据的起点和终点, 汇总到一个点要素集合, 然后把坐标相同的去掉, 不同点仅保留一条记录. 可以看到, 这些点比较密集(图中为福州市区, 有1000多个点), 还需进一步去除点.
图4 高速路段起终点集合
3. 一定间距内, 只保留一个点.
间距我取得是20km, 即在方圆20km内, 仅保留一个点. 这里数据量不大, 可以直接用ArcMap的工具实现. 这里介绍下ArcMap工具的实现方式, 打开工具”数据管理工具—常规—删除相同项”, 勾选shape, 然后在XY容差输入框填入20KM, 点击确定, 即可实现上述效果. 大家会发现, “删除相同项”这个工具并不只是删除真正相同的项目, 也可以删除与地理元素shape距离处在一定范围内的记录, 而且这个距离是可以手动灵活定义的. 我认为这才是这个工具的真正强大之处.
处理完毕后, 视野范围内只剩3个点.
图5 用“删除相同项”工具实现点抽稀
至此, “连续均匀地取得高速公路的经纬度点坐标”的目标实现. 大家可能会好奇, 原来有1000多个点, 现在只剩3个点, 够用么? 答案是够!
最后, 我们不用高德POI接口的”多边形搜索”, 改用”周边搜索”, 周边搜索以一个点为中心, 所有半径为radius范围内能覆盖住的元素, 按官方接口规则radius最大可以取50KM, 则以上述3个点为圆心, 画3个半径为50KM的圆, 即可覆盖住高速沿线所有的收费站!
根据上述方法, 我得到了全国范围内的5000多个点, 以这些点为圆心, 半径取50km, 只调用5000多次高德POI接口(周边搜索), 就成功获得了全国26383个收费站的POI数据.
图6 全国高速公路收费站
授人以鱼不如授人以渔, 渔已经分享完毕, 鱼也分享给大家, 全国收费站POI下载方式: 关注城市数据派微信号,在微信号中输入“ 0112” ,即可获得获取方式.
数据详情:
范围: 全国(大陆)
数量: 26383个收费站. 注: 大多数收费站分出口和入口两个点
收费站类型: 高速公路收费站+其它国省干道收费站
字段: 高德POI编号, 收费站名称, 出/入口方向, 所属省市县, 经度, 纬度等
坐标系: 高德坐标系
作者个人微信公众号: 数牍小点子, 欢迎交流.

原文始发于微信公众号(城市数据派):【数据分享】如何高效获取POI?以全国高速公路收费站为例丨城市数据派