Mam duży plik rastrowy (129600 na 64800 pikseli) z globalnymi częściami wód (1 bit wartości 0 i 1) i próbuję wydobyć linie brzegowe oceanów i wód śródlądowych.
Próbowałem z ArcGIS i QGIS przekonwertować z rastra na polilinię, ale to trwa wieki.
Czy ktoś zna lepszy / szybszy sposób (Python lub R) lub lepsze narzędzie do tego zadania?
Aktualizacja
- R: rasterToContour może być szybki i precyzyjny, ale jeśli masz bardzo duży zestaw danych, taki jak mój (8 398,080 000 pikseli), potrzebujesz bardzo dużej ilości pamięci RAM (ponad 16 GB) lub zmuszasz R do większego przetwarzania na dysku twardym i to zajmie także wieki.
- Python / GDAL: gdal_poligonize tworzy wielokąty zamiast polilinii
Aktualizacja 2
- R rasterToContour: rasterToContour nie zapewnia oczekiwanych rezultatów. W porównaniu do ArcGIS (raster do wielokąta, a następnie funkcja do linii) nie wyodrębnia dokładnego obrysu pikseli, jak pokazano w poniższych przykładach.
AKTUALIZACJA 3
Python / GDAL: Uruchomiłem gdal_polygonize z wiersza poleceń przeciwko ArcGIS na testowym zbiorze danych, a wyniki były bardzo jasne:
- gdal: 49 sekund
- ArcGIS: 1,84 sekundy
python
r
performance
Ogólne Wevers
źródło
źródło
Odpowiedzi:
Pracuję z R i korzystałem
rasterToPolygons
zraster
pakietu w przeszłości, ale teraz wolęgdal_polygonizeR
Johna Baumgartnera. Opiera się nagdal_polygonize.py
i jest znacznie szybszy. John Baumgartner opublikował kod i podał przykład zastosowania na swoim blogu .Jeśli znasz język Python, możesz
gdal_polygonize.py
oczywiście używać go bezpośrednio.źródło
Jeśli chodzi o potomstwo, odniosłem sukces dzięki
stars::
pakietowiR
umożliwiającemu szybkie wykonanie tego typu operacji.źródło
Spróbuj
rasterToContour
z pakietu rastrowego .Następnie możesz łatwo zapisać pliki w folderze lokalnym, np. Jako „Plik kształtu ESRI” (.shp), używając poniższego kodu. Przyjrzeć się
ogrDrivers
z rgdal , aby dowiedzieć się, jakie sterowniki system jest kompatybilny z.źródło
rasterToContour
na jakąś wyższą wartość, np. 1e + 9. Otrzymasz wtedy więcej szczegółów. Ustawienie domyślne tworzy dość ogólne linie konturu.resample
Twoje dane były z grubszą rozdzielczością przestrzenną, jedynym rozwiązaniem, jakie mogę sobie wyobrazić, byłoby podzielenie danych na wiele kafelków (np. 16 sub-rastrów), a następnie wykonanierasterToContour
każdej płytki osobno w sposób iteracyjny i , w końcumerge
powstałe pliki kształtów w jeden ogromny plik kształtów. Jeśli jesteś zainteresowany, pakiet naszej grupy roboczej Rsenal oferuje funkcję zwanąsplitRaster
tworzeniem wielu podrzędnych rastrów z jednego ogromnego rastra.Chociaż jestem wielkim fanem GDAL, narzędzie do poligonizacji było zbyt wolne dla moich aplikacji.
Szybkim rozwiązaniem jest
gdal_trace_outline
ze skryptami Dans gdal który ma również więcej opcji w zakresie tolerancji, pączki itpW
gdal_polygonize
ten sposób powstają również wielokąty, które należy później przekonwertowaćogr2ogr -nlt MULTILINESTRING
.Minusem tego jest to, że musisz go skompilować samodzielnie, chyba że korzystasz z systemu Linux lub Mac OSX.
źródło