You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:24:56