您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么用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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。