如何用R获取美国各州及郡县质心经纬度的数据框?
获取美国各州郡县质心数据框的解决方案
过去10-15年,不少人问过如何获取包含美国各州、郡县名称及对应质心经纬度的数据框,但很多旧方案依赖的R包或函数已经失效(比如废弃的GISTools包)。之前尝试的单个州示例(如北卡罗来纳州)存在两个问题:一是替换州名会报错(比如尝试弗吉尼亚州时,sf包自带数据中没有对应shape文件,会提示dsn为空);二是无法覆盖美国全部50个州。
以下是可直接获取全美国郡县质心数据的完整方案:
核心思路
放弃sf包自带的单个州测试数据,改用tigris包直接获取美国普查局官方的全国郡县边界数据,再通过sf包计算质心并提取经纬度,最终整理成目标格式的数据框。
完整代码实现
# 安装所需包(首次运行时执行) install.packages(c("sf", "tigris", "dplyr")) # 加载包 library(sf) library(tigris) library(dplyr) # 获取美国全部郡县的空间数据(返回sf格式对象) us_counties <- counties(class = "sf") # 转换为等面积投影(避免经纬度球面坐标系下质心计算的偏差) us_counties_proj <- st_transform(us_counties, crs = "ESRI:102003") # 计算每个郡县的质心 us_centroids <- st_centroid(us_counties_proj) # 转换回WGS84经纬度坐标系,并提取纬度、经度值 us_centroids_latlon <- st_transform(us_centroids, crs = 4326) %>% mutate( 纬度 = st_coordinates(.)[, 2], 经度 = st_coordinates(.)[, 1] ) # 整理成目标数据框:州名、郡县名、纬度、经度,移除空间属性转为普通数据框 result_df <- us_centroids_latlon %>% select(州名 = NAME, 郡县名 = COUNTY, 纬度, 经度) %>% st_drop_geometry() # 查看前6行结果 head(result_df)
关键说明
- 数据来源:
tigris包直接调用美国普查局的公开数据,包含全部50个州的郡县边界,无需手动下载shape文件。 - 投影转换:先转成等面积投影(ESRI:102003)计算质心,避免经纬度坐标系下的计算偏差,最后再转回常用的WGS84(EPSG:4326)经纬度格式。
- 错误原因:之前尝试调用
system.file('shape/va.shp', package = "sf")报错,是因为sf包仅自带北卡罗来纳州的测试数据,没有其他州的shape文件。
内容的提问来源于stack exchange,提问作者tassones
相关产品推荐
相关产品推荐

