前言
参比赛时,需要调用高德API进行多路径点规划,结果高德一次性只能添加16个路径点,为了让多达20个路径点出现在一张地图上便写了这个代码
准备 :
需要一个高德官网申请的API Key
代码需要输入经纬度(这里就不过多讲述如何获取路径点的经纬度)
需要按照特定格式做成excel表格,相信对大家来说不是很难的
1.申请高德API
先进入高德开放平台的控制台申请一个Key
1.先创建一个应用
2.选择添加key
3.选择Web服务
这就是我们需要的Key啦
2.代码部分
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()
3.文件格式
数据读取格式需要如下EXCEL表格格式
获取经纬度也是有其余方法的就麻烦大家自己找一下,这里不过多阐述
默认第一行为起点,最后一行为终点,中间的为途径点
4.输出结果
输出的结果保存在代码目录的【地图.html】文件中
直接用浏览器打开就行
5.结果展示
有卫星地图和街道地图2种模式,这里仅展示一种
最后
还有可优化的余地,请大家自便
关于strategy路线选取策略,可移步高德的官方文档查看