摘要:
带体量(面积、体积及其他性质)的POI数据无疑是研究城市功能区域的有力工具。本次编写了一套脚本,辅助人工来完成POI体量信息(AOI)的获取,虽仍然需要人工操作,但简化了不少。
(太长不看,拉到底下3rd-4rd即可)
最终效果:
图 1最终数据效果(自绘)
-1st- 概述
POI(Point of Interest)数据是识别城市区域的有力工具, 以往常用的是点位信息,用来查看各类城市功能的聚集程度,但忽略了功能区的面积、体积、性质等等内容,而很难反映真实。AOI(Area of Interest)数据是对POI数据的有益补充,百度、高德、天地图等电子地图花费了大量的力气将城市各功能做了边界界定(颜色区分),比如高德地图搜索某个医院时,会圈一个红色区域来表达医院范围(还有相应的建筑形态),但是百度、天地图都只是显示点位。
我一直觉得,这个数据是很有必要的,而且是可以获取的。如果是传统方式,那路子就是——下载地图,然后手工描图——因为这是电子地图们公开显示的信息
——但是,你们也知道,我非常,非常,非常不喜欢描图(现在知道一下也可以)
于是一直存了一份要写一个脚本来获取AOI数据的心思。
前几天正好有个同学问我这方面的事情@SKkkkkk,“择日不如撞日”,于是便花了1-2天时间,写了这套脚本——能获取到数据,效率的话,只能说比人工稍微快一点,仍然需要人工操作配合(也是无奈)
获取数据源为仅“开放”的高德地图
(求高德不要不开放这个数据了,学百度、天地图他们,虽然我很可以理解大家对于自己辛苦整理的数据库的保护,但是即使不以边界的形式开放这个数据,但也可以通过下载下来人工描的方式获取到——这不是另一种形式的开放吗?既然如此何必不“与人方便”呢?如果说,怕非正规数据爬取,徒增服务器压力,那可以将这种行为限定在一定范畴之内的,望如是//祈祷表情)
-2nd- 编写思路
网络上有早些年获取AOI数据的接口,比如高德地图的这个:
https://ditu.amap.com/detail/get/detail?id=(……)
但是这个接口,直接调用,没有几次就会返回乱码。
而且你在地图界面上,连续点击10次左右,就会显示滑块让你休息一下,之后再连续点击10次左右,就会显示让你休息一下再访问的页面(没有滑块验证,只能等着)——这个也是脚本编写完才发现的(但是有应对机制,不用担心)
《——这些都是高德地图的反爬取数据的机制
很可惜,没有挡住我“不想描图”的强烈诉求
(受前人经验启发)我按下F12,切换到浏览器后台[网络]监控窗口,随便在地图上点击了某个功能区域,发现仍然是这个接口,它!返回了目标数据(甚至还有更加详细的信息,比如住宅功能区是多层住宅、有多少个停车位等等,后期自行探索好了)。
如天安门
……
Shape: “116.396685,39.910178;116.398139,39.910215;116.398148,39.910211;116.398152,39.910201;116.398206,39.908596;116.398196,39.90859;116.398186,39.908587;116.397976,39.908572;116.397966,39.908561;116.397995,39.908288;116.397987,39.908277;116.397832,39.908257;116.397814,39.908247;116.397841,39.907983;116.397836,39.90797;116.397829,39.907965;116.39717,39.907949;116.397163,39.907956;116.397155,39.907969;116.39714,39.908231;116.397131,39.908235;116.396982,39.90824;116.396973,39.908244;116.39695,39.908515;116.396941,39.90852;116.396769,39.908519;116.396758,39.908525;116.396675,39.910163;116.396677,39.910175;116.396685,39.910178”
……
一切都开始变得简单起来(并不是…………)
这个机制是这个样子的(不要觉得我是傻子)
图 2高德地图网络通信(自绘)
因为不知道怎么批量筛选导出浏览器后台[网络]监控窗口的数据,所以我想到了专门的抓包[1]软件Fiddler。
图 3 Fiddler工作原理
果然不负众望
总结一下数据获取思路:
- 确定要获取AOI数据的POI名称
- 在高德地图上搜索该名称
- 通过人工点击的方式请求AOI数据,并用Fiddler抓包
(↑很累的人工部分,不过你有什么办法呢)
- 解析抓包数据
- 导入ArcGIS生成形状面
确定了要编写的脚本/制作的工具:
(1-3)步的辅助脚本,希望的是不要不停地切换电脑窗口,来复制POI名称
——可能是一个html
(为此我还去补了CSS语言的知识,欸HTML、JavaScript、CSS这次是学全了,不过仍然是半吊子的,太难啦)
(4)步的解析脚本
——用python解析json
(5)步的ArcGIS模型工具
-3rd- 脚本使用
共享文件夹下包含三个文件:
1-Fiddler Everywhere 1.5.1.exe(安装包)
2-GetAOI.html(辅助脚本)
3-FormatAOIData.exe(解析脚本)
RoutesDraw.tbx(绘制工具)
因为比较复杂,所以录制了一个操作演示:
文字版:
1. 确定要获取边界的POI名称(爬取、地图搜索皆可)
2. 安装并运行Fiddler软件,开启抓包(capture)
* (首次安装需要管理员身份运行,并在右上角设置-HTTPS中点击“trust https root”)
3. 在地图中搜索并点选目标数据(地图需显示选中边界区域)
4. 完成区域选择后,在Fiddler中筛选目标数据,然后导出(保存格式为Raw File)
* (header筛选地址:ditu.amap.com/detail/get)
5. 使用提供的FormatAOIData程序处理导出文件
* (FormatAOIData程序需与导出文件夹在同一目录下(会自动定位到get文件夹下的detail文件,即储存各个AOI数据的文件)
-4th- 获取方式
后台回复“资源素材共建计划“
数据获取脚本文件夹下
RoutesDraw.tbx
子文件夹下:AOI数据(POI边界)获取脚本
不知道高德还会开放多久的数据
且用且珍惜
这个思路还能获取很多其他的数据
且行且看看
[1]抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。(百度百科抓包词条)