使用高德路径规划API,获取轨道线网

该API网址:https://lbs.amap.com/api/webservice/guide/api/direction
其中用到的API如下,

图片

 

该API填的参数如下,

图片

 

 

对于所需的起点和终点经纬度,我们可以使用之前爬取的城市地铁站点的经纬度。
以上海市为例:

图片

首先对上海市地铁.xlsx数据进行处理,获取每条地铁线的起终点经纬度,代码如下,
data = (    pd.read_excel(r'上海市地铁.xlsx').    assign(location=lambda df: df['lon'].apply(lambda x: f'{x:.6f}') + ',' + df['lat'].apply(lambda x: f'{x:.6f}')).    groupby('line').agg(origin=('location', 'first'), destination=('location', 'last')).    reset_index())data
输出结果如下,

图片

使用高德路径规划API获取线网
地铁10号线航中路-基隆路为例。
通过下面函数将获取到的结果存储成json文件
import requests
def get_subway_lines(origin, destination, city, key):    """获取轨道线网"""    url = 'https://restapi.amap.com/v3/direction/transit/integrated'    # 定义高德路径规划API参数    params = {        "origin": origin,        "destination": destination,        "city": city,        "output": "json",        "strategy": "2",         "key": key    }    response = requests.get(url, params=params).json()
    with open(r'response_10号线.json', 'w', encoding='utf-8') as file:        # 将JSON数据写入文件        json.dump(response, file, ensure_ascii=False, indent=4)get_subway_lines('121.590411,31.351311', '121.355336,31.165417', '3100', '你的key')
如下图中的departure_stop='基隆路',arrival_stop='航中路',正好是10号线的起点站和终点站,那么将对应的polyline处理之后,就得到地铁10号线(基隆路--航中路)的路线。

图片

处理函数如下,
import json import geopandas as gpdfrom shapely.geometry import LineString, Point
with open(r'response_10号线.json', encoding='utf-8') as file:    response = json.load(file)    # 获取线路的polyline    polyline = response['route']['transits'][0]['segments'][0]['bus']['buslines'][0]['polyline']    # 获取线路名称    name = response['route']['transits'][0]['segments'][0]['bus']['buslines'][0]['name']        subway_line = []        # 遍历线串的每个点    for line in polyline.split(';'):        # 假设每个点的坐标由逗号分隔        coords = line.split(',')        # 创建一个Point对象,并将其添加到LineString对象中        subway_line.append((float(coords[0]), float(coords[1])))        # 现在subway_line包含了所有点的坐标    data = gpd.GeoDataFrame({        'name': [name],        'geometry': [LineString(subway_line)]    }, crs='epsg:4326')        data.to_file(r'subway_line1.shp', driver='ESRI Shapefile', encoding='utf-8')
可视化如下,图片

大家可以思考一下,怎么利用之前获取的地铁站点数据,进行批量获取地铁线路。

THE END