在R中将DMS坐标转换为十进制度数

5
我有以下DMS格式的坐标,需要将它们转换为十进制度数。
# Libraries
> library(sp)
> library(magrittr)

# Latitide & 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::char2dmsas.numeric将坐标四舍五入了。我注意到这个问题是在使用此方法转换大批量DMS坐标时出现的,因为转换后唯一值的数量急剧减少。
1个回答

6

您说得对!实话告诉您,我没有注意到这个问题。

解决此问题的方法是使用 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)创建


OP编辑说明

这也可以通过在纬度上添加'N''S',在经度上添加'E''W'来解决。

# Add character to lat & 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

非常感谢您给予我们指导性意见,@Arturo Sbr。 - lovalery
1
谢谢!我在你的答案中添加了一种替代方案。结果发现,如果字符串缺少最后一个字符(N、S、W或E),sp会对输入进行四舍五入。 - Arturo Sbr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接