黑科技 | 百度地图抓取地块功能(上)-百度众包任务平台
进行城市更新设计时,常常需要对于现有城市各个地块的功能属性进行分析。这样一张图片可谓是简明扼要地概括了整个城市的功能分布:

而且这张图在GIS / Rhino的矢量空间内,可以无限放大,且每个地块均携带有相应的地理信息。

想知道如何通过抓取在线地图数据,自动生成这样的一张城市地块功能分布图,你首先需要了解两个在线地图的重要概念:POI和AOI。POI(point ofinterest),即在线地图检索的对象之一 “兴趣点”,大家或许都知道。但AOI(area of interest)又是什么呢?
举个栗子:
百度地图搜索“清华大学东门”,你会得到一个【带数字的小图钉】;而搜索“清华大学”,则会得到一个【蓝色区域面】+【带数字的小图钉】。小图钉是POI,是地图上的一个点。而蓝色区域面是AOI,是地图上的许多个点按顺序连成的区域面。

一般面积比较大的地点都有AOI信息,比如学校,小区,购物中心,医院,政府机构大院,公园,甚至一些大的写字楼也会有AOI。越是大城市信息越全面。

理论上,只要AOI信息足够多,可以生成一张描述城市各个地块功能属性的色块图,极大节约读者做城市设计时前期分析的时间和精力。
干货开始之前高能预警
本文不需要代码基础,但适合喜欢动手研究的朋友。如果你没有这个闲心,还有3条免费获取国内城市AOI的方法:
1. C君之前写过一篇推送 黑科技 | 爬取百度地图及矢量化 提供了一个年久失修不反爬的入口。里面提供:地铁/医疗设施/教育设施/景区 四个类别的AOI数据,可以参照推送文章,举一反三自行获取。缺点是AOI类别较少,且不带文本信息。
传送门:http://wiki.lbsyun.baidu.com/custom/
2. GIS大师兄有个地图信息下载器,其免费版可以下载2km x 2km范围内的aoi 信息,缺点是对于大面积城市规划来说范围太小。而付费版1k+,对于非公司报销的使用者来说还是太贵了。
传送门: http://www.gisdsx.com/
3. 百度/高德地图开放平台自定义编辑+矢量化(Rhino矢量化方法见推送 走捷径 | 你大概想不到的矢量地图获取方法)。缺点也是单次获取范围太小,且不带文本信息。
我是干货分割线
干货部分的主体结构如下:
一.我只想用
1.爬虫获取数据
2.GIS可视化
3.Rhino可视化
二.我想了解代码原理
1.POI检索解析
2. 递归划分搜索框
3. AOI检索解析
4. 坐标纠偏
5. 异步爬虫
因为内容较多,且小硬核,分为上下两篇。本文只包含【我只想用】的内容,代码原理有空再更。

【爬虫获取数据】
1.1. 获取代码+修改参数
关注公众号CforChaos混沌设计,回复“aoi”获取代码网盘链接,将:
Get_AOI.py
AOI_Query.py
CoordTransform.py
这3个文件下载后放到同一个文件夹内。

在某个Python编辑器中打开代码文件:Get_AOI.py,开始根据具体需求更改9-19行的参数。
编辑器好用程度排序:
pycharm/eclipse等IDE> Rhino自带python编辑器 > GIS自带python编辑器=记事本
大家可以根据自己电脑上有的软件情况酌情选择打开方式,记事本和GIS自带的python编辑器没有行数编号,你要自己数行哈哈。C君为了照顾部分画图狗读者昏花的老眼,还是对着pycharm的界面讲解代码吧。

可以由百度坐标拾取系统获得,传送门:
http://api.map.baidu.com/lbsapi/getpoint/index.html
13行——百度地图个人开发者的应用秘钥秘钥本身是免费的,做个城市设计的爬取量和频率一般也达不到需要付费的级别(除非你要做全国所有二三线及以上城市的横向对比图,那就只能给百度充钱了)。
步骤为:
1.注册成为百度地图个人开发者,并申请应用秘钥
传送门:http://lbsyun.baidu.com/apiconsole/key
创建应用时注意:【应用类型】选【浏览器端】,【白名单】填【*】。

2.上传身份证认证身份,传送门:
http://lbsyun.baidu.com/apiconsole/auth#/results
注意:这步非常重要,认证前后的个人用户日配额差别很大。
14行——导出文件的存放路径。从windows文件资源管理器地址栏复制的地址,需要将所有“\”替换为“/”,末尾再添加一个“/”。
例如“J:\0_weixin_tutorial\get_aoi\test_output”,
应改为“J:/0_weixin_tutorial/get_aoi/test_output/”,否则python无法读取。
15行——输出坐标类型选填True或False
True则输出为wgs84坐标(真实大地坐标系,GIS用)
False则输出为百度墨卡托投影坐标(与百度在线地图偏移一致的投影坐标系,Rhino用)。
坐标转换算法声明:
百度地图服务器端抓取的AOI地理信息为【百度墨卡托投影坐标系】,脚本内置了【百度墨卡托】>【BD09】>【wgs84】两重转换可供选择。
【百度墨卡托】>【BD09】算法来自:(原文java,C君手工转译python)
https://github.com/Talefairy/smart/blob/master/smart-java/src/main/java/com/gis/tools/BaiduMokatorToLngLat.java
【BD09】>【wgs84】算法来自:
https://github.com/wandergis/coordTransform_py
【百度墨卡托】>【BD09】经测试与百度服务器在线转换结果一致,可放心使用
【BD09】>【wgs84】未经过测试(依照相关法律,国内地图供应商不得提供wgs84坐标),但github星标数同类算法最高,准确与否待诸君验证。
16行——同时运行的最大线程数数字越大,同时运行的地块类型检索线程就越多。建议网速比较快时选择较小的线程数(比如thread_num=3)。网速如果非常慢,可以适当大点(比如thread_num=5或7)。
19行——抓取模式第一次运行时保持True不要动。
1.2.安装Python与相关库+运行代码
下载并安装Python(网盘链接里有安装包,你也可以上官网自己下,免费的),双击安装时注意如下图所示地勾选“Add Python3.7 to Path”(非常重要),然后一直下一步即可。

Win+R调出运行窗口,输入“cmd”进入命令提示符窗口,敲入“python”并回车,可以看到下图画面,说明安装成功。

保持网络畅通:
命令提示符窗口输入“pip install requests”后回车,python开始自动下载安装requests库;
命令提示符窗口输入“pip install urllib”后回车,python开始自动下载安装urllib库;
命令提示符窗口输入“pip install pandas”后回车,python开始自动下载安装pandas库;
命令提示符窗口输入“pip install gevent”后回车,python开始自动下载安装gevent库;
命令提示符窗口输入“pip install numpy”后回车,python开始自动下载安装numpy库。
安装完成后命令提示符窗口输入“python ”(即“python”+空格),将修改好的Get_AOI.py文件拖拽至空格后面并回车,程序开始运行。(应保证三个 .py 文件位于同一个文件夹)

1.3. 运行补丁,补全数据
同一个账号秘钥爬取过多过快时,百度服务器会进行随机丢包,导致许多POI、AOI不能被成功检索到。经测试,这种情况不能通过限制QPS低于百度官方文档QPS峰值避免,属于玄学范畴。因此,第一次全类型爬取之后,很有可能需要运行一次补丁脚本,以补全数据。
再次用某个python编辑器打开Get_AOI.py,修改第19行改变抓取模式。将toggle_mode= True改为False并保存。建议出去吃个饭午个休,再回来打开命令提示符窗口,拖拽运行修改后的Get_AOI.py文件(某次大量爬取之后,百度会对你限流一段时间,我也不知道这个时间具体多长,取决于百度服务器那天忙不忙了)。
*注意:如果patch后结果没有增加,有可能是你第一次爬取的范围并不大,没有触发百度的随机丢包操作,可以放心进行下一步的可视化。

【GIS可视化】
打开导出文件存放路径,点击进入文件夹【aoi】,可以看到各个类型的AOI信息以csv格式存在于文件夹内。
这种格式的文件可以用Excel打开,打开后效果如下图:
——第1列为AOI序号
——第2列为AOI的uid值(相当于身份标识,每个AOI的uid是独一无二的)
——第3列为名称
——第4列为组成AOI各点的顺序(用于按顺序连线)
——第5/6列为各点的经度和纬度
此时GIS老司机们肯定已经清楚怎么搞了。不过C君还是给小白们简单科普一下:
* 声明:C君是学建筑的,GIS也是现学现卖。这里提供的未见得是GIS可视化的最佳方法。
2.1. Arcmap新建空白模板地图
2.2. 加载存储AOI信息的csv文件
-【Table Of Content】栏目下【Layers】右键选择【Add Data】
- 弹出窗口菜单栏选择【Connect To Folder】链接到 aoi导出文件夹
- 全选文件夹里所有aoi信息的csv,点击【Add】
操作截图如下:
2.3. 可视化AOI点
- 对csv文件右键选择【Display XY Data】
- 弹出对话框中【X Field】选【Field5】,【Y Field】选【Field6】,再选【Edit】
- 弹出对话框,【Geographic Coordinate System】选择【World】, 内部再选【WGS 1984】,选【确定】
操作截图如下:
经过上面的一系列操作,business_aoi.csv中包含的AOI点信息就全出现在地图上了。
2.4. AOI点导出至shp文件
- 对csv Events 右键,选择【Data】-【Export Data】
- 弹出对话框中选择一个你喜欢的路径,将名称改为地块功能名,储存为shp文件
- 储存完成后,弹出对话框选【Yes】,把刚刚储存为shp文件的数据加载回来
操作截图如下:
2.5. 按顺序连线
- 菜单栏选择【ArcToolbox】
- 弹出工具窗中选择【Data Management Tools】-【Features】-【Points ToLine】
- 弹出窗口【Input Features】选择刚刚导出的shp文件,再定义一下生成线的shp文件路径和名称
-【Line Field】选【Field2】,【Sort Field】选【Field4】,勾选【Close Line】, 点击【OK】即可
操作截图如下:
经过上面的一系列操作,我们会获得一个连线的shp:
2.6.线转面
- 回到【ArcToolbox】,选择【FeatureTo Polygon】
- 弹出对话框中选择刚刚生成的线shp文件,再定义导出文件名与文件夹,【XY Tolerence】可以不填,或者填一个极小数(如0.0000000001)。
操作截图如下:
经过上面的一系列操作,我们的AOI面已经填上色了:
2.7.调整颜色与连接属性
- 点击【Table of Contents】中面的图标,在弹窗中修改面的颜色。
- 面要素右键-【Joins and Relates】-【Join】
- 将面要素与csv文件连接,弹窗中从上至下依次选择:【FID】,csv文件,以及【Field1】
操作截图如下:
经过上面的一系列操作,AOI面已经设置成了需要的颜色,且与csv文件中的属性连接完毕,打开属性表即可看到各个面的名称:
2.8.重复步骤,加载全部类型
各类信息加载完毕之后,将无用的信息去除,可以得到如下所示的城市地块功能分布图。
【Rhino可视化】
Rhino可视化的步骤比GIS可视化要相对简洁,但同样也是【读取csv文件】-【连线】-【成面】的逻辑。这一步的grasshopp文件与代码一样,关注公众号CforChaos混沌设计,回复“aoi”获取代码网盘链接即可获得。
打开gh文件之前,首先应确保已安装Lunchbox。传送门:
https://www.grasshopper3d.com/group/lunchbox
打开gh文件,可以看到结构分成清晰的3块:
3.1.读取各类别csv文件
第一模块拆开详解:
3.2.近似中心归零
Rhino老司机们应该都知道,若一个几何体离远点过于遥远,Rhino显示会出现各种问题。而百度墨卡托投影的(0,0)点在赤道与零度经线交叉点上,通常与我们需要的城市片区相距甚远,因此应当进行一次中心归零。
当然这个中心归零并不要求太精确,因此C君偷懒地选用了B1的AOI数据点的x中位数与y中位数,作为归零点。之后可视化过程中,通过【点原生x值】减去【这个x中位值】,【点原生y值】减去【这个y中位值】,使得地图中心近似归零。
3.3.按顺序连线成面
第三模块拆开详解:
这就是最后得到的上海市AOI可视化全图,与百度地图的偏移基本一致。
扫描下方二维码,关注公众号 CforChaos混沌设计,后台发送”aoi“获得本文代码+gh文件
以上就是关于《黑科技 | 百度地图抓取地块功能(上)-百度众包任务平台》的全部内容,本文网址:https://www.7ca.cn/baike/19167.shtml,如对您有帮助可以分享给好友,谢谢。