2013-10-01 13 views
6

Mam SpatialLinesDataFrame z ulicami i mam listę współrzędnych GPS. Muszę wydobyć 10 najbliższych nazw ulic dla każdej indywidualnej współrzędnej GPS.SpatialLinesDataFrame: jak obliczyć min. odległość między punktem a linią

Czy istnieje funkcja/pakiet w R, który obliczy odległość między linią a punktem dla SpatialLinesDataFrame? Nie widzę niczego, co mogłoby pomóc w "sp".

Istnieje pokrewne pytanie: Calculating the distance between polygon and point in R, ale chcę znaleźć odległość między obiektem linii a punktem, a nie wielokąt/punkt, punkt/punkt.

+0

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

+0

Połączona odpowiedź jest przydatna, ale pokazuje tylko, jak obliczyć odległość między jednym punktem a jednym wielokątem. –

Odpowiedz

12

Możesz użyć rgeos::gDistance() z byid=TRUE, aby uzyskać macierz odległości od każdego punktu do każdej linii. Stamtąd, to stosunkowo łatwo wyodrębnić identyfikatory 10 linii najbliżej każdego punktu:

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. Cieszę się, że działało, i zawsze chętnie wskazuję ludzi na ** rgeos **. –