Analiza odległości w R
W dzisiejszym poście zaprezentujemy Wam jak używać narzędzia gDistance z biblioteki rgeos do wyliczenia odległości pomiędzy obiektami warstw wektorowych. Do naszego przykładu użyjemy znane już z wcześniejszych postów linie kolejowe (pobierz) oraz lokalizacje jednostek straży pożarnej (pobierz). Na początku wczytujemy obie warstwy i wyświetlamy wczytane warstwy:
Do obliczenia odległości użyjemy funkcji gDistance. Argumentami funkcji są dwie wczytane wcześniej warstwy pomiędzy, którymi analizujemy odległość:
gDistance(kolej, straz)
W wyniku otrzymujemy jedną odległość, która jest najmniejszą odległością pomiędzy obiektami warstwy:
[1] 797.3063
Do otrzymania macierzy odległości pomiędzy obiektami warstw konieczne jest dodanie dodatkowego argumentu byid, jak w przypadku funkcji gIntersects:
gDistance(kolej, straz, byid=TRUE)
W wyniku otrzymujemy macierz odległości pomiędzy wszystkimi obiektami warstw:
0 1 2 1 8507.329 18405.56 8530.38 2 28904.945 23211.21 28942.98 3 41223.233 24220.43 41292.70
Na koniec znajdźmy z wykorzystaniem funkcji gDistance na przykład jednostkę straży, która ma w linii prostej najbliżej do jednego z odcinków linii kolejowej. Wybierzmy odcinek linii o osm_id = 294250370:
line = kolej[kolej@data$osm_id == "294250370",]
Wyselekcjonowany odcinek znajduje się w dużej odległości od wszystkich jednostek straży:
Wyliczmy odległość od wybranej linii do poszczególnych jednostek straży:
distance_to_line = gDistance(line,straz,byid = T)
Wyliczone odległości wynoszą:
> distance_to_line 198 1 17946.62 2 20355.64 3 25133.04 4 16869.70 5 17184.11 6 23473.78 7 24575.98 8 29726.79 9 27766.93 10 19331.81 11 34468.66 12 11284.40 13 16947.43 14 27674.72 15 23531.39 16 21001.19 17 31275.48 18 30461.70 19 16756.31 20 25030.76 21 23244.33
Minimalna odległość to:
min(distance_to_line) [1] 11284.4
Najbliżej wybranej przez nas linii znajduje się:
straz@data$name[distance_to_line == min(distance_to_line)] [1] "Ochotnicza Straż Pożarna w Starych Grabiach"
Poznaną funkcję możecie używa do wielu różnych analiz, gdzie potrzebna jest wiedza o odległości między obiektami. Macie jakiś inny pomysł na jej zastosowanie? Piszcie w komentarzach.