师弟的课题,组会时候导师有提到这种方式,试图进行农机的转移,花了一晚上时间做了点尝试——本来试图在硕士期间研究下这个课题即农机从仓库到田间的路径转移,但可惜没时间弄了。提供一种思路和一点demo代码
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()
直接复制到py里可用,实现的效果就是给定起点终点经纬度,然后然后调用高德导航api,用来路径规划,然后获取规划到的路径规划点,再在地图上画出来看下规划的啥样。
结果如下:
这里面4代表四个路径点,只是因为地图无法再放大,你用鼠标点下可以显示有四个坐标点的。代码生成的是showpoint.html文件,自己在文件夹里用浏览器打开就成了。
说下这种方式的弊端,
生成的是小数点后6位经纬度,基本就是米级别的导航精度,想用在必须是厘米级的农机里不可能,后续思路可能是用无人机扫面的高精度地图和这个匹配或者说跟高德厂家谈直接要高精度地图?但其实在农业环境里不少地方都是很偏僻,高德可能都没开放那块地图,那这种方案可以糊弄下不懂技术的导师,但实际是没法用来导航的。