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ść:
1 |
gDistance(kolej, straz) |
W wyniku otrzymujemy jedną odległość, która jest najmniejszą odległością pomiędzy obiektami warstwy:
1 |
[1] 797.3063 |
Do otrzymania macierzy odległości pomiędzy obiektami warstw konieczne jest dodanie dodatkowego argumentu byid, jak w przypadku funkcji gIntersects:
1 |
gDistance(kolej, straz, byid=TRUE) |
W wyniku otrzymujemy macierz odległości pomiędzy wszystkimi obiektami warstw:
1 2 3 4 5 6 7 |
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:
1 |
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:
1 |
distance_to_line = gDistance(line,straz,byid = T) |
Wyliczone odległości wynoszą:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
> 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:
1 2 3 |
min(distance_to_line) [1] 11284.4 |
Najbliżej wybranej przez nas linii znajduje się:
1 2 3 |
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.