参考学习代码部分:
https://zhuanlan.zhihu.com/p/119003382
import requests
import json
import pandas as pd
import numpy as np
def get_location(county): # 设置函数转换计算经纬度
url = 'https://restapi.amap.com/v3/geocode/geo' # 高德API地理编码服务地址
params = {'key': '**', # 参数1:个人申请的高德密钥
'address': county } #参数2:需要转换经纬度的位置名称
try:
response = requests.get(url, params) #使用requests模块的get方法请求网址数据
jd = json.loads(response.text) #数据json格式化
return jd['geocodes'][0]['location'] #读取需要的location值
except:
return '未获取经纬度' #利用try-except设置防呆机制
def get_distance(origin,destination): #设置函数计算两经纬度间驾车距离
url = 'https://restapi.amap.com/v3/direction/driving' # 高德API驾车路径规划服务地址
params = {'key': '**', # 参数1:个人申请的高德密钥
'origin': origin, # 参数2:起始点的经纬度坐标
'destination':destination, # 参数3:目的地的经纬度坐标
'extensions':'base'} # 参数4:返回结果控制选项,必填项,base:返回基本信息;all:返回全部信息
try:
response = requests.get(url, params) #使用requests模块的get方法请求网址数据
jd = json.loads(response.text) #数据json化
return jd['route']['paths'][0]['distance'] #读取需要的distance值
except:
return -999 #利用try-except设置防呆机制,这里设置距离0表示未成功获取两地间的距离
利用上述调用方法,读取EXCEL循环调用API获取路网距离。
数据准备Start和End两个Sheet。
start_city = pd.read_excel(r"D:\CityDistance.xlsx",sheet_name="Start",names=["cityname","lon","lat"])
end_city = pd.read_excel(r"D:\CityDistance.xlsx",sheet_name="End",names=["cityname","lon","lat"])
# start_city_name = start_city.loc[:,["cityname"]].values.tolist()
# end_city_name = end_city.loc[:,["cityname"]].values.tolist()
start_city_name = list(start_city["cityname"])
end_city_name = list(end_city["cityname"])
# 列表list组成DataFrame
start_city_list = []
end_city_list = []
distance_list = []
# 根据OD维度建立相应大小的距离矩阵
distance_matrix = np.zeros((len(start_city_name), len(end_city_name)))
for i, start0 in enumerate(start_city_name):
for j, end0 in enumerate(end_city_name):
if start0 != end0:
distance0 = int(get_distance(get_location(start0), get_location(end0))) / 1000 # 距离单位转换为公里
else:
distance0 = 0
print("%s,%s,%.5fkm" % (''.join(start0), ''.join(end0), distance0))
start_city_list.append(''.join(start0))
end_city_list.append(''.join(end0))
distance_list.append(distance0)
distance_matrix[i][j] = distance0
# 列表格式
result_df = pd.DataFrame({'start_city':start_city_list,
'end_city':end_city_list,
'distance':distance_list})
result_df.to_excel(r"D:\output\CityDistance1.xlsx",index=False)
# 矩阵格式
matrix_result_df = pd.DataFrame(distance_matrix)
matrix_result_df.index = start_city_name # start_city_list 行
matrix_result_df.columns = end_city_name # end_city_list 列
writer = pd.ExcelWriter(r"D:\output\CityDistance2.xlsx")
matrix_result_df.to_excel(writer)
writer.save()