基于folium做地图可视化

由于内网环境,缺少地图~所以就考虑了使用folium+geojson来做简单的可视化.

python 复制代码
import json
import folium
with open('天津市.json', 'r', encoding='utf-8') as f:
    china_geojson = json.load(f)

# 创建一个没有背景瓦片的地图对象
m = folium.Map(location=[35, 105], zoom_start=4, tiles=None)

# 添加geojson数据到地图中
folium.GeoJson(
    china_geojson,
    style_function=lambda feature: {
        'fillColor': '#ffff00',
        'color': 'black',
        'weight': 2,
        'dashArray': '5, 5'
    }
).add_to(m)

# 在notebook中展示地图
m

使用pandas读取位置数据,然后可视化.

python 复制代码
def visualize_trajectory(data):
    # 创建一个Folium地图对象
    with open('天津市.json', 'r', encoding='utf-8') as f:
        china_geojson = json.load(f)

    # 创建一个没有背景瓦片的地图对象
    m = folium.Map(location=[35, 105], zoom_start=4, tiles=None)
    # 添加geojson数据到地图中
    folium.GeoJson(
        china_geojson,
        style_function=lambda feature: {
            'fillColor': '#ffff00',
            'color': 'black',
            'weight': 2,
            'dashArray': '5, 5'
        }
    ).add_to(m)

    # 对于每个轨迹点,添加标记
    for i in range(len(data)):
        folium.Marker(location=[data['Latitude'].iloc[i], data['Longitude'].iloc[i]], popup=data['User_ID'].iloc[i]).add_to(m)

    # 使用轨迹点创建一条线,表示移动路径
    for i in range(len(data) - 1):
        folium.PolyLine([[data['Latitude'].iloc[i], data['Longitude'].iloc[i]], [data['Latitude'].iloc[i + 1], data['Longitude'].iloc[i + 1]]], color='blue', weight=2).add_to(m)

    # 返回可视化的地图
    return m

模拟:

复制代码
visualized_map = visualize_trajectory(example_df)
visualized_map
复制代码
模拟数据生成脚本:
python 复制代码
import pandas as pd
import random
import time

def generate_user_ids(num_users):
    """生成指定数量的用户ID"""
    return [f"User_{i}" for i in range(num_users)]

def generate_timestamps(start_time, num_points):
    """生成一系列连续的时间戳"""
    return [start_time + i for i in range(num_points)]

def generate_random_point(center_lat, center_lon, max_distance):
    """生成在给定经纬度为中心,指定距离范围内的随机经纬度点"""
    # 将距离转换为角度
    max_distance_angle = max_distance / 6371.0

    # 生成随机角度
    dlat = random.uniform(-max_distance_angle, max_distance_angle)
    dlon = random.uniform(-max_distance_angle, max_distance_angle)

    # 计算新的经纬度
    new_lat = center_lat + dlat
    new_lon = center_lon + dlon

    return (new_lat, new_lon)

def simulate_trajectory(num_users, start_time, num_points, center_lat, center_lon, max_distance):
    """生成轨迹数据"""
    user_ids = generate_user_ids(num_users)
    all_data = []

    for user_id in user_ids:
        timestamps = generate_timestamps(start_time, num_points)
        current_point = (center_lat, center_lon)

        for timestamp in timestamps:
            current_point = generate_random_point(*current_point, max_distance)
            all_data.append([user_id, timestamp] + list(current_point))

    # 创建DataFrame
    columns = ['User_ID', 'Timestamp', 'Latitude', 'Longitude']
    df = pd.DataFrame(all_data, columns=columns)
    return df
# #############
#example_df = simulate_trajectory(122, int(time.time()), 10, 39.129484,117.220074, 1000)
相关推荐
zone77396 小时前
001:简单 RAG 入门
后端·python·面试
F_Quant6 小时前
🚀 Python打包踩坑指南:彻底解决 Nuitka --onefile 配置文件丢失与重启报错问题
python·操作系统
允许部分打工人先富起来7 小时前
在node项目中执行python脚本
前端·python·node.js
IVEN_7 小时前
Python OpenCV: RGB三色识别的最佳工程实践
python·opencv
haosend8 小时前
AI时代,传统网络运维人员的转型指南
python·数据网络·网络自动化
曲幽8 小时前
不止于JWT:用FastAPI的Depends实现细粒度权限控制
python·fastapi·web·jwt·rbac·permission·depends·abac
IVEN_1 天前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
Ray Liang1 天前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
AI攻城狮1 天前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling1 天前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python