Geoplot绘制Choropleth地图报错:'Point'对象无'exterior'属性
问题分析与解决方案
错误原因
AttributeError: 'Point' object has no attribute 'exterior' 是因为 gplt.choropleth 仅支持多边形类型的GeoDataFrame,而你执行空间连接后得到的 dfsjoin 保留的是左表(点数据 gdf_call_details)的Point几何,无法满足 choropleth 对多边形边界(exterior)的绘制需求。
正确操作步骤
- 保留原有基础操作:完成CSV转点GeoDataFrame、导入网格多边形数据这两步(你的操作没问题)。
- 调整空间连接逻辑:
以网格多边形为左表执行空间连接,确保结果保留多边形几何,同时匹配网格包含的点数据:# 用网格作为左表,匹配包含的点数据,保留所有网格(含无数据的网格) dfsjoin = gpd.sjoin(gridData, gdf_call_details, how='left', predicate='contains') - 聚合数据到网格:
一个网格可能包含多个点,需根据需求将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) - 绘制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
相关产品推荐
相关产品推荐

