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

发布时间:2021-11-25 14:29:47 作者:iii
来源:亿速云 阅读:265
# 怎么用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


二、数据收集与处理

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字)

推荐阅读:
  1. 使用Python快速制作可视化报表的方法
  2. 怎么用Python制作表白图片

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

python

上一篇:ASP.NET站点构建的示例分析

下一篇:Python中pynput库怎么用

相关阅读

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

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