Chcę utworzyć raster o rozdzielczości 25 metrów × 25 metrów, w którym każda komórka zawiera odległość do najbliższej linii brzegowej, obliczoną od środka komórki. Aby to zrobić, wszystko, co mam, to kształtna linia brzegowa Nowej Zelandii .
Próbowałem wykonać samouczek Dominica Roye'a dotyczący robienia tego w języku R, który działa ... w pewnym sensie. Jest w porządku do rozdzielczości około 1 km × 1 km, ale jeśli spróbuję przejść na wyższą pamięć RAM, wymaga to znacznie więcej niż na moim komputerze (wymagane ~ 70 GB pamięci RAM) lub dowolnego innego, do którego mam dostęp. Mówiąc to, myślę, że jest to ograniczenie R i podejrzewam, że QGIS może mieć bardziej wydajny pod względem obliczeniowym sposób tworzenia tego rastra, ale jestem nowy i nie jestem w stanie dowiedzieć się, jak to zrobić.
Próbowałem już tworzyć Tworzenie rastra z odległością do funkcji za pomocą QGIS? aby utworzyć go w QGIS, ale zwraca ten błąd:
_core.QgsProcessingException: Nie można załadować warstwy źródłowej dla INPUT: C: /..../ Coastline / nz-coastlines-and-islands-polygons-topo-150k.shp nie znaleziono
i nie jestem pewien dlaczego.
Czy ktoś ma jakieś sugestie, co może pójść źle lub alternatywny sposób na zrobienie tego?
Edytować:
Raster, który mam nadzieję wyprodukować, miałby około 59684 wierszy i 40827 kolumn, tak aby pokrywał się z rocznym rastrem deficytu wody z LINZ. Jeśli produkowany raster jest większy niż raster rocznego deficytu wody, mogę go wyciąć w R ...
Jedną z rzeczy, które moim zdaniem mogą być potencjalnym problemem, jest to, że plik kształtu linii brzegowej NZ ma dużą ilość morza między wyspami i nie jestem zainteresowany obliczeniem odległości do wybrzeża dla tych komórek. Naprawdę chcę tylko obliczyć wartości dla komórek, które zawierają kawałek ziemi. Nie jestem pewien, jak to zrobić, czy też jest to rzeczywiście problem.
źródło
Odpowiedzi:
Z PyQGIS i biblioteką Pythona GDAL nie jest to bardzo trudne. Potrzebujesz parametrów transformacji geograficznej (lewy górny x, rozdzielczość x pikseli, obrót, lewy górny y, obrót, rozdzielczość ns pikseli) oraz liczbę wierszy i kolumn, aby utworzyć wynikowy raster. Do obliczenia odległości do najbliższej linii brzegowej potrzebna jest warstwa wektorowa do reprezentowania linii brzegowej.
W PyQGIS obliczany jest każdy punkt rastrowy jako środek komórki, a jego odległość do linii brzegowej jest mierzona przy użyciu metody „closestSegmentWithContext” z klasy QgsGeometry . Biblioteka Pythona GDAL służy do tworzenia rastra z tymi wartościami odległości w tablicy wierszy x kolumn.
Poniższy kod został użyty do utworzenia rastra odległości (25 m × 25 m rozdzielczości i 1000 wierszy x 1000 kolumn), zaczynając od punktu (397106.7689872353, 4499634.06675821); blisko zachodniego wybrzeża USA.
Po uruchomieniu powyżej kodu powstały raster został załadowany do QGIS i wygląda jak na poniższym obrazie (pseudokolor z 5 klasami i rampą spektralną). Projekcja to UTM 10 N (EPSG: 32610)
źródło
Może być rozwiązaniem, aby spróbować:
Teraz powinieneś mieć nową warstwę punktową z odległością do wybrzeża, jak w tym przykładzie
źródło
W QGIS możesz wypróbować wtyczkę GRASS. O ile wiem, lepiej zarządza pamięcią niż R i spodziewam się, że inne rozwiązanie zawiedzie na dużych obszarach.
polecenie GRASS nazywa się r.grow.distance, które można znaleźć na pasku narzędzi przetwarzania. Zauważ, że najpierw musisz przekonwertować linię na raster.
Jednym z problemów może być rozmiar danych wyjściowych, więc możesz dodać kilka przydatnych opcji tworzenia, takich jak (dla pliku tif) BIGTIFF = TAK, TILED = TAK, KOMPRESS = LZW, PREDICTOR = 3
źródło
Spróbowałbym na odwrót. Jeśli używasz wielokąta NZ, przekonwertuj krawędzie wielokąta na linię. Następnie utwórz bufor na granicy dla każdych 25 metrów odległości od granicy (być może centorid może pomóc w określeniu, kiedy zatrzymać). Następnie wytnij bufory za pomocą wielokąta, a następnie przekonwertuj te wielokąty na raster. Nie jestem pewien, czy to zadziała, ale na pewno będziesz potrzebować mniej pamięci RAM. A PostGiS jest świetny, gdy masz problemy z wydajnością.
Mam nadzieję, że to może trochę pomóc :)
źródło
Początkowo nie zamierzałem odpowiadać na moje własne pytanie, ale mój kolega (który nie korzysta z tej strony) napisał mi sporo kodu Pythona, aby zrobić to, o co mi chodzi; w tym ograniczenie komórek do odległości od wybrzeża tylko dla komórek lądowych i pozostawienie komórek morskich jako NA. Poniższy kod powinien być uruchomiony z dowolnej konsoli Pythona, a jedyne rzeczy, które wymagają modyfikacji, to:
1) Umieść plik skryptu w tym samym folderze, co plik kształtu;
2) zmień nazwę pliku shapefile w skrypcie python na dowolną nazwę twojego pliku shapefile;
3) ustaw żądaną rozdzielczość, oraz;
4) zmień zakres, aby dopasować do innych rastrów.
Większe pliki shapefile niż te, których używam, będą wymagały dużej ilości pamięci RAM, ale w przeciwnym razie skrypt jest szybki do uruchomienia (około trzech minut, aby uzyskać raster o rozdzielczości 50m i dziesięć minut dla rastra o rozdzielczości 25m).
źródło