百度地图开放平台
进入百度地图开放平台后,登陆用户,点击上方的控制台,按照提示进行激活后创建服务端类型的应用,应用名任意设置,其中白名单校验不做任何限制可以填写0.0.0.0/0
。创建成功后画面应如下图所示,其中访问应用(AK)即途中红色方框圈起来的部分一定要注意不要随意泄漏,后面需要使用到,这是后面访问需要用到的一串口令。
介绍需要用到的API
本项目中所有使用的API均为Web服务API,官方开发文档。
1.地点检索服务
地点检索服务(又名Place API)是一类Web API接口服务;
服务提供多种场景的地点(POI)检索功能,包括城市检索、圆形区域检索、矩形区域检索。开发者可通过接口获取地点(POI)基础或详细地理信息。
我们利用这个API来获取指定地点的经纬度(lat, lng)两个参数。
2.轻量级路线规划服务
轻量级路线规划服务(又名DirectionLite API )是一套REST风格的Web服务API,以HTTP/HTTPS形式提供了路线规划服务。相较于Direction API,DirectionLite API更注重服务的高性能和接口的轻便简洁,满足基础的路线规划需求,并不具备Direciton API中的驾车多路线/未来出行和公交跨城规划等高级功能。DirectionLite API支持驾车、骑行、步行、公交路线规划,支持中国大陆地区。
我们利用这个API来获取两个地点(用经纬度来给出)之间的路线规划距离。
编写Python程序
0.需要用到的模块
- requests
- json
- pandas
1.获取对应地点的经纬度
将传入的address
通过地点检索服务得到其经纬度,返回值为经纬度对应的字符串值,中间以逗号隔开,之后跟一个查询返回状态,如果查询失败,状态值不为0。
def getPosition(address):
url = r"http://api.map.baidu.com/place/v2/search?query={}®ion=全国&output=json&ak={}".format(
address,
AK # 自动调用,不用修改
)
res = requests.get(url)
json_data = json.loads(res.text)
if json_data["status"] == 0:
lat = json_data["results"][0]["location"]["lat"] # 纬度
lng = json_data["results"][0]["location"]["lng"] # 经度
else:
print(json_data["message"])
return "0,0", json_data["status"]
return str(lat) + "," + str(lng), json_data["status"]
2.获取两地之间的距离
将传入的两个地点(以经纬度描述)通过轻量级路线规划服务得到之间的路线规划距离。本范例是以驾车行驶(对应参数为’driving’)的方式来进行计算的。
def getDistance(start, end):
url = "https://api.map.baidu.com/directionlite/v1/driving?origin={}&destination={}&ak={}".format(
start,
end,
AK # 自动调用,不用修改
)
res = requests.get(url)
json_data = json.loads(res.text)
if json_data["status"] == 0:
return json_data["result"]["routes"][0]["distance"]
else:
print(json_data["message"])
return -1
3.合并函数调用
传入两个地点名,返回两地点距离,当某个地点查询不到时,返回结果设置为-1。
def calcDistance(startName, endName):
start, status1 = getPosition(startName)
end, status2 = getPosition(endName)
if status1 == 0 and status2 == 0:
return getDistance(start, end)
else:
return -1
4.进行简单的功能测试
运行代码输出北京和上海之间的距离,其单位为米。
5.对Excel中的批量地点计算距离
将data.xlsx
文件中的地点全部读取并计算出距离,将结果保存到本地的result.xlsx
文件中,其中我们将距离的单位设置为千米。主模块代码如下:
if __name__ == "__main__":
data = pd.read_excel("data.xlsx")
res = []
for i in range(0, len(data)):
startName = data.iloc[i, 0]
endName = data.iloc[i, 1]
dist = calcDistance(startName, endName)
res.append([startName, endName, dist / 1000])
pd.DataFrame(res).to_excel(
"result.xlsx",
header=["起点", "终点", "距离"],
index=None,
encoding="utf-8"
)
其中data.xlsx
文件的内容为:
对应的输出result.xlsx
文件内容如下:
联系方式
Email:gavinsun0921@foxmail.com
附录
# 本次整体的源代码
AK = "修改为你自己的AK码即可使用"
import pandas as pd
import requests
import json
def getPosition(address):
url = r"http://api.map.baidu.com/place/v2/search?query={}®ion=全国&output=json&ak={}".format(
address,
AK # 这里是一开始截图用红色圈起来的部分,无需修改
)
res = requests.get(url)
json_data = json.loads(res.text)
if json_data["status"] == 0:
lat = json_data["results"][0]["location"]["lat"] # 纬度
lng = json_data["results"][0]["location"]["lng"] # 经度
else:
print(json_data["message"])
return "0,0", json_data["status"]
return str(lat) + "," + str(lng), json_data["status"]
def getDistance(start, end):
url = "https://api.map.baidu.com/directionlite/v1/driving?origin={}&destination={}&ak={}".format(
start,
end,
AK # 这里是一开始截图用红色圈起来的部分,无需修改
)
res = requests.get(url)
json_data = json.loads(res.text)
if json_data["status"] == 0:
return json_data["result"]["routes"][0]["distance"]
else:
print(json_data["message"])
return -1
def calcDistance(startName, endName):
start, status1 = getPosition(startName)
end, status2 = getPosition(endName)
if status1 == 0 and status2 == 0:
return getDistance(start, end)
else:
return -1
if __name__ == "__main__":
data = pd.read_excel("data.xlsx")
res = []
for i in range(len(data)):
startName = data.iloc[i, 0]
endName = data.iloc[i, 1]
dist = calcDistance(startName, endName)
res.append([startName, endName, dist / 1000]) # 以千米为单位
pd.DataFrame(res).to_excel(
"result.xlsx",
header=["起点", "终点", "距离(千米)"],
index=None,
encoding="utf-8"
)