- 制作背景
- 功能现状
- Python读写Excel工作表
- 关于调取百度地图API的信息
- 驾车路径和时间信息获取
- 效果展示
- 附录:全部功能的代码
本人平时很少出去旅游,但临近毕业了突然有了出去自驾游的想法,想去的地方很多但又不知道那些地方有哪些好玩的、好吃的点,然后关于自驾游的驾驶距离与时间也是本人比较在意的地方。但是目前网络上的各种旅游攻略太多太杂,寻找有参考性的攻略犹如大海捞针。所以本人决定自己开发一款自助旅游系统,如果成功的话又有成就感又能解决实际问题,很舒服。目前的功能比较局限,仅能从规定的路线结合百度地图API寻找到与旅游景点相关的信息。未来加入各种功能以后,相信可以真正方便到大家,让各位有更好旅游体验。
功能现状目前基于Python编程语言搭建了旅游资源的excel数据加载,自驾里程、时间和景点、美食等信息获取、旅游信息保存等模块。首先在excel中输入自己规划好的旅游节点(必须百度地图可以搜到),运行程序后得到旅游的中间信息,随后根据中间信息自己调整路线。
未来想法:
1.将路径规划加入到功能中来,仅用收集到想要去玩的地方,就能自己规划好最优的旅游路径;
2.让路径规划算法能够加入时间、路程等约束。
3.能够根据各种平台上对于美食、景点的评分来对于中间节点做一个更综合的评价,依据该评价和之前提到的时间、路程约束自动剔除可玩性不高的中间节点。
4.结合计算机视觉和中国地图,在生成旅游路线后能够在地图上生成最终旅游计划的轨迹,即可视化。
Python中有至少两种方式可以对于Excel工作表进行读写。
一种是用调用pandas库,利用pandas库中的read_excel()函数就可以完成对于excel表格的读取,然后利用to_excel()函数就可以完成对于DataFrame数据的excel格式保存,例程如下:(参考https://baijiahao.baidu.com/s?id=1724702605017928089&wfr=spider&for=pc)
from pandas import read_excel
file='d:/student.xlsx' #这里输入想要读取的excel表的相对/绝对路径
df=read_excel(file,sheet_name=0,converters={'学号':str})
df.to_excel('d:/test.xlsx',index=False)
print(df)
另一种是调用xlrd和xlwt来完成对于excel表格的读写(参考https://blog.csdn.net/weixin_51330175/article/details/122914074)
import xlrd # 导入xlrd模块
import xlwt # 导入xlwt模块
# 1 打开工作薄(workbook.xlsx)
excel_ = xlrd.open_workbook('D:PythonWorkSpacePython_study自动化处理excelworkbook.xlsx')
# 2 定位要读取内容的工作表
# 两种方法:(1)索引;(2)表的名字
Table = excel_.sheet_by_index(0) # 通过索引定位工作表,索引从0开始
Table_1 = excel_.sheet_by_name('Sheet1') # 通过表的名字定位工作表
# 3 打印工作表
# 根据行列读取内容 3种写法,本质都是读取某行某列的值
print(Table.cell_value(0,2))
print(Table_1.cell(0,2).value)
print(Table.row(0)[2].value)
# 4 保存工作表内容
# 首先生成工作簿和工作表(也可以在已有的工作簿上进行拷贝和编辑),然后编辑工作表内容后保存为excel文档
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet('Python')
worksheet.write(0,0,'Python') # write(行,列,写入的内容)
workbook.save('D:Python工作簿.xls') #注意这里保存的工作簿格式为xls
关于调取百度地图API的信息
在调用百度地图API之前,需要先申请百度地图的AK,申请地址:https://lbsyun.baidu.com/apiconsole/key?application=key#/home
方法图解如下:
1.先创建应用
2.填写相关信息
3.全部填写完成后提交
4.创建好应用后可复制AK
首先去百度地图API官网:https://lbsyun.baidu.com/index.php?title=webapi找到路线规划以及地点检索的信息,其中服务介绍和说明文档介绍的比较详细,建议仔细阅读。
然后景点美食等信息需要用到地点检索,具体方式为
1.拷贝检索接口网址
2.调用Python中的requests和json工具箱,访问该网址并读取相关信息,注意网址内容需要部分修改,代码如下:
import requests
import json
def get_path_info(origin, destination, ak):
origin_info = requests.get('http://api.map.baidu.com/geocoding/v3/?address={}&output=json&ak={}'.format(origin, ak))
origin_coordinates = str(json.loads(origin_info.text)['result']['location']['lat']) + ',' + str(json.loads(origin_info.text)['result']['location']['lng']) if json.loads(origin_info.text)['status'] == 0 else print('origion not found')
destination_info = requests.get('http://api.map.baidu.com/geocoding/v3/?address={}&output=json&ak={}'.format(destination, ak))
destination_coordinates = str(json.loads(destination_info.text)['result']['location']['lat'])+','+str(json.loads(destination_info.text)['result']['location']['lng']) if json.loads(destination_info.text)['status'] == 0 else print('destination not found')
raw_info = requests.get('https://api.map.baidu.com/directionlite/v1/driving?origin={}&destination={}&ak={}'.format(origin_coordinates, destination_coordinates, ak))
path_info = [json.loads(raw_info.text)['result']['routes'][0]['distance'], json.loads(raw_info.text)['result']['routes'][0]['duration']] if json.loads(raw_info.text)['status'] == 0 else print('path not found')
return path_info
def get_destination_characteristic(destination, ak):
scenic_spot = requests.get(
'https://api.map.baidu.com/place/v2/search?query={}景点&tag=景点&scope=2®ion={}&output=json&ak={}'.format(destination, destination, ak))
scenic_spot_info = json.loads(scenic_spot.text)['results']
res_scenic_spot_info = ['、'.join(list(item['name'] for item in scenic_spot_info))]
cate = requests.get(
'https://api.map.baidu.com/place/v2/search?query={}美食&tag=美食&scope=2®ion={}&output=json&ak={}'.format(destination, destination, ak))
cate_info = json.loads(cate.text)['results']
res_cate_info = ['、'.join(list(item['name'] for item in cate_info))]
return [res_scenic_spot_info, res_cate_info]
效果展示
包含旅游节点的excel:
最终生成的旅游信息汇总excel:
import json
import requests
import xlrd
import xlwt
from xlutils.copy import copy
def get_travel_data(excel_path):
rb = xlrd.open_workbook(excel_path)
row_list = []
sh = rb.sheet_by_name("Sheet1") # 读取工作表
for i in range(1, sh.nrows):
row_list.insert(i, sh.row_values(i))
return row_list
def write_travel_info(excel_path, res_distance, res_duration, playability):
rb = xlrd.open_workbook(excel_path)
wb = copy(rb)
sheet = wb.get_sheet(0)
for i in range(len(res_distance)):
sheet.write(i + 1, 3, res_distance[i] / 1000)
sheet.write(i + 1, 4, res_duration[i] / 3600)
sheet.write(i + 1, 5, playability[i][0])
sheet.write(i + 1, 6, playability[i][1])
wb.save(excel_path)
def get_path_info(origin, destination, ak):
origin_info = requests.get('http://api.map.baidu.com/geocoding/v3/?address={}&output=json&ak={}'.format(origin, ak))
origin_coordinates = str(json.loads(origin_info.text)['result']['location']['lat']) + ',' + str(json.loads(origin_info.text)['result']['location']['lng']) if json.loads(origin_info.text)['status'] == 0 else print('origion not found')
destination_info = requests.get('http://api.map.baidu.com/geocoding/v3/?address={}&output=json&ak={}'.format(destination, ak))
destination_coordinates = str(json.loads(destination_info.text)['result']['location']['lat'])+','+str(json.loads(destination_info.text)['result']['location']['lng']) if json.loads(destination_info.text)['status'] == 0 else print('destination not found')
raw_info = requests.get('https://api.map.baidu.com/directionlite/v1/driving?origin={}&destination={}&ak={}'.format(origin_coordinates, destination_coordinates, ak))
path_info = [json.loads(raw_info.text)['result']['routes'][0]['distance'], json.loads(raw_info.text)['result']['routes'][0]['duration']] if json.loads(raw_info.text)['status'] == 0 else print('path not found')
return path_info
def get_destination_characteristic(destination, ak):
scenic_spot = requests.get(
'https://api.map.baidu.com/place/v2/search?query={}景点&tag=景点&scope=2®ion={}&output=json&ak={}'.format(
destination, destination, ak))
scenic_spot_info = json.loads(scenic_spot.text)['results']
res_scenic_spot_info = ['、'.join(list(item['name'] for item in scenic_spot_info))]
cate = requests.get(
'https://api.map.baidu.com/place/v2/search?query={}美食&tag=美食&scope=2®ion={}&output=json&ak={}'.format(
destination, destination, ak))
cate_info = json.loads(cate.text)['results']
res_cate_info = ['、'.join(list(item['name'] for item in cate_info))]
return [res_scenic_spot_info, res_cate_info]
if __name__ == '__main__':
ak = 'ojhiqgKiH0wtbOlu5Bzv5AuKuMmB7eOy' # ak需要去百度地图申请
excel_path = "./旅游计划1.0.xls"
TravData = get_travel_data(excel_path)
orig = [item[1] for item in TravData]
dest = [item[2] for item in TravData]
res_distance, res_duration, res_playability = [], [], []
for i in range(len(orig)):
path_info = get_path_info(orig[i], dest[i], ak)
characteristic_info = get_destination_characteristic(dest[i], ak)
res_distance.append(path_info[0])
res_duration.append(path_info[1])
res_playability.append(characteristic_info)
write_travel_info(excel_path, res_distance, res_duration, res_playability)
print("travel info generation completed, more info can be seen in the file:", excel_path)



