基于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)
相关推荐
阿米亚波23 分钟前
【C++ STL】std::unordered_multiset
开发语言·数据结构·c++·笔记·stl
丙氨酸長鏈29 分钟前
[Bukkit插件开发]手持发射器箭矢机枪 教学文档 面向Python/C#开发者入门Java与Bukkit API
java·python·c#
我是唐青枫33 分钟前
Java ReentrantLock 实战详解:比 synchronized 更灵活的可重入锁
java·开发语言
QH1392923188043 分钟前
# R&S ZNB43 ZNA43 ZNA67矢量网络分析仪
开发语言·网络·php
旋生万物1 小时前
电磁力 = 螺旋联络的 90° 旋转?麦克斯韦方程组的几何重构
人工智能·python·算法·机器学习·copilot·世界模型·物理ai
久久学姐1 小时前
【AI问答】python引入其他模块的对象
python·绝对导入·相对导入·目录结构·模块导入
脚踏实地皮皮晨2 小时前
003003001_Grid控件
开发语言·windows·算法·c#·visual studio
十年磨剑走天涯2 小时前
C++ STL 容器操作复杂度速查表
开发语言·c++
always_TT2 小时前
【Python requirements.txt 依赖管理】
开发语言·python
15Moonlight2 小时前
C++进阶(09):特殊类设计
开发语言·c++