2016-03-20 19 views
1

Ich versuche, die Funktion distHavrsine in R innerhalb einer Schleife zu verwenden, um den Abstand zwischen einigen Längen- und Breitenkoordinaten für mehrere hundert Zeilen zu berechnen. In meiner Schleife habe ich diesen Code:Wie funktioniert die distHaversine Funktion?

if ((distHaversine(c(file[i,"long"], file[i,"lat"]), 
        c(file[j,"long"], file[j,"lat"]))) < 50) 

wonach, wenn der Abstand weniger als 50 Meter Ich möchte es die Zeilen aufnehmen, und wo die Breiten- und Längenkoordinaten ist es Referenzierung wie folgt aussehen:

0.492399367 30.42530045 

und

0.496899361 30.42497045 

aber ich bekomme diese Fehlermeldung

Fehler in .pointsToMatrix (p1): Breitengrad> 90

+0

Bitte beachten Sie ein kleines reproduzierbares Beispiel – akrun

+0

Mögliches Duplikat zu bieten [Wie den nächsten Abstand zwischen zwei verschiedenen Datenrahmen mit Haversine finden] (https://stackoverflow.com/questions/44608687/how-find-the-nearest-distance-between-two-different-data-frames-using-haversi) –

Antwort

4

erhalte ich diesen Fehler "Fehler in .pointsToMatrix (p1): Breitengrad> 90". Kann jemand erklären, warum und wie zu lösen?

Der Fehler sagt Ihnen, dass Sie Breite bekam Werte größer als 90, die außerhalb des Bereichs ist:

library(geosphere) 
distHaversine(c(4,52), c(13,52)) 
# [1] 616422 
distHaversine(c(4,52), c(1,91)) 
# Error in .pointsToMatrix(p2) : latitude > 90 

Sie dieses Problem nur lösen können, indem distHaversine mit Koordinaten innerhalb der akzeptierten Bereiche Fütterung.

Ich versuche, die distHavrsine Funktion in R, in einer Schleife zu berechnen den Abstand zwischen gewissen Längen- und Breitengrad-Koordinaten zu verwenden für eine mehr hundert Zeilen. (...), wenn der Abstand weniger als 50 Meter möchte ich es die Zeilen

Werfen Sie einen Blick auf die distm Funktion aufnehmen, die leicht eine Distanzmatrix für einige hundert Zeilen berechnet (dh ohne Schleifen). Es verwendet distHaversine standardmäßig. Um zum Beispiel der Datenrahmen Zeilen zu erhalten, die näher dann 650.000 Meter sind:

df <- read.table(sep=",", col.names=c("lon", "lat"), text=" 
4,52 
13,52 
116,39") 
(d <- distm(df)) 
#   [,1] [,2] [,3] 
# [1,]  0 616422 7963562 
# [2,] 616422  0 7475370 
# [3,] 7963562 7475370  0 

d[upper.tri(d, T)] <- NA 
(idx <- which(d < 650000, arr.ind = T)) 
#  row col 
# [1,] 2 1 
cbind(df[idx[, 1], ], df[idx[, 2], ]) 
# lon lat lon lat 
# 2 13 52 4 52 
Verwandte Themen