赞
踩
参比赛时,需要调用高德API进行多路径点规划,结果高德一次性只能添加16个路径点,为了让多达20个路径点出现在一张地图上便写了这个代码
准备 :
需要一个高德官网申请的API Key
代码需要输入经纬度(这里就不过多讲述如何获取路径点的经纬度)
需要按照特定格式做成excel表格,相信对大家来说不是很难的
先进入高德开放平台的控制台申请一个Key
1.先创建一个应用
2.选择添加key
3.选择Web服务
这就是我们需要的Key啦
import folium from folium import plugins import numpy as np import pandas as pd import requests strategy = 5 #规划策略 见https://lbs.amap.com/api/webservice/guide/api/direction#driving gaode_key = '替换为你的Key' #调用高德地图key lat_and_lon = [] #储存详细坐标经纬度 Lon = [] # 储存经度 Lat = [] # 储存纬度 df = pd.read_excel('总数据.xlsx', sheet_name='一区') way_lon = df['经度'].tolist() way_lat = df['纬度'].tolist() waypoint = '' #路径点 jwd = df['经纬度'].tolist() #供应商经纬度 grouped_strings = [] tolls = 0 duration = 0 def get_routes(start, end, mode, gaode_key, waypoint): url = f'https://restapi.amap.com/v3/direction/driving?origin={start}&destination={end}&strategy={mode}&waypoints={waypoint}&key={gaode_key}' response = requests.get(url) data = response.json() if data['status'] == '1': routes = data['route']['paths'][0]['steps'] return routes else: print('未获取到相关路径') return None for i in range(0, len(jwd), 16): group = jwd[i:i + 16] string = ';'.join(map(str, group)) start = group[0] end = group[-1] waypoint = string # 获取路线规划 routes = get_routes(start, end, strategy, gaode_key, waypoint) if routes: for i, step in enumerate(routes): lat_and_lon.append(step["polyline"]) tolls += int(step["tolls"]) duration += int(step["duration"]) else: print('无法获取路线规划。') # 提取坐标点并全添加到 Lon 和 Lat 列表中 for item in lat_and_lon: points = item.split(';') for point in points: coords = point.split(',') Lon.append(float(coords[0])) Lat.append(float(coords[1])) def Map(Lat, Lon, la, lo): tri = np.array(list(zip(Lat, Lon))) san_map = folium.Map( location=[23.243466, 113.637713], zoom_start=16, # 调用高德街道图 tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}', # tiles='http://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}', # 高德卫星图 attr='default') folium.PolyLine(tri, color='#ff0000').add_to(san_map) marker_cluster = plugins.MarkerCluster().add_to(san_map) for lat, lon in zip(la, lo): icon = folium.Icon(color='red', icon='info-sign') # 自定义图标 folium.Marker([lat, lon], icon=icon).add_to(marker_cluster) san_map.save('地图.html') print("总花费{}元".format(tolls)) print("耗费{}分钟".format(duration/60)) def main(): Map(Lat, Lon, way_lat, way_lon) if __name__ == '__main__': main()
数据读取格式需要如下EXCEL表格格式
获取经纬度也是有其余方法的就麻烦大家自己找一下,这里不过多阐述
默认第一行为起点,最后一行为终点,中间的为途径点
输出的结果保存在代码目录的【地图.html】文件中
直接用浏览器打开就行
有卫星地图和街道地图2种模式,这里仅展示一种
还有可优化的余地,请大家自便
关于strategy路线选取策略,可移步高德的官方文档查看
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。