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

Folium + GeoPandas 渲染异常:几何要素已存在却提示缺失

Folium + GeoPandas 渲染异常:几何要素已存在却提示缺失

看起来你遇到的这个问题确实有点挠头——明明肉眼看着几何列都有对应的多边形,却还是触发了「无法渲染缺失几何的对象」的错误。我来帮你梳理几个大概率的排查方向,你可以逐一验证:

1. 几何列藏着看不见的缺失/无效值

有时候我们肉眼看到的“有值”可能不准,比如存在空几何或者无效几何对象。你可以运行以下代码快速排查:

# 检查几何列缺失值数量
print("缺失几何行数:", agg_gdf.geometry.isna().sum())
# 检查空几何行数
print("空几何行数:", agg_gdf.geometry.is_empty.sum())
# 检查无效几何行数
print("无效几何行数:", len(agg_gdf[~agg_gdf.geometry.is_valid]))

如果有缺失/空/无效的几何,先过滤掉这些行再试试:

agg_gdf_clean = agg_gdf[~agg_gdf.geometry.isna() & ~agg_gdf.geometry.is_empty & agg_gdf.geometry.is_valid]

2. GeoDataFrame的几何列被意外篡改

如果你的聚合操作(比如groupby)导致GeoDataFrame的结构被破坏,比如:

  • agg_gdf不再是GeoDataFrame类型(变成了普通DataFrame)
  • 几何列的名称被修改,或者没有被正确设置为几何列

你可以用以下代码确认:

# 确认是否还是GeoDataFrame
print("是否为GeoDataFrame:", isinstance(agg_gdf, gpd.GeoDataFrame))
# 确认几何列名称
print("当前几何列:", agg_gdf.geometry.name)

如果不是GeoDataFrame,或者几何列不对,重新设置即可:

agg_gdf = gpd.GeoDataFrame(agg_gdf, geometry="geometry", crs=agg_gdf.crs)

3. 尝试绕过GeoDataFrame直接传入GeoJSON字符串

有时候folium对GeoDataFrame的自动转换会有隐性问题,你可以手动把GeoDataFrame转成GeoJSON字符串再传入:

folium.GeoJson(
    agg_gdf.to_json(),  # 转成GeoJSON字符串
    name='geojson',
    style_function=lambda feature: {
        'fillColor': region_colors[feature["properties"]["region"]],
        'color': 'black',
        'weight': 2,
        'fillOpacity': 0.5,
    },
    tooltip=folium.features.GeoJsonTooltip(
        fields=["region"],
        aliases=["Region:"],
        localize=True,
    ),
    popup=folium.features.GeoJsonPopup(
        fields=["popup_info"],
        aliases=["Region:"],
        localize=True,
    ),
).add_to(base_map)

4. 聚合操作导致几何损坏

如果你的聚合逻辑(比如按日期和region分组)不小心对几何列做了错误的聚合(比如取第一个、合并等),可能会导致几何对象损坏。你可以对比gdf_raw.geometry和agg_gdf.geometry的几何对象,看是否有明显差异,比如形状、类型是否一致。

另外,你提到即使删掉日期和计数列还是报错,那可以重点排查几何列本身的问题,而不是额外字段。


附上你提供的代码片段:

问题代码:

folium.GeoJson(
    agg_gdf,
    name='geojson',
    style_function=lambda feature: {
        'fillColor': region_colors[feature["properties"]["region"]],
        'color': 'black',
        'weight': 2,
        'fillOpacity': 0.5,
    },
    tooltip=folium.features.GeoJsonTooltip(
        fields=["region"],
        aliases=["Region:"],
        localize=True,
    ),
    popup=folium.features.GeoJsonPopup(
        fields=["popup_info"],
        aliases=["Region:"],
        localize=True,
    ),
).add_to(base_map)

可正常运行的代码:

folium.GeoJson(
gdf_raw,
name='geojson',
style_function=lambda feature: {
    'fillColor': region_colors[feature["properties"]["region"]],
    'color': 'black',
    'weight': 2,
    'fillOpacity': 0.5,
},
tooltip=folium.features.GeoJsonTooltip(
    fields=["region"],
    aliases=["Region:"],
    localize=True,
),
popup=folium.features.GeoJsonPopup(
    fields=["region"],
    aliases=["Region:"],
    localize=True,
),
).add_to(base_map)

备注:内容来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:08:04