过高德地图API获取公交线路"/>
ArcGisPro脚本工具【7】——通过高德地图API获取公交线路
本次Arcpy脚本工具用的是ArcGisPro2.8版本,尽量使用同一版本,其它版本可以参照。
工具介绍
本工具的主要功能是通过高德的API接口提取公交线路的坐标和属性信息,并转换为矢量,保存到GDB数据库中。
我尝试过2种方法,一种是用python的requests库,直接写成脚本,获取公交信息。但毕竟个人水平有限,代码写的稀烂,发现速度实在太慢,一个城市10多分钟,于是放弃了。
另一种方式就是用FME。FME自还的httpcaller转换器方便好用,而且效率奇高,速度比第1种方法快了10倍不止,于是确定用FME。
通过安装ArcGIS Pro安装包全家桶里的【Data_Interoperability】,就可以在ArcGIS Pro中使用FME工具了,具体安装和使用方法,看我之前发的文章,里面有详细介绍:
ArcGisPro脚本工具【6】——湘源画的规划用地CAD带指标导入ArcGIS数据库=1001.2014.3001.5501
FME模板和脚本工具
FME模板
FME模板内容比较复杂,主要包括以下几大块的内容,篇幅所限,这里只简单介绍思路。想了解的可以直接打开模板查看。FME模板会在文章末尾随工具放出下载。
1、前3步主要功能是通过8848网站获取全国的城市名称,再通过城市名获取所在城市的公交线路名单。
2、第4步是工具的主要功能块,通过高德的API接口提取公交线路的坐标和属性信息。
3、第5、6步是解析得到的信息,分别提取出公交线路和公交站点的信息,并生成公交线路和公交站点。
脚本工具
平时工作中,有些方法我分离出来作为基础工具来调用,因此文件包有些乱,其中【BUG-爬取公交线路】是最终的运行工具,但是其它的文件和工具也不能删。
最终工具的参数有4个。
1、【输入城市名】——输入地级市名称(我试过县级市,会出错,应该是不支持)。格式如上图【莆田】,而不是【莆田市】,要注意。
2、【输出公交线路】——输出一个线要素的公交线路。
3、【输出公交站点】——输出一个点要素的公交站点。
4、【坐标系】——给要素点义的坐标系,根据所在城市有所不同(根据城市所在经度确定,这方面的知识可百度)。
PS:其实还有2个重要的参数,高德地图的【key】和【安全密钥】,我在FME里已经默认填上了。高德的【key】有每天的使用限制,用的人多了会出现超出上限不能使用的情况。
不过这个工具使用【key】的申请量并不大,一般问题不大,我就不放出来了。如果出现超限制的情况,可以自行上高德开放平台去申请,申请好后打开FME模板,手动修改,位置如下:
脚本编写
主要思路
由于主要工具是FME写的,所以脚本里的代码只是基本的一些框架代码,以及对几个基础工具的调用。这里只列一下主工具的代码,其他工具和FME模板可以自行打开查看。
完整代码如下:
# -*- coding:utf-8 -*-
import arcpy
import osarcpy.env.overwriteOutput = True# 工具箱输入参数
city_name = arcpy.GetParameterAsText(0) # 输入城市名
bus_line = arcpy.GetParameterAsText(1) # 输出公交线路
bus_point = arcpy.GetParameterAsText(2) # 输出公交站点
projection = arcpy.GetParameterAsText(3) # 输入坐标系# 获取文档位置
default_path = os.path.dirname(__file__)
arcpy.ImportToolbox(default_path + r"\cc工具箱.tbx") # 加载cc工具箱# 创建公交线路\站点
def BusLine():arcpy.AddMessage(r'_____创建中间数据库_____')# 判断数据库里是否已经有存在同名要素【如果有则清除】path = default_path + r'\公交'# 创建一个空的文件夹,用于储存导出文件is_exist = os.path.exists(path) # 判断文件夹是否存在if is_exist:arcpy.cc.RemoveAllFile(path) # 移除文件夹下的所有文件os.removedirs(path) # 移除文件夹os.makedirs(path) # 创建文件夹arcpy.AddMessage(r'_____调用【FME-爬取高德公交】_____')# 调用【FME-爬取高德公交】arcpy.cc.FMEbus(city_name,path)arcpy.AddMessage(r'_____复制要素并定义投影【WGS_1984】_____')# 定义投影【WGS_1984】arcpy.DefineProjection_management(path + r'\公交线路.shp',"GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",""6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]")arcpy.DefineProjection_management(path + r'\公交站点.shp',"GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",""6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]")# 删除重复点arcpy.cc.Repeat(path + r'\公交线路.shp', bus_line + '6')arcpy.cc.Repeat(path + r'\公交站点.shp', bus_point + '6')# 投影arcpy.Project_management(bus_line + '6', bus_line + '3', projection)arcpy.Project_management(bus_point + '6', bus_point + '3', projection)# 复制arcpy.CopyFeatures_management(bus_line + '3', bus_line)arcpy.CopyFeatures_management(bus_point + '3', bus_point)# 移除文件夹arcpy.cc.RemoveAllFile(path)os.removedirs(path)arcpy.Delete_management(bus_line + '6')arcpy.Delete_management(bus_point + '6')arcpy.Delete_management(bus_line + '3')arcpy.Delete_management(bus_point + '3')if __name__ == '__main__':BusLine()
结果展示
结果生成的公交线路和公交站点如下:
其实生成结果里,不仅包括公交线路,如果该城市有地铁的话,还包括地铁线路。可以自行通过关键词搜索分离出来,这里就不详述了。
工具下载
最后,贴上工具下载地址:
工具下载:BUG-获取高德公交线路=z2bx
更多推荐
ArcGisPro脚本工具【7】——通过高德地图API获取公交线路
发布评论