You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
7.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#获取城市之间的驾车距离/时间并且存入到excel表格中
import requests, json, os, time, xlwt, sys
flush_time = 6000 # 刷新间隔,单位秒
file_name1 = "两地之间的开车时间.xlsx"
file_name2 = "两地之间的开车距离.xlsx"
# 预置地点列表
address_list = [
# "沈阳市", "大连市", "鞍山市", "抚顺市", "本溪市", "丹东市", "锦州市", "营口市", "阜新市", "辽阳市", "盘锦市", "铁岭市", "朝阳市", "葫芦岛市",
'哈尔滨市', '齐齐哈尔市', '鸡西市', '鹤岗市', '双鸭山市', '大庆市', '伊春市', '佳木斯市', '七台河市', '牡丹江市', '黑河市', '绥化市', '大兴安岭地区',
]
workdir = os.path.dirname(os.path.realpath(sys.argv[0]))
file_path1 = os.path.join(workdir, file_name1)
file_path2 = os.path.join(workdir, file_name2)
AK = "9AfjsK2CXGuESwSb4sF3LsGhWh999Rdd" # 百度地图API认证码
# 获取地址的经纬度
def getPosition(address, AK):
url = "http://api.map.baidu.com/place/v2/search"
params = {
"query": address,
"region": "全国",
"output": "json",
"ak": AK,
}
try:
res = requests.get(url, params=params)
res.raise_for_status() # 如果响应状态码不是200, 则抛出异常
json_data = res.json()
if json_data["status"] == 0:
lat = json_data["results"][0]["location"]["lat"] # 纬度
lng = json_data["results"][0]["location"]["lng"] # 经度
return (lat, lng), json_data["status"]
else:
print(json_data["message"])
return (0, 0), json_data["status"]
except requests.RequestException as e:
print(f"Request error: {e}")
return (0, 0), -1
except ValueError as e:
print(f"Response parsing error: {e}")
return (0, 0), -1
# 获取两地开车的时间
def getTime(start, end, AK):
url = "https://api.map.baidu.com/directionlite/v1/driving"
params = {
"origin": start,
"destination": end,
"ak": AK,
}
try:
res = requests.get(url, params=params)
res.raise_for_status() # 如果响应状态码不是200, 则抛出异常
json_data = json.loads(res.text)
if json_data["status"] == 0:
return int(json_data['result']['routes'][0]['duration']) # 获取时间,单位s
else:
print(json_data["message"])
return -1
except requests.RequestException as e:
print(f"Request error: {e}")
return -1
except ValueError as e:
print(f"Response parsing error: {e}")
return -1
def getDis(start, end, AK):
url = "https://api.map.baidu.com/directionlite/v1/driving"
params = {
"origin": start,
"destination": end,
"ak": AK,
}
try:
res = requests.get(url, params=params)
res.raise_for_status() # 如果响应状态码不是200, 则抛出异常
json_data = json.loads(res.text)
if json_data["status"] == 0:
return int(json_data["result"]["routes"][0]["distance"])
else:
print(json_data["message"])
return -1
except requests.RequestException as e:
print(f"Request error: {e}")
return -1
except ValueError as e:
print(f"Response parsing error: {e}")
return -1
def calcTime(startName, endName):
start, status1 = getPosition(startName)
end, status2 = getPosition(endName)
if status1 == 0 and status2 == 0:
return round(getTime(start, end)/60, 1) # 将时间转换为分钟
else:
return -1
def calcDistance(startName, endName):
start, status1 = getPosition(startName)
end, status2 = getPosition(endName)
if status1 == 0 and status2 == 0:
return round(getDis(start, end),1)
else:
return -1
# 设置标题样式
def set_title_style(blod=False, underline=False):
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
font.name = "Calibri" # 字体类型
font.height = 20 * 11 # 20为衡量单位,11为字号
font.bold = blod # 是否加粗
font.underline = underline # 是否添加下划线
style.font = font
return style
# 生成Excel文件
def createExcelDis(data,file_path):
workboot = xlwt.Workbook(encoding='utf-8')# 创建workbook和sheet对象
worksheet = workboot.add_sheet('计算两点间开车距离') # 设置工作表的名字
for i in range(len(address_list)+1):
worksheet.col(i).width = 256 * 30 # 设置每列宽, 256为衡量单位30表示30个字符宽度
row0 = ["两点间开车距离(单位千米)"]+address_list# 写入Excel标题
for i in range(len(row0)):
worksheet.write(0, i, row0[i], set_title_style(True))
for i, line in enumerate(data):
for j, drive_dis in enumerate(line):
worksheet.write(i+1, j, str(drive_dis), set_title_style())
workboot.save(file_path)
print("[INFO] 成功创建%s" % file_path)
def createExcelTime(data,file_path):
# 创建workbook和sheet对象
workboot = xlwt.Workbook(encoding='utf-8')
worksheet = workboot.add_sheet('计算两点间开车时间') # 设置工作表的名字
for i in range(len(address_list)+1):
worksheet.col(i).width = 256 * 30 # 设置每列宽, 256为衡量单位30表示30个字符宽度
# 写入Excel标题
row0 = ["两点间开车时间(单位分钟)"]+address_list
for i in range(len(row0)):
worksheet.write(0, i, row0[i], set_title_style(True))
# 写入查询百度地图api获取的数据
for i,line in enumerate(data):
for j,drive_time in enumerate(line):
worksheet.write(i+1, j, str(drive_time), set_title_style())
workboot.save(file_path)
print("[INFO] 成功创建%s" % file_path)
# 生成开车时间矩阵信息
def generateTimeMatrix(flush_time,file_path):
while True:
matrix_list = [] # 以矩阵的方式来存放两地之间的开车时间
alist = [] # 存放横坐标的值
print("[INFO] 开始计算两地之间的开车时间,每隔%s秒刷新一次..." % flush_time)
for start in address_list: # 起始位置作为纵坐标
alist.append(start)
for end in address_list: # 终点位置作为横坐标
dt = calcTime(start, end)
alist.append(dt)
matrix_list.append(alist)
alist = []
createExcelTime(matrix_list,file_path)
time.sleep(flush_time)
# 生成开车时间矩阵信息
def generateDistanceMatrix(flush_time,file_path):
while True:
matrix_list = [] # 以矩阵的方式来存放两地之间的开车距离
alist = [] # 存放横坐标的值
print("[INFO] 开始计算两地之间的开车距离,每隔%s秒刷新一次..." % flush_time)
for start in address_list: # 起始位置作为纵坐标
alist.append(start)
for end in address_list: # 终点位置作为横坐标
dt = calcDistance(start, end)
alist.append(dt)
matrix_list.append(alist)
alist = []
createExcelDis(matrix_list,file_path)
time.sleep(flush_time)
if __name__ == "__main__":
try:
# 时间
generateTimeMatrix(flush_time, file_path1)
# 距离
generateTimeMatrix(flush_time, file_path2)
except Exception as e:
print('ERROR:%s' % e)