如何使用 R 将 GPS 坐标中的小数点更改为 DMS(度、分、秒)

问题描述 投票:0回答:1

问题:

我有一个包含 GPS 坐标的数据框,其中不使用度和分的符号,而是以使用小数点的格式编写,这是不正确的:

enter image description here

我想将所有 GPS 坐标转换为 DMS(度、分、秒),所有坐标都以此格式写入:

27°57'67.9, 33°88'02.7

手动恢复所有 GPS 坐标是相当耗费人力的,因为坐标被写在两个单独的列中,超过 800 行。

我不知道如何进行此转换,我可以使用 R 将度数 (°) 和分 (') 的符号添加到数据框中的所有坐标。

在我的数据框中,一些 GPS 位置是未知的,它们以这种格式写入单元格中:

enter image description here

代码需要识别这些缺失的 GPS 位置。

如果有人可以提供帮助,我将非常感激

r gps arcgis data-conversion
1个回答
0
投票

“缺失”值的存在需要一些额外的步骤,因为坐标值列当前是字符串,但这是一个潜在的工作流程:

  • 创建函数将十进制度转换为可以处理 NA 值的度分秒
  • 将坐标列转换为数字,并将任何“遗漏”值转换为 NA
  • 将函数应用于坐标列
library(dplyr)
library(purrr)

# Function to convert DD to DMS
dd_to_dms <- function(x) {
  
  if (any(is.na(x))) { return(rep(NA, length(x))) }

  neg_dd <- x < 0
  abs_x <- abs(x)
  d <- floor(abs_x)
  m <- floor((abs_x - d) * 60)
  s <- ((abs_x - d) * 3600) %% 60
  
  dms <- sprintf("%d° %d' %.3f\"", d, m, s)
  dms[neg_dd] <- paste0("-", dms[neg_dd])
  
  return(dms)
  
}

# Example data
set.seed(1)
df <- data.frame(longitude = c("missed", round(runif(5, -180, 180), 5)),
                 latitude = c("missed", round(runif(5, -90, 90), 5)))

df
#   longitude  latitude
# 1    missed    missed
# 2 -84.41688  71.71014
# 3  -46.0354  80.04155
# 4  26.22721   28.9436
# 5  146.9548  23.24053
# 6 -107.3945 -78.87847

# Convert "missed" to NA and change coordinate columns to numeric
df <- df %>%
  mutate(across(c(longitude, latitude), ~ as.numeric(na_if(., "missed"))))

df
#    longitude  latitude
# 1         NA        NA
# 2  -84.41688  71.71014
# 3  -46.03540  80.04155
# 4   26.22721  28.94360
# 5  146.95480  23.24053
# 6 -107.39450 -78.87847

# Convert DD coordinates to DMS using dd_to_dms function
df <- df %>%
  mutate(across(c(longitude, latitude), ~ map_chr(as.numeric(.), dd_to_dms)))

df
#           longitude         latitude
# 1              <NA>             <NA>
# 2   -84° 25' 0.768"  71° 42' 36.504"
# 3    -46° 2' 7.440"   80° 2' 29.580"
# 4   26° 13' 37.956"  28° 56' 36.960"
# 5  146° 57' 17.280"  23° 14' 25.908"
# 6 -107° 23' 40.200" -78° 52' 42.492"
© www.soinside.com 2019 - 2024. All rights reserved.