Mam plik kształtu linii reprezentujący sieć dróg. Chcę zrasteryzować te dane, a wartości wynikowe w rastrze pokazują całkowitą długość linii, które mieszczą się w komórce rastra.
Dane są w projekcji British National Grid, więc jednostkami będą metry.
Idealnie chciałbym wykonać tę operację przy użyciu R
i domyślam się, że rasterize
funkcja z raster
pakietu odegrałaby rolę w osiągnięciu tego, po prostu nie mogę ustalić, jaka powinna być zastosowana funkcja.
raster
r
line
rasterization
JPD
źródło
źródło
vignette('over', package = 'sp')
może pomóc.Odpowiedzi:
Po ostatnim pytaniu możesz skorzystać z funkcji oferowanych przez pakiet rgeos , aby rozwiązać problem. Ze względu na odtwarzalność pobrałem plik kształtu dróg tanzańskich z DIVA-GIS i umieściłem go w bieżącym katalogu roboczym. Do nadchodzących zadań potrzebne będą trzy pakiety:
W związku z tym Twoje pierwsze wiersze mogłyby wyglądać następująco:
Następnie musisz zaimportować dane pliku kształtu. Zauważ, że pliki kształtów DIVA-GIS są dystrybuowane w EPSG: 4326, więc wyświetlę plik kształtu do EPSG: 21037 (UTM 37S), aby zajmować się licznikami, a nie stopniami.
Do późniejszej rasteryzacji potrzebny będzie szablon rastrowy obejmujący zasięg przestrzenny pliku kształtu. Szablon rastrowy składa się domyślnie z 10 wierszy i 10 kolumn, co pozwala uniknąć zbyt długich czasów obliczeń.
Teraz, gdy szablon jest skonfigurowany, przejdź przez wszystkie komórki rastra (który obecnie składa się tylko z wartości NA). Przypisując wartość „1” do bieżącej komórki, a następnie wykonując
rasterToPolygons
, wynikowy plik kształtu „tmp_shp” automatycznie przechowuje zakres aktualnie przetwarzanego piksela.gIntersects
wykrywa, czy ten zakres pokrywa się z drogami. Jeśli nie, funkcja zwróci wartość „0”. W przeciwnym razie plik kształtu drogi jest przycinany przez bieżącą komórkę, a całkowita długość „linii przestrzennych” w tej komórce jest obliczana za pomocągLength
.Na koniec możesz wstawić obliczone długości (które są konwertowane na kilometry) do szablonu rastra i wizualnie zweryfikować swoje wyniki.
źródło
sapply()
siępbsapply()
i użył argumentu klastracl = detectCores()-1
. Teraz mogę uruchomić ten przykład równolegle!Poniżej zmodyfikowano rozwiązanie Jeffreya Evansa. To rozwiązanie jest znacznie szybsze, ponieważ nie używa rasteryzacji
źródło
raster::intersect()
wcześniej, podoba mi się, że łączy atrybuty przecinających się elementów, w przeciwieństwie dorgeos::gIntersection()
.Nie potrzebujesz pętli for. Po prostu przecinaj wszystko naraz, a następnie dodaj długości linii do nowych segmentów linii za pomocą funkcji „SpatialLinesLengths” w sp. Następnie, używając funkcji rasteryzacji pakietu rastrowego z argumentem fun = sum, możesz utworzyć raster z sumą długości linii przecinających każdą komórkę. Wykorzystanie powyższej odpowiedzi i powiązanych danych tutaj jest kodem, który wygeneruje te same wyniki.
źródło
SpatialLinesLengths
. Chyba nigdy nie jest za późno na naukę, dziękuję (:rasterize
trwa to jednak dość długo (7 razy dłużej niż górne podejście na moim komputerze).rasterize()
funkcja obejmuje wszystkie linie dotykające danej komórki. W niektórych przypadkach długości segmentów linii są liczone dwukrotnie: raz w komórce, którą powinni, i raz w sąsiedniej komórce, której dotyka punkt końcowy linii.Oto jeszcze inne podejście. Różni się od tych już podanych przy użyciu
spatstat
pakietu. O ile mi wiadomo, ten pakiet ma własną wersję obiektów przestrzennych (np.im
Vs.raster
obiekty), alemaptools
pakiet umożliwia konwersję tam iz powrotem międzyspatstat
obiektami i standardowymi obiektami przestrzennymi.To podejście zostało zaczerpnięte z tego postu R-sig-Geo .
Najwolniejszym bitem jest przekształcenie dróg z
SpatialLines
wzoru odcinka linii (tjspatstat::psp
.). Po wykonaniu tej czynności obliczanie rzeczywistej długości jest dość szybkie, nawet w przypadku znacznie wyższych rozdzielczości. Na przykład na moim starym MacBooku 2009:źródło
Pozwól, że przedstawię Ci pakiet vein z kilkoma funkcjami do pracy z liniami przestrzennymi i importowania sf i data.table
źródło
Może to zabrzmieć nieco naiwnie, ale jeśli jest to układ drogowy, wybierz drogi i zapisz w schowku, a następnie znajdź narzędzie, które pozwala dodać bufor do schowka, ustaw go na dozwoloną szerokość drogi, tj. 3 metry +/- pamiętaj, że bufor znajduje się od linii środkowej do krawędzi * 2 i dla każdej strony, więc 3-metrowy bufor jest w rzeczywistości 6-metrową drogą z boku na bok.
źródło