栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

AutoTravel

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

AutoTravel

AutoTravel--自助式旅游系统
    • 制作背景
    • 功能现状
    • Python读写Excel工作表
    • 关于调取百度地图API的信息
    • 驾车路径和时间信息获取
    • 效果展示
    • 附录:全部功能的代码

制作背景

本人平时很少出去旅游,但临近毕业了突然有了出去自驾游的想法,想去的地方很多但又不知道那些地方有哪些好玩的、好吃的点,然后关于自驾游的驾驶距离与时间也是本人比较在意的地方。但是目前网络上的各种旅游攻略太多太杂,寻找有参考性的攻略犹如大海捞针。所以本人决定自己开发一款自助旅游系统,如果成功的话又有成就感又能解决实际问题,很舒服。目前的功能比较局限,仅能从规定的路线结合百度地图API寻找到与旅游景点相关的信息。未来加入各种功能以后,相信可以真正方便到大家,让各位有更好旅游体验。

功能现状

目前基于Python编程语言搭建了旅游资源的excel数据加载,自驾里程、时间和景点、美食等信息获取、旅游信息保存等模块。首先在excel中输入自己规划好的旅游节点(必须百度地图可以搜到),运行程序后得到旅游的中间信息,随后根据中间信息自己调整路线。

未来想法:
1.将路径规划加入到功能中来,仅用收集到想要去玩的地方,就能自己规划好最优的旅游路径;
2.让路径规划算法能够加入时间、路程等约束。
3.能够根据各种平台上对于美食、景点的评分来对于中间节点做一个更综合的评价,依据该评价和之前提到的时间、路程约束自动剔除可玩性不高的中间节点。
4.结合计算机视觉和中国地图,在生成旅游路线后能够在地图上生成最终旅游计划的轨迹,即可视化。

Python读写Excel工作表

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)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/949615.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号