所有文章 > AI驱动 > PyQt6 教程 | 高德地图 API 与自驾路径规划:探索地理信息与导航
PyQt6 教程 | 高德地图 API 与自驾路径规划:探索地理信息与导航

PyQt6 教程 | 高德地图 API 与自驾路径规划:探索地理信息与导航

昨天通过高德API查询具体点位经纬度坐标信息:

https://mp.weixin.qq.com/s/6bcvccsmFBiO-mPTKn-muQ

最后做好的自驾点位图:

基本上就是地理信息底图、shapefilef地理数据以及一些点位信息的显示。

今天又看了一下高德地图的API,可以通过API进行路径规划,也就是我们通常使用的导航信息。

高德官方中径规划说明:

https://lbs.amap.com/api/webservice/guide/api/direction

访问格式:

https://restapi.amap.com/v3/direction/driving?origin=116.45925,39.910031&destination=116.587922,40.081577&output=xml&key=<用户的key>

返回结果可是xml或者是json格式。

在这里,只需提供起点和目的地的经纬度坐标,即可获取路径规划。还可以使用之前的地理名称返回坐标的函数,输入地名,例如 丹东市 大鹿岛,便可直接获得经纬度坐标,中间以逗号分隔,作为路径规划的输入。因此,我们将昨天的代码再次提取并进行了改进。

在界面最上面加了标签和输入窗口,输入地点就可以直接画出行车规划路径。地名输入是市加具体地点,中间加空格。

具体路径规划的代码,直接参考:

https://blog.csdn.net/qq_45391544/article/details/129659554

import requests
from OpenSSL import SSL
import numpy as np
import folium
from folium import plugins

# ##########################################全局变量#############################################################
# 替换为你的高德API密钥,在高德开放平台里注册-》应用管理-》创建新应用-》服务平##台那里选择web服务-》记住生成的key,这里没有密钥的。后续填写到amap_key中
amap_key = 'xxxxxxxxxxxxxxxxxxxxxxx'
list_latlon=[]
Lon = []
Lat = []

# 仓库经纬度(格式:经度,纬度)
warehouse_location = '113.637xxxxx,23.2434xxxx'

# 农田经纬度(格式:经度,纬度),换成自己的
farm_location = '113.63837xxxx,23.24199xxxx'

# 路径规划策略,可以选择0~5的整数,具体含义可以参考高德API文档 具体介绍见:https://lbs.amap.com/api/webservice/guide/api/direction
# 本文用的是驾车路径,
# 0,速度优先,此路线不一定距离最短
# 1,费用优先,不走收费路段,且耗时最少的路线
# 2,距离优先,仅走距离最短的路线,但是可能存在穿越小路/小区的情况
# 3,速度优先,不走快速路,例如京通快速路(因为策略迭代,建议使用13)
# 4,躲避拥堵,但是可能会存在绕路的情况,耗时可能较长
# 5,多策略(同时使用速度优先、费用优先、距离优先三个策略计算路径)。
# 其中必须说明,就算使用三个策略算路,会根据路况不固定的返回一~三条路径规划信息。
# 6,速度优先,不走高速,但是不排除走其余收费路段
# 7,费用优先,不走高速且避免所有收费路段
# 8,躲避拥堵和收费,可能存在走高速的情况,并且考虑路况不走拥堵路线,但有可能存在绕路和时间较长
# 9,躲避拥堵和收费,不走高速
strategy = 2
# #######################################################################################################

# 获取高德地图的路径规划点
def get_route(start, end, mode, amap_key):
# 这里的url中选择是步行,公交还是驾车路径,本文中driving?表示驾车,具体介绍见:https://lbs.amap.com/api/webservice/guide/api/direction
url = f'https://restapi.amap.com/v3/direction/driving?origin={start}&destination={end}&strategy={mode}&key={amap_key}'
response = requests.get(url)
data = response.json()

if data['status'] == '1':
route = data['route']['paths'][0]['steps']
return route
else:
print('请求失败,请检查输入参数。')
return None

route = get_route(warehouse_location, farm_location, strategy, amap_key)

if route:
for i, step in enumerate(route):
list_latlon.append(step["polyline"])
print(f'步骤 {i+1}: {step["instruction"]}:{step["polyline"]}')

else:
print('无法获取路线规划。')

# 获取街道地图
for item in list_latlon:
points = item.split(';')
for point in points:
coords = point.split(',')
Lon.append(float(coords[0]))
Lat.append(float(coords[1]))

# 绘制地图
def PlotLineOnMap(Lat, Lon):
# 给出的坐标系为GCJ-02,如果需要测试google地图,需要进行坐标转换

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='#3388ff').add_to(san_map)
marker_cluster = plugins.MarkerCluster().add_to(san_map)
for lat, lon in zip(Lat, Lon):
folium.Marker([lat, lon], color='red').add_to(marker_cluster)
san_map.save('showpoint.html')

def main():

PlotLineOnMap(Lat, Lon)

if __name__ == '__main__':
main()

地点反查坐标的代码参考:

https://blog.csdn.net/Lillian_f/article/details/123963712

代码:

# 导入库
import requests,json
import xlsxwriter

# 定义变量
KEY = 'xxx' #此处填入你申请的key
URL_geocode = 'https://restapi.amap.com/v3/geocode/geo?'

# 获取经纬度
def gain_location(address):
api_url = f'{URL_geocode}city=郑州市&address={address}
&key={KEY}&output=json&callback=showLocation' #此处城市名可更改
r = requests.get(api_url)
r = r.text
r = r.strip('showLocation(')
r = r.strip(')')
jsonData = json.loads(r)['geocodes'][0]['location']
return jsonData

# 返回信息
def get_place_info(address):
place_info = []
for place in address:
place_point = []
place_point.append(place)
location = gain_location(place)
print(place,location)
place_point.append(location)
place_info.append(place_point)
return place_info

# 自定义地址内容
address = input().split() #此处表示可以输入以空格相隔的地址
#也可以直接写成 address = ['地点1','地点2','地点3'] 的形式
result = get_place_info(address)

# 写入excel
book = xlsxwriter.Workbook('E:/bi/hui/biao.xlsx') #填写创建的excel表的存储地址及表名
sheet = book.add_worksheet()
col = ('place','location')
for i in range(0,2):
sheet.write(0,i,col[i])
for i in range(0,len(address)):
for j in range(0,2):
sheet.write(i+1,j,result[i][j])
book.close()

有了两部分的工作,再加上基本的绘图,就有了这个框架。由于加载的图比较多,没有多线程,画图时会很慢。

文章转自微信公众号@峰哥Python笔记

#你可能也喜欢这些API文章!

我们有何不同?

API服务商零注册

多API并行试用

数据驱动选型,提升决策效率

查看全部API→
🔥

热门场景实测,选对API

#AI文本生成大模型API

对比大模型API的内容创意新颖性、情感共鸣力、商业转化潜力

25个渠道
一键对比试用API 限时免费

#AI深度推理大模型API

对比大模型API的逻辑推理准确性、分析深度、可视化建议合理性

10个渠道
一键对比试用API 限时免费