G地图轮廓数据抓取方案
数据源:Google H5地图
目标任务:获取Google地图上的所有的轮廓数据
目标样例:
抓取截图中红色轮廓的经纬度
抓取方案综述:
- 通过搜索或者详情页获取待抓取数据的名称、轮廓中心点经纬度坐标和FTID,名称
La Colonial -12.050764599999999 -77.095297 0x9105c9513f30a26b:0x622a840723a69bcc
- 通过经纬度坐标计算中心点所在的瓦片坐标tileX,tileY,计算瓦片坐标的时候使用的zoom参数因轮廓大小而异,如果不能确定轮廓的大小,建议使用14z,然后把中心点附近的瓦片都抓取下来然后拼接为13级的瓦片(直接抓取13级可能会导致抓取不到轮廓)
- 通过步骤2的瓦片坐标计算瓦片的左上角的经纬度坐标和像素坐标,计算的过程需要通过墨卡托坐标进行过度。
- 通过瓦片坐标和FTID抓取对应的轮廓瓦片,抓取链接模板
tile_url = "https://www.google.com/maps/vt?pb=!1m5!1m4!"
tile_url += "1i%s!" % zoom + "2i%s!3i%s" % (
tileX, tileY) + "!4i256&pb=!2m36!1e2!2sspotlight!8m33!1m2!12m1!20e1!2m7!" + "1s%s" % (
urllib.parse.quote(
FTID)) + "!2z6Iux5Zu95Lym5pWm5qKF6LS55bCU!4m2!3d51.511626899999996!4d-0.147806!5e1!6b1!13m13!2sa!18m7!5b0!6b0!9b0!12b1!16b0!20b1!21b1!22m3!6e2!7e3!8e2!19u12!19u14!19u29!19u30!19u61!19u70!20m1!1e6!25i1629785901&pb=!3m10!2szh-CN!3s!5e1249!12m1!1e3!12m4!1e68!2m2!1sset!2sRoadmap!4e0!5m3!1e3!7m1!1b1!23i1381938!23i1371340!23i1381033!23i1368782!23i1368785!23i1385853!23i46990830!23i1375050!23i4536287"
该链接可以获取到一个webp格式的只有轮廓的瓦片图像。
- 将抓取到的webp格式的轮廓瓦片转换为png格式,然后使用opencv提取轮廓坐标,注意这里需要保证瓦片的轮廓完整,否则提取的轮廓会把上下轮廓放到一个层级。并且如果只取第一个轮廓会把中间的空洞漏掉,但是建议只取第一个,后续可以优化轮廓提取算法。
- 通过步骤5得到的轮廓的像素位置以及步骤3得到的瓦片左上角的像素坐标,可以计算轮廓上每个点的像素坐标
- 将步骤6的像素坐标转化为经纬度坐标,形成的轮廓即为所需的结果。这里的轮廓是被抽稀的结果,可以调整参数识别所有的轮廓
补充说明:如何获取行政区划名称和ID
秘鲁的区划样例
北京市的区划样例
广州市的区划样例
0 表示的也是区,比如中国地级市的区,如果是直辖市,这里就是空的。对于国外,这个应该也是官方区划中最小的一级。
1 和2看起来是一样的,从北京的例子看应该是门牌和街道
3表示区/城市
4表示邮政编码?或者对应的区编码?
5正常应该是州/省?
6表示国家缩写编码
抓取流程
- 抓取一个国家或者城市的所有谷歌POI,并获取详情页。
- 从详情页中抽取区划信息,即data[6][183][1]字段,最好记录下坐标
- 从2的信息中抽取区划名称和层级信息,并建立树状的区划层次。
- 将3获取的区划信息用做关键词去抓取区划信息,抽取区划的FTID和坐标,FTID 样例 0x9105ce55a118de35:0x6136f8e755ba3c18
- 根据区划的层次、坐标、FTID,计算它所在的瓦片坐标系。州/省(级别5)级别的轮廓建议抓取11级,周边9个轮廓拼成一个瓦片。区/城市(级别3)建议抓取13-14级的9个轮廓,最小的区(级别0)建议抓取14-15。其实这个和轮廓的大小有关,和区划的级别并不相关,所以可能需要每个国家先测试一下每个层次的区划抓取哪个级别合适。上述建议可能适合秘鲁。
- 根据FTID和坐标抓取带轮廓的瓦片的方式请参考该文档的第一部分。
- 利用轮廓提取技术提取瓦片中的像素位置,并反算经纬度坐标形成轮廓。
- 抓取交付什么?
- 所有POI的区划信息data[6][183]字段,由POI团队输出要抓取的区划层次,名称
- 区划POI的FTID,坐标中心点,名称
- 区划POI对应级别的包含轮廓的瓦片图像(每个区划应该是至少9个瓦片),并且需要给出对应的FTID,名称