使用tidyverse与sf包转换UTM至十进制坐标时保留uniqueID的方法
保留uniqueID的UTM转十进制坐标方法
在用tidyverse和sf包将UTM坐标转换为十进制坐标时,调用st_coordinates()会直接返回坐标矩阵,导致丢失uniqueID这类属性列。如果需要保留该列用于关联其他数据框,不用st_coordinates()也能轻松提取经纬度,以下是两种可行方法:
方法一:用mutate直接提取坐标列
在转换后的sf对象上,通过st_coordinates()按列提取经纬度,添加为新列,最后可选择移除几何列转为普通数据框:
library(tidyverse) library(sf) dat <- data.frame( uniqueID = seq(1,5,1), UTM_X = c(305334,NA,302685,300026,298030), UTM_Y = c(5320733,5320926,NA,5320882,5321002) ) dat_sf <- dat %>% na.omit() %>% st_as_sf(coords = c('UTM_X','UTM_Y'), crs = 32616) %>% st_transform(crs = 4326) %>% # 提取经纬度到新列 mutate( lon = st_coordinates(.)[,1], lat = st_coordinates(.)[,2] ) %>% # 可选:移除几何列,转为普通data.frame st_drop_geometry() dat_sf #> uniqueID lon lat #> 1 1 -89.61023 48.01022 #> 2 4 -89.68139 48.00992 #> 3 5 -89.70818 48.01037
方法二:用unnest_wider拆分几何对象
把sf对象的几何列拆分为单独的经纬度列,再重命名并移除几何列:
dat_sf <- dat %>% na.omit() %>% st_as_sf(coords = c('UTM_X','UTM_Y'), crs = 32616) %>% st_transform(crs = 4326) %>% # 将几何对象存入新列 mutate(coords = st_geometry(.)) %>% # 拆分几何列为X/Y列 unnest_wider(coords, names_sep = "_") %>% # 重命名为lat/lon rename(lon = coords_X, lat = coords_Y) %>% st_drop_geometry() dat_sf
两种方法都能完整保留uniqueID列,输出结果符合理想格式,方便后续关联其他数据框。
内容的提问来源于stack exchange,提问作者tassones
相关产品推荐
相关产品推荐

