2013-10-01 13 views
6

Ich habe einen SpatialLinesDataFrame mit Straßen und ich habe eine Liste der GPS-Koordinaten. Was ich tun muss, ist die 10 nächsten Straßennamen für jede einzelne GPS-Koordinate herauszubekommen.SpatialLinesDataFrame: Wie berechnet man die min. Abstand zwischen einem Punkt und einer Linie

Gibt es eine Funktion/ein Paket in R, die den Abstand zwischen einer Linie und einem Punkt für einen SpatialLinesDataFrame berechnet? Ich kann nichts sehen, was bei "sp" helfen würde.

Es gibt eine verwandte Frage: Calculating the distance between polygon and point in R, aber ich möchte den Abstand zwischen einem Linienobjekt und einem Punkt, nicht Polygon/Punkt, Punkt/Punkt finden.

+0

Suche: http://stackoverflow.com/questions/15294343/calculating-the-distance-between-polygon-and -point-in-r –

+0

Die verknüpfte Antwort ist nützlich, zeigt jedoch nur, wie der Abstand zwischen einem Punkt und einem Polygon berechnet wird. –

Antwort

12

Sie könnten rgeos::gDistance() mit byid=TRUE verwenden, um eine Matrix von Entfernungen von jedem Punkt zu jeder Zeile zu erhalten. Von dort ist es relativ einfach, die IDs der 10 Zeilen zu extrahieren am nächsten zu jedem Punkt:

library(sp) 
library(rgeos) 

## Create a SpatialPoints and a SpatialLines object 
example("SpatialPoints-class", ask=FALSE, echo=FALSE) 
example("SpatialLines-class", ask=FALSE, echo=FALSE) 

## Compute the matrix of distances between them. 
(m <- gDistance(S, Sl, byid=TRUE)) 
#   1 2  3  4  5 
# a 0.000000 0.0 2.757716 1.414214 2.757716 
# b 1.788854 0.5 3.640055 1.000000 3.605551 

## And then use it to extract the ids of the 10 (or in this case 1) lines 
## closest to each point. 
## apply(m, 2, function(X) rownames(m)[order(X)][1:10]) ## Finds 10 closest 
apply(m, 2, function(X) rownames(m)[order(X)][1])  ## Finds single closest 
# 1 2 3 4 5 
# "a" "a" "a" "b" "a" 
+0

@Geza Cool. Ich bin froh, dass das funktioniert hat, und freue mich immer darauf, die Leute auf ** RGEOS ** aufmerksam zu machen. –