温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么用Python制作一份可视化的旅行攻略

发布时间:2021-11-25 14:29:47 来源:亿速云 阅读:283 作者:iii 栏目:大数据
# 怎么用Python制作一份可视化的旅行攻略 ## 引言 在数字化时代,规划旅行已经不再局限于纸质地图和手写笔记。Python作为强大的编程语言,能够帮助我们自动化数据收集、处理地理信息,并生成交互式可视化图表。本文将详细介绍如何用Python制作一份包含地图标记、行程路线、预算分析和景点评分的可视化旅行攻略。 --- ## 一、技术栈准备 ### 1.1 核心工具包 ```python # 基础数据处理 import pandas as pd import numpy as np # 地理信息处理 import geopandas as gpd from geopy.geocoders import Nominatim import folium # 交互式地图 import geopy.distance # 可视化 import matplotlib.pyplot as plt import seaborn as sns import plotly.express as px # 网络请求 import requests from bs4 import BeautifulSoup 

1.2 数据获取API

  • 地图服务:Google Maps API/高德地图API
  • 天气数据:OpenWeatherMap
  • 景点评价:TripAdvisor爬虫(需遵守robots.txt)

二、数据收集与处理

2.1 构建目的地数据集

# 示例数据结构 destinations = pd.DataFrame({ "name": ["埃菲尔铁塔", "卢浮宫", "塞纳河游船"], "category": ["地标", "博物馆", "活动"], "longitude": [2.2945, 2.3376, 2.2819], "latitude": [48.8584, 48.8606, 48.8566], "预算": [25, 17, 15], # 欧元 "建议时长": [2, 4, 1.5] # 小时 }) 

2.2 地理编码转换

geolocator = Nominatim(user_agent="travel_planner") location = geolocator.geocode("埃菲尔铁塔") print((location.latitude, location.longitude)) 

2.3 爬取实时数据(示例)

def get_weather(lat, lon): url = f"https://api.openweathermap.org/data/3.0/onecall?lat={lat}&lon={lon}&appid=YOUR_KEY" return requests.get(url).json() 

三、核心可视化实现

3.1 交互式地图标记

# 创建巴黎中心地图 m = folium.Map(location=[48.8566, 2.3522], zoom_start=13) # 添加标记 for idx, row in destinations.iterrows(): folium.Marker( [row['latitude'], row['longitude']], popup=f"<b>{row['name']}</b><br>预算:{row['预算']}€", tooltip=row['category'] ).add_to(m) # 保存为HTML m.save('paris_map.html') 

效果增强:

  • 使用不同颜色图标区分景点类型
  • 添加热力图显示景点密集区

3.2 行程路线优化

# 计算景点间距离矩阵 dist_matrix = np.zeros((len(destinations), len(destinations))) for i in range(len(destinations)): for j in range(len(destinations)): coords_1 = (destinations.iloc[i]['latitude'], destinations.iloc[i]['longitude']) coords_2 = (destinations.iloc[j]['latitude'], destinations.iloc[j]['longitude']) dist_matrix[i][j] = geopy.distance.distance(coords_1, coords_2).km # 可视化距离矩阵 plt.figure(figsize=(10,8)) sns.heatmap(dist_matrix, annot=True, xticklabels=destinations.name, yticklabels=destinations.name) plt.title("景点间距离矩阵(km)") 

3.3 三维预算分析

fig = px.scatter_3d( destinations, x='longitude', y='latitude', z='预算', color='category', size='建议时长', hover_name='name' ) fig.update_layout(scene_zaxis_title='预算(€)') fig.show() 

四、高级功能实现

4.1 自动生成行程表

def generate_schedule(df, start_time="09:00"): schedule = [] current_time = pd.to_datetime(start_time) for _, row in df.sort_values('预算', ascending=False).iterrows(): end_time = current_time + pd.Timedelta(hours=row['建议时长']) schedule.append({ "景点": row['name'], "开始时间": current_time.strftime("%H:%M"), "结束时间": end_time.strftime("%H:%M"), "位置": f"{row['latitude']:.4f}, {row['longitude']:.4f}" }) current_time = end_time + pd.Timedelta(minutes=30) # 添加交通时间 return pd.DataFrame(schedule) 

4.2 实时交通数据整合

# 使用Google Directions API def get_route(start, end, mode="walking"): url = f"https://maps.googleapis.com/maps/api/directions/json?origin={start}&destination={end}&mode={mode}&key=YOUR_KEY" return requests.get(url).json()['routes'][0]['overview_polyline']['points'] 

五、成果输出与部署

5.1 生成PDF报告

from fpdf import FPDF pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=12) pdf.cell(200, 10, txt="巴黎旅行攻略", ln=1, align='C') # 插入地图截图 pdf.image('map_snapshot.png', x=10, y=20, w=180) # 添加行程表 pdf.set_y(100) for _, row in schedule.iterrows(): pdf.cell(200, 10, txt=f"{row['开始时间']}-{row['结束时间']} {row['景点']}", ln=1) pdf.output("travel_plan.pdf") 

5.2 创建交互式仪表盘

import dash from dash import dcc, html app = dash.Dash(__name__) app.layout = html.Div([ html.H1("我的巴黎旅行仪表盘"), dcc.Graph(figure=fig), # 插入之前的plotly图形 html.Iframe(srcDoc=open('paris_map.html').read(), width='100%', height='600') ]) if __name__ == '__main__': app.run_server(debug=True) 

六、完整代码示例

# travel_planner.py import pandas as pd import folium from geopy.distance import distance class TravelPlanner: def __init__(self, city_center, zoom=13): self.map = folium.Map(location=city_center, zoom_start=zoom) self.destinations = pd.DataFrame(columns=['name','lat','lon','budget']) def add_destination(self, name, lat, lon, budget): new_row = {'name':name, 'lat':lat, 'lon':lon, 'budget':budget} self.destinations = pd.concat([self.destinations, pd.DataFrame([new_row])], ignore_index=True) def show_map(self): for _, row in self.destinations.iterrows(): folium.Marker( [row['lat'], row['lon']], popup=f"{row['name']}<br>预算:{row['budget']}€" ).add_to(self.map) return self.map # 使用示例 paris = TravelPlanner([48.8566, 2.3522]) paris.add_destination("埃菲尔铁塔", 48.8584, 2.2945, 25) paris_map = paris.show_map() paris_map.save('paris.html') 

七、实用建议

  1. 数据更新策略

    • 使用APScheduler设置定时任务更新天气数据
    • 缓存API响应减少请求次数
  2. 性能优化

    # 使用KDTree加速距离计算 from scipy.spatial import KDTree coords = destinations[['latitude','longitude']].values tree = KDTree(coords) 
  3. 错误处理

    try: response = requests.get(url, timeout=5) response.raise_for_status() except requests.exceptions.RequestException as e: print(f"请求失败: {e}") 

结语

通过Python实现的旅行攻略系统不仅能够动态展示地理信息,还能根据实时数据调整推荐方案。本文介绍的方法可以进一步扩展: - 加入机器学习进行个性化推荐 - 整合酒店预订API - 添加AR导航功能

“旅行不仅是到达目的地,更是用数据讲述旅途故事的过程。” —— 本文作者

完整项目代码:[GitHub仓库链接](示例) “`

(注:实际执行时需要替换API密钥和补充具体实现细节,本文共计约3850字)

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI