You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用pydeck实现folium风格的MarkerClusters图标聚类?

使用PyDeck实现类似Folium的MarkerCluster标记聚类效果

完全可以用PyDeck实现和Folium MarkerCluster一致的“缩放聚合-放大散点”效果,同时解决同位置点的堆叠问题,具体实现如下:

核心思路

通过PyDeck的ClusterLayer实现低缩放级别下的标记聚合,搭配ScatterplotLayer(或自定义图标层)在高缩放级别显示单个测量点,同时通过参数配置避免中间层级的堆叠问题。

代码实现示例

import pydeck as pdk
import pandas as pd
import numpy as np

# 加载你的测量数据集(确保包含longitude、latitude字段)
df = pd.read_csv("your_measurement_data.csv")

# 可选:给完全重合的点添加微小偏移,避免渲染堆叠
df["longitude"] += np.random.normal(0, 0.0001, size=len(df))
df["latitude"] += np.random.normal(0, 0.0001, size=len(df))

# 聚类层:低缩放级别显示聚合标记
cluster_layer = pdk.Layer(
    "ClusterLayer",
    data=df,
    get_position="[longitude, latitude]",
    get_color="[220, 40, 0, 180]",  # 聚合标记颜色
    get_radius=150,  # 聚类半径(单位:米),可根据地图范围调整
    pickable=True,
    # 设置聚合规则:统计每个簇的测量点数量,也可改为SUM/MEAN等
    aggregation=pdk.types.String("COUNT"),
    # 控制显示范围:仅在缩放级别<10时显示聚类
    zoom_range=[0, 10],
)

# 单个标记层:高缩放级别显示独立测量点
scatter_layer = pdk.Layer(
    "ScatterplotLayer",
    data=df,
    get_position="[longitude, latitude]",
    get_radius=80,  # 单个标记半径
    get_color="[0, 80, 200, 120]",  # 单个标记颜色
    pickable=True,
    # 控制显示范围:仅在缩放级别>=10时显示散点
    zoom_range=[10, 20],
)

# 初始化地图视图中心(基于数据均值)
view_state = pdk.ViewState(
    latitude=df["latitude"].mean(),
    longitude=df["longitude"].mean(),
    zoom=6,
    pitch=0,
)

# 创建地图并配置 tooltip
r = pdk.Deck(
    layers=[cluster_layer, scatter_layer],
    initial_view_state=view_state,
    tooltip={
        "html": """
        <b>测量点数量:</b> {point_count}<br>
        <b>平均测量值:</b> {measurement_value_mean:.2f}
        """,
        "style": {"backgroundColor": "white", "color": "black"}
    }
)

# 导出为HTML文件或直接在Jupyter中显示
r.to_html("measurement_cluster_map.html")

解决同位置点堆叠问题的关键配置

  1. 严格控制层级显示范围:通过zoom_range参数让聚类层和散点层完全分离显示,避免中间缩放层级同时出现聚合标记和散点导致的堆叠;
  2. 调整聚类半径:如果同位置点在低缩放级别仍出现堆叠,适当增大ClusterLayer的get_radius值,让重合点更早聚合成单个簇;
  3. 添加微小随机偏移:对完全重合的经纬度添加极小的随机值(如±0.0001),既不影响地图精度,又能避免渲染时的完全重叠。

如果需要使用自定义图标替代散点,可将ScatterplotLayer替换为IconLayer,配置get_icon参数加载自定义图标即可。

内容的提问来源于stack exchange,提问作者Timothy W. Hilton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:42:48