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

Geoplot绘制Choropleth地图报错:'Point'对象无'exterior'属性

问题分析与解决方案

错误原因

AttributeError: 'Point' object has no attribute 'exterior' 是因为 gplt.choropleth 仅支持多边形类型的GeoDataFrame,而你执行空间连接后得到的 dfsjoin 保留的是左表(点数据 gdf_call_details)的Point几何,无法满足 choropleth 对多边形边界(exterior)的绘制需求。

正确操作步骤

  1. 保留原有基础操作:完成CSV转点GeoDataFrame、导入网格多边形数据这两步(你的操作没问题)。
  2. 调整空间连接逻辑:
    以网格多边形为左表执行空间连接,确保结果保留多边形几何,同时匹配网格包含的点数据:
    # 用网格作为左表,匹配包含的点数据,保留所有网格(含无数据的网格)
    dfsjoin = gpd.sjoin(gridData, gdf_call_details, how='left', predicate='contains')
    
  3. 聚合数据到网格:
    一个网格可能包含多个点,需根据需求将InitialResponse聚合为每个网格的单一值(示例以均值为例,若为分类值可改用众数):
    # 按网格分组,计算InitialResponse的均值,同时保留网格几何
    grid_agg = dfsjoin.groupby(gridData.index).agg(
        InitialResponse_avg=('InitialResponse', 'mean'),
        geometry=('geometry', 'first')
    ).reset_index()
    
    # 转回GeoDataFrame,确保CRS与网格一致
    grid_agg_gdf = gpd.GeoDataFrame(grid_agg, geometry='geometry', crs=gridData.crs)
    
    # 处理无数据网格的空值(可选)
    grid_agg_gdf['InitialResponse_avg'] = grid_agg_gdf['InitialResponse_avg'].fillna(0)
    
  4. 绘制Choropleth地图:
    使用聚合后的网格多边形GeoDataFrame调用绘图函数:
    gplt.choropleth(grid_agg_gdf, hue="InitialResponse_avg",
                    linewidth=.1, scheme=scheme, cmap='inferno_r',
                    legend=True, edgecolor='black', ax=ax )
    

补充说明

  • 若InitialResponse是分类字段,可改用众数聚合:
    from scipy.stats import mode
    grid_agg = dfsjoin.groupby(gridData.index).agg(
        InitialResponse_mode=('InitialResponse', lambda x: mode(x, keepdims=True)[0][0]),
        geometry=('geometry', 'first')
    ).reset_index()
    
  • 空间连接的predicate参数:用contains确保仅匹配网格内部的点,how='left'保证所有网格都能被保留(即使无匹配点)。

内容的提问来源于stack exchange,提问作者Sven D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:07:48