如何用Tidycensus获取特定城市的小地理单元(tract、Block Group)数据?
解决Tidycensus获取特定城市小地理单元数据的问题
方案1:通过城市行政边界筛选(精准匹配城市范围)
这个方法先获取城市的行政边界,再用空间筛选把落在边界内的tract/block group挑出来,适合需要严格城市范围的场景。
- 加载所需包
library(tidycensus) library(tigris) library(sf)
- 获取目标城市的行政边界
以迈阿密市为例,用tigris::places()函数获取佛罗里达州的城市边界,再筛选出迈阿密:
# 获取佛罗里达州所有城市边界 fl_places <- places(state = "FL", year = 2020, class = "sf") # 筛选迈阿密市 miami_city <- fl_places[fl_places$NAME == "Miami", ]
- 获取目标县的tract数据(先缩小范围到城市所在的县,减少数据量)
miami_tracts <- get_decennial( geography = "tract", variables = "P2_001N", state = "FL", county = "Miami-Dade", # 迈阿密市主要在这个县,无需覆盖三个县 geometry = TRUE, year = 2020 )
- 空间筛选:保留落在迈阿密市边界内的tract
用sf::st_filter()筛选与城市边界相交的tract(如果要严格保留完全在边界内的单元,把predicate改成st_within):
miami_city_tracts <- st_filter(miami_tracts, miami_city, predicate = st_intersects)
方案2:用Census Urban Areas筛选(宽松范围,适合无需精确行政边界的场景)
如果你接受Urban Areas的范围(比城市行政范围稍大,包含周边建成区),可以直接获取Urban Areas边界后筛选:
- 获取迈阿密对应的Urban Area边界
urban_areas <- get_decennial( geography = "urban area", variables = "P2_001N", year = 2020, geometry = TRUE ) # 筛选迈阿密的Urban Area miami_urban <- urban_areas[urban_areas$NAME == "Miami-Fort Lauderdale-Pompano Beach, FL Urban Area", ]
- 获取目标区域的tract数据(覆盖Urban Area涉及的县)
fl_tracts <- get_decennial( geography = "tract", variables = "P2_001N", state = "FL", county = c("Miami-Dade", "Broward", "Palm Beach"), geometry = TRUE, year = 2020 )
- 空间筛选Urban Area内的tract
miami_urban_tracts <- st_filter(fl_tracts, miami_urban, predicate = st_intersects)
注意事项
- 运行前确保已设置Census API密钥:
census_api_key("你的密钥", install = TRUE),密钥可在Census官网免费申请。 - 空间筛选的
predicate参数可按需调整:st_intersects(只要有交集就算)、st_within(完全在边界内)、st_contains(边界包含单元)。 - 若要获取Block Group数据,只需把
geography参数改成"block group",逻辑完全一致。
内容的提问来源于stack exchange,提问作者TeaNoMilk
相关产品推荐
相关产品推荐

