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

如何获取GeoDataFrame中全县Census Tract的整体中心点并解决CRS警告?

解决方法

核心思路

要解决centroid警告并获取全县整体中心点,分三步处理:

  1. 将地理坐标系(WGS84/EPSG:4326)转换为平面投影坐标系(避免球面坐标计算误差)
  2. 合并所有Tract的几何图形,得到全县的整体边界
  3. 计算整体边界的中心点,再转换回地理坐标系供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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:36:32