Преобразуйте координаты DMS в десятичные градусы в R

#r #coordinates #gis #sf #sp

Вопрос:

У меня есть следующие координаты в формате DMS. Мне нужно перевести их в десятичные градусы.

 # Libraries
> library(sp)
> library(magrittr)

# Latitide amp; Longitude as strings
> lat <- '21d11m24.32s'
> lng <- '104d38m26.88s'
 

Я пытался:

 > lat_d <- char2dms(lat, chd='d', chm='m', chs='s') %>% as.numeric()
> lng_d <- char2dms(lng, chd='d', chm='m', chs='s') %>% as.numeric()

> print(c(lat_d, lng_d))
[1]  21.18333 104.63333
 

Хотя это близко, этот результат отличается от результатов, которые я получаю с этого веб-сайта. Согласно этому сайту, правильный вывод должен быть:

Широта: 21.190089

Долгота: 104.6408

Похоже, что sp::char2dms и as.numeric округляют координаты. Я заметил эту проблему при преобразовании большой партии координат DMS с помощью этого метода, потому что количество уникальных значений резко уменьшается после преобразования.

Ответ №1:

Вы правы! По правде говоря, я не заметил этой проблемы. Чтобы обойти это, вот решение с использованием пакета measurements :

РЕПРЕКС:

 install.packages("measurements") 
library(measurements)

lat <- conv_unit('21 11 24.32', from = "deg_min_sec", to = "dec_deg")
long <- conv_unit('104 38 26.88' , from = "deg_min_sec", to = "dec_deg")

print(c(lat, long))
#> [1] "21.1900888888889" "104.6408"
 

Создано 2021-10-07 пакетом reprex (v2.0.1)


Правка из ОП

Это также можно решить, добавив 'N' или 'S' к широте и 'E' или 'W' к долготе.

 # Add character to lat amp; long strings
> lat_d <- char2dms(paste0(lat,'N'), chd='d', chm='m', chs='s') %>% as.numeric()
> lng_d <- char2dms(paste0(lng,'W'), chd='d', chm='m', chs='s') %>% as.numeric()
> print(c(lat_d, lng_d))
[1]   21.19009 -104.64080
 

Комментарии:

1. Большое вам спасибо за ваш поучительный отзыв @Arturo Sbr

2. Спасибо! Я добавил альтернативное решение к вашему ответу. Оказывается, это sp округляет входные данные, если в строках отсутствует последний символ (N, S, W или E).