解决Folium地图中Geopandas地理CRS求质心的警告问题
解决Geopandas计算Centroid时的地理CRS警告问题
你在使用Pandas、Folium、Geopandas分析格鲁吉亚区域收入并绘制Choropleth地图时,遇到了以下警告:
UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.
问题原因
地理CRS(比如常用的WGS84,EPSG:4326)以经纬度为单位,属于球面坐标系,直接计算质心会因球面曲率导致结果偏差。必须先将几何数据转换为投影CRS(平面坐标系,单位为米/千米),再计算质心才能得到准确结果。
解决方案步骤
- 查看当前GeoDataFrame的CRS
- 选择适配格鲁吉亚区域的投影CRS
- 转换CRS并计算质心,若需在Folium地图显示,再将质心转回地理CRS
代码示例
import geopandas as gpd import folium # 加载你的格鲁吉亚区域地理数据(替换为实际路径) gdf = gpd.read_file("georgia_regions.shp") # 1. 查看当前数据的CRS print("当前CRS:", gdf.crs) # 2. 转换为适合格鲁吉亚的投影CRS(推荐EPSG:32638,UTM 38N,覆盖格鲁吉亚大部分区域) gdf_projected = gdf.to_crs(epsg=32638) # 3. 在投影CRS下计算质心 gdf_projected["centroid"] = gdf_projected.geometry.centroid # 4. 将质心转回地理CRS(Folium默认使用WGS84,即EPSG:4326) gdf_projected["centroid_wgs84"] = gdf_projected["centroid"].to_crs(epsg=4326) # 绘制Choropleth地图(使用原地理CRS的GeoDataFrame即可) map_georgia = folium.Map(location=[42.23, 43.36], zoom_start=7) # 格鲁吉亚中心经纬度 folium.Choropleth( geo_data=gdf, data=gdf, columns=["region_name", "average_income"], # 替换为你的字段名 key_on="feature.properties.region_name", fill_color="YlOrRd", legend_name="区域平均收入" ).add_to(map_georgia) # 添加质心标记到地图 for _, row in gdf_projected.iterrows(): folium.Marker( location=[row["centroid_wgs84"].y, row["centroid_wgs84"].x], popup=f"{row['region_name']}<br>收入: {row['average_income']}" ).add_to(map_georgia) # 保存地图 map_georgia.save("georgia_income_choropleth.html")
关键说明
- 投影CRS的选择:EPSG:32638是UTM分区投影,适配格鲁吉亚的纬度范围;若有更贴合的本地CRS也可使用
- 绘制Choropleth无需转换原数据CRS,因为Folium仅支持地理CRS的几何数据
- 质心必须转回地理CRS才能在Folium地图上正确定位
内容的提问来源于stack exchange,提问作者data science
相关产品推荐
相关产品推荐

