弹指一挥间,ArcGIS笔记已经很久没有更新了。这里先给大家道个歉,由于前段时间赶项目,加之录python视频,因此耽搁了很久。这里需要说明的是,我们公众号会持续更新下去,希望大家多多支持。
我们知道,城市的中心一般是商业、商务高度发达,公共服务较为集中的区域。从市中心外围前往市中心享受各类公共服务是市民的重要权利之一。但受城市交通条件的影响,各区域前往市中心的交通状况差异较大。有效识别各区域前往市中心的交通时间,一方面有助于我们认识各区域交通状况,从而有针对性的进行区域交通条件改进;另一方面,有助于我们进行用地优化,从而实现交通与用地的协调。当然,前往市中心休闲、购物是我们年轻人最为重要的假日活动,在房价高涨的当下,选择交通条件优越、房价相对较低的区域是我们择居的原则之一,故研究城市中心交通时空圈也具有重要意义。本期应网友要求,带来城市中心交通时空圈的技术方法讲解。
本次案例城市选择成都市。首先,成都是我的家乡,我对成都有着深厚的感情(要整就整成都);其次,成都中心城区受自然条件影响相对较少,不像南京有紫金山,武汉有东湖、长江等自然条件的限制,网格之间可实现无差别的比较;最后,也是最为重要的,成都是环形放射网状的路网格局,不同方位的交通状况差异性并不十分明显,并且市中心正好位于几何中心,在交通条件差异不大的情况下,其交通通达绩效究竟如何?
第一步,我们需要获取研究区域的范围,以成都为例,我们获取了中心城区,包括天府新区的规划范围线。第二步,我们要将规划范围生成面,并生成网格(这里我们生成1000mX1000m的网格);第三步,我们要获取各网格中心坐标和市中心坐标(市中心选择天府广场中心);第四步,运用百度API获取各网格中心坐标至市中心坐标的时间(
http://lbsyun.baidu.com/index.php?title=webapi/direction-api
,不再具体解释,自己看参数)。第五步,空间可视化后进行相关分析,即可获得城市中心交通时空圈。
在对方法进行具体实施前,我想感谢网友web攻城狮之路。他编写了Python代码用于抓取路线时间,具体见
http://blog.csdn.net/taijiedi13/article/details/51279959
。我在其基础上结合规划师的思维逻辑对代码进行优化。主要的优化部分是运用arcpy来实现数据的自动更新。我猜想该网友并不是城市规划专业的,因此可能未接触过面向ArcGIS的arcpy,具体代码调整后面讲具体方法时会提到。为了让大家更清楚的了解流程方法,因此很多地方我是直接运用ArcGIS来实现,并未完全采用python。如果网友感兴趣,可以自己编写Python代码,来实现全过程的自动化。
第一步:获取范围。
这个不做过多介绍,你要研究,好歹有个基础的CAD范围线啊。别问我怎么找,发挥自己聪明头脑。找不到,自己拿豆腐撞头。
第二步:生成网格。
将线生成面后,对面进行坐标调整,调整为百度十进制经纬度坐标系。由于我们的研究范围大,因此位置大致准就行。建议在百度地图中找好参照点后,运用空间校正来实现。空间坐标准确后,用创建渔网工具来生成1000mX1000m的渔网。生成的文件有点与线两个要素,并将线生成面。最终,我们有了网格中心点与网格面两个我们需要的文件(图1)。
图1
第三步:获取坐标。
先讲下获取城市中心(天府广场)坐标。运用百度获取坐标系统工具(http://api.map.baidu.com/lbsapi/getpoint/index.html)可以轻松获取(图2)。
图2
接下来,讲下获取各网格中心点的坐标。打开点要素表,添加经度、纬度、时间3个字段(图3,时间字段为后续记录时间),并用计算几何命令分别计算中心点的坐标,计算是要选择十进制,X坐标为经度,Y坐标为纬度(图4)。
这样,我们就获取了起点(N各网格中心),终点(天府广场)的坐标。
图3
图4
第四步:获取时间
这一步骤为重点。在这个程序中获取百度API的时间函数get_time()为直接来自网友web攻城狮之路,这些代码我不做介绍,我只给大家讲下我调整的代码(图5)。我将他的run()去掉,用数据访问模块的UpdateCursor来实现数据的自动更新。在网友web攻城狮之路的代码中,需要将点坐标统一封装到excel文件中,然后再读取每一个坐标,最终还要将获取的时间再写入excel文件。而且最终生成的时间数据还要导入ArcGIS进行空间可视化。过程过于复杂,而且比较繁琐,这一步骤完全可以运用Arcpy中的UpdateCursor来高效实现。
图5
考虑到百度起点坐标的引用规则(纬度在前,经度在后),我们用变量coord来存储每一个坐标数据,并调用get_time()来获取时间数据。由于获取的时间为秒,而我最后想用分钟来表示,所以代码53将秒数据改为分钟数据。在代码测试过程中,我遇到了JSON数据报错,这是由于百度JSON数据规范性所产生的。因此,我加入了try命令进行错误调试,如果出现错误,则时间为0,便于我们后续检查数据。最后,将获取的时间数据写入点文件。
第五步:空间可视化
用空间链接,可将点要素中的时间数据记录入面要素中,并进行空间可视化,实现城市中心交通时空圈图的最终生成(图6、图7)。
我获取的时间是10月1日晚11时,由于假期外出车辆较多,故总体交通条件较优
。大家可以测试下高峰时期,估计时间会有所增加。结论大家自己总结吧!
图6
图7
全代码如下。
# -*- coding:utf-8 -*-
import arcpy
import requests
import json
fc = r"G:\2016tuto\baidur2.gdb\cd_dotuse_final"
fields = ["OID","lng","lat","dur"]
def get_time(coordinate,mode,city,api_key):
api_addr="http://api.map.baidu.com/direction/v1?mode="+mode+"&origin="+coordinate+"&destination=30.663467,104.072247&origin_region="+city+"&destination_region="+city+"&output=json&coord_type=wgs84&ak=" + api_key
req=requests.get(api_addr)
content=req.content
sjson=json.loads(content)