R使用urbnmapr包匹配点与县界FIPS编码结果异常排查
问题根因与修复方法
匹配全部失效、所有点落到同一个FIPS的核心问题是经纬度列的数值填反了,其次是CRS转换操作存在误区:
- 纬度(南北方向)的取值范围仅为-90°~90°,你原始数据中名为
lat的列存的是-100.92、-78.09、-96.96这类西经数值,其中-100.92已经超出纬度的合法取值范围,本质是经度数据;名为lon的列存的35.35、37.71、38.52才是北纬的纬度数值。坐标列和数值完全错位,导致转换后所有点位置偏移到同一块区域。 - 你提到修改县界数据CRS时几何数值不变,是因为误用了
st_crs() <-直接覆写CRS标记的操作——这种方式不会对几何做重投影计算,只会改元数据,必须用st_transform()才能真正完成坐标转换、统一两套数据的参考系。
正确实现代码
library(sf) library(urbnmapr) library(dplyr) # 加载县级边界数据 counties_sf <- get_urbn_map(map = "counties", sf = TRUE) # 修正经纬度列与数值的对应关系 df <- data.frame( value = c(5, 7, 8), lon = c(-100.92, -78.09, -96.96), lat = c(35.35, 37.71, 38.52) ) # 构造点要素并做坐标转换,直接复用县界数据的CRS避免手动输错编码 df_sf <- df %>% st_as_sf(coords = c("lon", "lat"), crs = 4326) %>% st_transform(crs = st_crs(counties_sf)) # 空间连接匹配县FIPS编码 fips_place <- st_join(df_sf, counties_sf)
运行后三个点会分别匹配到俄克拉荷马州、弗吉尼亚州、堪萨斯州的对应县,不会再出现全匹配到同一个FIPS的问题。
内容的提问来源于stack exchange,提问作者Nazer
相关产品推荐
相关产品推荐

