使用 R 中的 birk 库转换为十进制度



我正在使用库sp,按照此处和此处的建议将度-分-秒(dms)表示转换为十进制度(dd)。

如果我使用 sp 尝试以下代码,结果如下:

loc$Lat<-sp::char2dms(loc$Lat)

rep(value, length.out = nrows) 中的错误: 尝试复制类型为"S4"的对象

我的数据示例如下:

    c("39d47m01s N", "15d38m08s N", "12d45m01s N", "13d17m25s N", 
    "36d34m29s N", "24d46m34s S", "11d52m39s S", "39d47m01s N", "30d52m34s N", 
    "34d59m47s S")

我需要从 dms 转换为 dd,因为我想计算点之间的哈弗辛(大圆距离)。

我也愿意使用其他软件包进行转换。

尝试使用库 birk,但它给了我一些毫无意义的答案,其中经度/经度大于 1000。在尝试 birk 之前,我已经将经度/经度表示转换为 birk 在其conv_unit函数中接受的表示形式

这可能已经关闭了,也许比我知识渊博的人可以插话,但在这里。

我从 R-help 邮件列表(6 年前)中找到了一个线程,该线程讨论了使用公式 Decimal degrees = Degrees + (Minutes/60) + (Seconds/3600) 从 DMS 转换为十进制度。

使用正则表达式找到合适的元素,我构造了一个 data.frame,用于应用上述公式。将南和西坐标乘以 -1 以使其为负数。

xy <- c("39d47m01s N", "15d38m08s N", "12d45m01s N", "13d17m25s N", 
  "36d34m29s N", "24d46m34s S", "11d52m39s S", "39d47m01s N", "30d52m34s N", 
  "34d59m47s S")
nxy <- data.frame(degs = as.numeric(gsub("(^\d+)(.+$)", "\1", xy)),
                  mins = as.numeric(gsub("(^.+d)(\d+)(m.+$)", "\2", xy)),
                  secs = as.numeric(gsub("(^.+m)(\d+)(s [A-Z]$)", "\2", xy)),
                  direction = gsub("(^.+ )([A-Z])$", "\2", xy))
nxy$indec <- with(nxy, degs + (mins/60) + (secs/3600))
nxy[nxy$direction %in% c("W", "S"), "indec"] <- nxy[nxy$direction %in% c("W", "S"), "indec"] * -1
nxy
   degs mins secs direction     indec
1    39   47    1         N  39.78361
2    15   38    8         N  15.63556
3    12   45    1         N  12.75028
4    13   17   25         N  13.29028
5    36   34   29         N  36.57472
6    24   46   34         S -24.77611
7    11   52   39         S -11.87750
8    39   47    1         N  39.78361
9    30   52   34         N  30.87611
10   34   59   47         S -34.99639

或者,你可以让char2dms为你工作。

nxy$char2dms <- as.numeric(sp::char2dms(xy, chd = "d", chm = "m", chs = "s"))
   degs mins secs direction     indec  char2dms
1    39   47    1         N  39.78361  39.78361
2    15   38    8         N  15.63556  15.63556
3    12   45    1         N  12.75028  12.75028
4    13   17   25         N  13.29028  13.29028
5    36   34   29         N  36.57472  36.57472
6    24   46   34         S -24.77611 -24.77611
7    11   52   39         S -11.87750 -11.87750
8    39   47    1         N  39.78361  39.78361
9    30   52   34         N  30.87611  30.87611
10   34   59   47         S -34.99639 -34.99639

我刚刚想通了。

尽管sp::char2dms接受称为chd, chm and chs的参数,这些参数应该让我们指定用于度,分和秒的分隔符,但它们似乎不起作用。

更改表示坐标的格式后,该函数按预期工作。因此,我只需要确保我的坐标采用 sp::char2dms 默认期望的格式,其形式为:

15d5'52.4394" N    145d40'26.04" E

度、分和秒的分隔符分别是 d、' 和 "。

最新更新