Как исправить функцию, которая рассчитывает расстояние между двумя координатами - PullRequest
0 голосов
/ 03 февраля 2019

В настоящее время у меня есть столбец координат (CHR) и долготы и широты (NUM).Я хочу создать функцию, которая позволяет находить расстояние между каждыми двумя координатами.как расстояние между 1-й и 2-й координатой, 2-й и 3-й, и так далее.Я попробовал оба способа создать его.

data$new.Distance[2:n] <- distm(data$Coord[1:(n-1)], data$Coord[2:n], fun = distMeeus)
data$new.Distance[2:n] <- distm(
    c(data$longitude[1:(n-1)], data$latitude[1:(n-1)]), 
    c(data$longitude[2:n], data$latitude[2:n]), 
    fun = distMeeus
)

и получил сообщение об ошибке:

ERROR in N-1: non-numeric argument to binary operator. 

Как это исправить?или есть другой способ создать это в R?Спасибо.

1 Ответ

0 голосов
/ 03 февраля 2019

Если вы задаете вопрос, пожалуйста, включите пример данных.

p <- rbind(c(0,0),c(90,90),c(10,10),c(-120,-45))
colnames(p) <- c("lon", "lat")
p
#      lon lat
#[1,]    0   0
#[2,]   90  90
#[3,]   10  10
#[4,] -120 -45

Чтобы получить расстояние от первой до второй точки, второй до третьей точки и т. Д., Вы можете сделать

library(geosphere)
distGeo(p)    
#[1] 10001966  8896111 13879039

или

distMeeus(p)    
#[1] 10001959  8896115 13879009

Чтобы получить расстояние от всех (длинных / длинных) точек до всех точек, вы можете использовать geosphere::distm;предоставление функции выбора расстояния (distGeo является значением по умолчанию и наиболее точным).

library(geosphere)
distm(p, fun=distGeo)
#         [,1]     [,2]     [,3]     [,4]
#[1,]        0 10001966  1565109 12317881
#[2,] 10001966        0  8896111 14986910
#[3,]  1565109  8896111        0 13879039
#[4,] 12317881 14986910 13879039        0

Вы также можете использовать raster::pointDistance.

library(raster)
d <- pointDistance(p, lonlat=TRUE)

as.dist(d)
#         1        2        3
#2 10001966                  
#3  1565109  8896111         
#4 12317881 14986910 13879039

Также возможнополучить расстояния между двумя наборами точек, возможно, с разным количеством точек.Например:

pointDistance(p, p[1:2,], lonlat=TRUE)
#         [,1]     [,2]
#[1,]        0 10001966
#[2,] 10001966        0
#[3,]  1565109  8896111
#[4,] 12317881 14986910
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...