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数据库https://blog.csdn.net/xcc34452366/article/details/128675297?spm=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 os

arcpy.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-获取高德公交线路https://pan.baidu.com/s/1l9tU09Qw8cAvMLygzLut0w?pwd=z2bx

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

规划GIS会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值