tidycensus返回面积与sf::st_area()计算结果不一致问题咨询
差异原因
两类面积数值不匹配不是操作疏漏,核心是统计口径、数据基础、计算逻辑完全不同,不存在天然对齐的可能,具体差异点:
ALAND是美国人口普查局官方预先测算发布的法定陆域面积权威值:统计时已完全剔除行政边界内的内陆水域、近岸管辖海域面积,采用官方指定的等积测算标准、最高精度法定边界计算,是所有公开人口统计平台通用的标准口径,因此换算后和公开平台展示的德克萨斯州陆域面积完全一致。sf::st_area()计算结果偏差来自三个层面:- 统计范围不一致:默认拉取的行政边界几何包含陆域和范围内所有水域,没有做水域擦除,覆盖范围本身就大于陆域范围;
- 边界精度不一致:tidycensus依赖tigris包返回的几何数据默认做了边界概化简化,目的是压缩数据体积、提升加载速度,并非用于法定面积测算的最高精度边界;
- 计算基准不一致:默认返回的几何采用WGS84地理坐标系(EPSG:4269,经纬度坐标),直接调用
st_area()计算的是椭球面面积,和普查局测算ALAND时使用的投影平面面积计算基准存在偏差。
你观测到的11596365232平方米差值,基本就是德克萨斯州范围内的水域面积叠加边界简化、坐标基准偏差的总和。
对齐方案
- 首选方案:直接使用数据集自带的
ALAND字段计算人口密度。这是人口统计领域通用的标准口径,结果和所有公开平台展示值完全匹配,无需额外自行计算面积,效率和准确率最高。 - 若必须通过
st_area()计算面积,按以下步骤调整可将误差缩小到可接受范围,但无法做到和官方ALAND值100%一致:- 拉取数据时关闭边界简化,使用高精度TIGER/Line边界,设置参数
cb = FALSE,同时通过tigris包全局配置关闭简化规则; - 将几何对象转换为北美区域通用的等积投影(如EPSG:5070北美阿尔伯斯等积投影);
- 额外拉取对应行政单元的水域面图层,从行政边界几何中擦除全部水域范围后,再调用
st_area()计算陆域面积。
- 拉取数据时关闭边界简化,使用高精度TIGER/Line边界,设置参数
调整后的参考代码:
library(tidyverse) library(tidycensus) library(sf) library(tigris) census_api_key("your_api_key") options(tigris_use_cache = TRUE) # 关闭边界自动简化 tigris_options(tigris_simplify = FALSE) pop_texas <- get_acs( geography = 'state', variables = "B01003_001", # 总人口 year = 2020, survey = 'acs5', keep_geo_vars = TRUE, geometry = TRUE, cb = FALSE # 调用高精度TIGER边界,而非制图简化版边界 ) %>% filter(GEOID == '48') %>% # 筛选德克萨斯州 st_transform(crs = 5070) # 转换为等积投影 # 注意:此时计算结果为包含水域的总面积,仍需擦除水域才能接近ALAND值 sf::st_area(pop_texas)
提示:官方测算
ALAND使用的边界精度阈值、水域剔除细则、计算参数未完全公开,自行计算的面积永远无法和官方值完全匹配,做常规人口统计分析时直接调用ALAND字段是最优选择。
内容的提问来源于stack exchange,提问作者Chris Kiniry
相关产品推荐
相关产品推荐

