# 怎么用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
# 示例数据结构 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] # 小时 })
geolocator = Nominatim(user_agent="travel_planner") location = geolocator.geocode("埃菲尔铁塔") print((location.latitude, location.longitude))
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()
# 创建巴黎中心地图 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')
# 计算景点间距离矩阵 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)")
fig = px.scatter_3d( destinations, x='longitude', y='latitude', z='预算', color='category', size='建议时长', hover_name='name' ) fig.update_layout(scene_zaxis_title='预算(€)') fig.show()
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)
# 使用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']
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")
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')
数据更新策略:
性能优化:
# 使用KDTree加速距离计算 from scipy.spatial import KDTree coords = destinations[['latitude','longitude']].values tree = KDTree(coords)
错误处理:
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字)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。