如何获取GeoDataFrame中全县Census Tract的整体中心点并解决CRS警告?
解决方法
核心思路
要解决centroid警告并获取全县整体中心点,分三步处理:
- 将地理坐标系(WGS84/EPSG:4326)转换为平面投影坐标系(避免球面坐标计算误差)
- 合并所有Tract的几何图形,得到全县的整体边界
- 计算整体边界的中心点,再转换回地理坐标系供Plotly使用
修改后的完整代码
import plotly.express as px import censusdis.data as ced from censusdis.datasets import ACS5 variable = 'B01001_001E' df = ced.download( dataset=ACS5, vintage=2022, download_variables=['NAME', variable], state='06', county='075', tract='*', with_geometry=True) df = df.set_index('NAME') df = df.dropna() # --- 新增自动获取全县中心点的代码 --- # 转换到全美通用的投影CRS(北美阿尔伯斯等面积投影,EPSG:5070) df_proj = df.to_crs(epsg=5070) # 合并所有Tract的几何,得到全县的整体边界 county_geometry = df_proj.geometry.unary_union # 计算全县边界的中心点(此时在投影坐标系下,无警告) county_centroid_proj = county_geometry.centroid # 转换回地理坐标系(WGS84/EPSG:4326),得到经纬度 county_centroid = county_centroid_proj.to_crs(epsg=4326) # 提取中心点的纬度和经度 center_lat = county_centroid.y center_lon = county_centroid.x # --- 新增代码结束 --- fig = px.choropleth_mapbox(df, geojson=df.geometry, locations=df.index, center={'lat': center_lat, 'lon': center_lon}, # 替换硬编码值 color=variable, color_continuous_scale="Viridis", mapbox_style="carto-positron", opacity=0.5, zoom=10) fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0}) fig.show()
关键细节说明
- 选择EPSG:5070的原因:这是针对北美地区的等面积投影坐标系,覆盖全美所有县,无需根据不同地区切换UTM分区,适配批量生成需求。
- unary_union的作用:把多个Tract的多边形合并成完整的全县边界几何,计算出的centroid才是整个县的中心,而非单个Tract的中心。
- 坐标系转换逻辑:投影坐标系下计算几何中心更准确,最后转回到WGS84是因为Plotly的MapBox默认使用经纬度坐标。
内容的提问来源于stack exchange,提问作者Ari
相关产品推荐
相关产品推荐

