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

#!/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)