引言
这几天参加经管三创杯比赛,要做一个物流的网页,要求实现路径规划。第一个想到的就是高德地图(不喜欢百度地图,感觉坑)。
整体的想法就是通过输入起始点和终止点,返回最优路径规划。
运行效果
工具
-
python3.8
-
flask框架
-
高德地图API
内容
不管说什么先去官方文档看看,在这里我只举列骑行路径规划,其他的类似。
通过看代码我们发现,最后需要的是两个点的经纬度坐标,而高德地图也给我们准备好提供经纬度的方法了。方法。
具体步骤如下
-
第一步,申请”Web服务API”密钥(Key);
-
第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送;
-
第三步,接收HTTP请求返回的数据(JSON或XML格式),解析数据。
如无特殊声明,接口的输入参数和输出数据编码全部统一为UTF-8。
重要一点的是申请api时候,需要申请俩个api,如下图。一个用来画图,一个用来返回我们需要的经纬度值
代码
获取经纬度api代码
from flask import Flask,render_template,request
import requests
app = Flask(__name__)
@app.route(‘/‘)
def hello_world():
address = []
return render_template(‘route.html‘,address=address,origin_str="",destination_str="")
## 获取输入地址的经纬度
@app.route(‘/get_geo‘,methods=["POST"])
def get_geo():
info = request.form.to_dict()
origin_str = info.get("origin_str")
destination_str = info.get("destination_str")
parameters = {
"key":"你申请的web服务key值",
"address":origin_str+"|"+destination_str,
"batch":True, #批量查询操作,最多支持 10 个地址进行批量查询。
}
response = requests.get("https://restapi.amap.com/v3/geocode/geo?parameters",params=parameters)
data = response.json()["geocodes"]
origin = [float(value) for value in data[0]["location"].split(",")]
destination = [float(value) for value in data[1]["location"].split(",")]
#get_best_route(origin,destination)
address = [origin,destination]
print(address)
return render_template(‘route.html‘,address=address,origin_str=origin_str,destination_str=destination_str)
## 返回路线规划
# def get_best_route(origin,destination):
# parameters = {
# "key": "eca4b61cc086d41e12013c35dc12c3ce",
# "origin":origin,
# "destination":destination,
# }
# response = requests.get("https://restapi.amap.com/v4/direction/bicycling?parameters",params=parameters)
# data = response.json()["data"]["paths"][0]
# distance = data["distance"]
# duration = data["duration"]
# steps = data["steps"]
# print("distance:\n",distance)
# print("duration:\n",duration)
# print("steps:\n",steps)
if __name__ == ‘__main__‘:
app.run()
首页页面
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
<title>位置经纬度 + 骑行路线规划</title>
<style type="text/css">
html,
body,
#container {
width: 100%;
height: 95%;
}
#panel {
position: fixed;
background-color: white;
max-height: 90%;
overflow-y: auto;
top: 10px;
right: 10px;
width: 280px;
}
#panel .amap-lib-driving {
border-radius: 4px;
overflow: hidden;
}
</style>
<link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
<script type="text/javascript" src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=你申请的js的key值&plugin=AMap.Riding"></script>
<script type="text/javascript" src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
</head>
<body>
<div style="height: 20%">
<form action="/get_geo" style="width: 100%" METHOD="post">
<input type="text" placeholder="起始位置:例如:北京市朝阳区阜通东大街6号" name="origin_str" class="form-group" width="500px" value="{{ origin_str }}">
<input type="text" placeholder="终止位置:例如:上海市黄浦区人民大道200号" name="destination_str" class="form-group" value="{{ destination_str }}" width="500px">
<input type="submit" value="查询" class="btn btn-success" style="width: 150px;height: 40px;font-size: 20px" >
</form>
</div>
<div id="container"></div>
<div id="panel"></div>
<script type="text/javascript">
var map = new AMap.Map("container", {
resizeEnable: true,
center: [116.397428, 39.90923],//地图中心点
zoom: 13 //地图显示的缩放级别
});
//骑行导航
var riding = new AMap.Riding({
map: map,
panel: "panel"
});
//根据起终点坐标规划骑行路线
{% if address!= None %}
riding.search({{ address[0] }},{{ address[1] }}, function(status, result) {
// result即是对应的骑行路线数据信息,相关数据结构文档请参考 https://lbs.amap.com/api/javascript-api/reference/route-search#m_RidingResult
if (status === ‘complete‘) {
log.success(‘绘制骑行路线完成‘)
} else {
log.error(‘骑行路线数据查询失败‘ + result)
}
});
{% endif %}
</script>
</body>
</html>