Ich möchte ein Raster mit einer Auflösung von 25 Metern × 25 Metern erstellen, wobei jede Zelle den Abstand zur nächsten Küste enthält, der aus der Mitte der Zelle berechnet wird. Dazu habe ich nur ein Shapefile der neuseeländischen Küsten .
Ich habe versucht, Dominic Royes Tutorial zu folgen, um es in R zu machen, was funktioniert ... irgendwie. Es ist in Ordnung bis zu einer Auflösung von etwa 1 km × 1 km, aber wenn ich versuche, den RAM-Wert zu erhöhen, wird der auf meinem PC verfügbare Speicherplatz (~ 70 GB RAM erforderlich) oder ein anderer, auf den ich ebenfalls Zugriff habe, deutlich überschritten. Wenn ich das sage, denke ich, dass dies eine Einschränkung von R ist, und ich vermute, dass QGIS eine rechnerisch effizientere Methode zum Erstellen dieses Rasters bietet, aber ich bin neu darin und kann nicht genau herausfinden, wie es geht.
Ich habe versucht, Raster mit QGIS zu erstellen. um es in QGIS zu erstellen, aber es gibt diesen Fehler zurück:
_core.QgsProcessingException: Quellschicht für INPUT konnte nicht geladen werden: C: /..../ Coastline / nz-Küstenlinien-und-Inseln-Polygone-topo-150k.shp nicht gefunden
und ich bin mir nicht sicher warum.
Hat jemand Vorschläge, was schief gehen könnte oder eine alternative Möglichkeit, dies zu tun?
Bearbeiten:
Das Raster, das ich produzieren möchte, hätte ungefähr 59684 Zeilen und 40827 Spalten, so dass es sich mit dem jährlichen Wasserdefizit-Raster von LINZ überschneidet . Wenn das produzierte Raster größer ist als das jährliche Wasserdefizit-Raster, kann ich es in R schneiden ...
Eine Sache, die ich für ein potenzielles Problem halte, ist, dass das Shapefile der neuseeländischen Küste eine große Menge Meer zwischen den Inseln aufweist, und ich bin nicht daran interessiert, die Entfernung zur Küste für diese Zellen zu berechnen. Ich möchte wirklich nur die Werte für Zellen berechnen, die ein Stück Land enthalten. Ich bin mir nicht sicher, wie ich das machen soll oder ob es tatsächlich ein Problem ist.
quelle
Antworten:
Mit PyQGIS und GDAL ist die Python-Bibliothek nicht sehr schwierig. Sie benötigen Geotransformationsparameter (x oben links x, x Pixelauflösung, Drehung, oben links y, Drehung, ns Pixelauflösung) und Zeilen- und Spaltennummer, um das resultierende Raster zu erstellen. Zur Berechnung der Entfernung zur nächsten Küstenlinie ist eine Vektorebene zur Darstellung der Küstenlinie erforderlich.
Mit PyQGIS wird jeder Rasterpunkt als Mittelpunkt der Zelle berechnet und sein Abstand zur Küstenlinie mithilfe der Methode 'nextSegmentWithContext' aus der QgsGeometry- Klasse gemessen . Die GDAL- Python-Bibliothek wird zum Erstellen eines Rasters mit diesen Abstandswerten im Array Zeilen x Spalten verwendet.
Der folgende Code wurde zum Erstellen eines Distanzrasters (25 m × 25 m Auflösung und 1000 Zeilen x 1000 Spalten) verwendet, beginnend mit Punkt (397106.7689872353, 4499634.06675821). in der Nähe der Westküste der USA.
Nach dem Ausführen des obigen Codes wurde das resultierende Raster in QGIS geladen und es sieht wie im folgenden Bild aus (Pseudofarbe mit 5 Klassen und Spektralrampe). Die Projektion ist UTM 10 N (EPSG: 32610)
quelle
Kann eine Lösung sein, um zu versuchen:
Jetzt sollten Sie wie in diesem Beispiel eine neue Punktebene mit dem Abstand zur Küste haben
quelle
In QGIS können Sie das GRASS-Plugin ausprobieren. Soweit ich weiß, verwaltet es den Speicher besser als R, und ich erwarte, dass die andere Lösung auf großen Flächen fehlschlägt.
Der Befehl GRASS heißt r.grow.distance und befindet sich in der Verarbeitungssymbolleiste. Beachten Sie, dass Sie Ihre Zeile zunächst in Raster konvertieren müssen.
Eines Ihrer Probleme könnte die Größe der Ausgabe sein, sodass Sie einige nützliche Erstellungsoptionen hinzufügen können, z. B. (für eine TIF-Datei) BIGTIFF = YES, TILED = YES, COMPRESS = LZW, PREDICTOR = 3
quelle
Ich würde es anders herum versuchen. Wenn Sie ein Poligon von NZ verwenden, konvertieren Sie Polygonkanten in Linien. Erstellen Sie danach alle 25 Meter Abstand von der Grenze einen Puffer an der Grenze (möglicherweise hilft Centorid bei der Bestimmung, wann angehalten werden soll). Schneiden Sie dann Puffer mit Polygon aus und konvertieren Sie diese Polygone in Raster. Ich bin mir nicht sicher, ob das funktionieren würde, aber auf jeden Fall werden Sie weniger RAM benötigen. Und PostGiS ist großartig, wenn Sie Leistungsprobleme haben.
Hoffe es könnte wenigstens ein bisschen helfen :)
quelle
Ich wollte ursprünglich nicht meine eigene Frage beantworten, aber ein Kollege von mir (der diese Site nicht nutzt) hat mir eine Menge Python-Code geschrieben, um das zu tun, wonach ich suche. einschließlich der Begrenzung der Zellen auf den Abstand zur Küste nur für terrestrische Zellen und des Zurücklassens der Zellen auf Meeresbasis als NAs. Der folgende Code sollte von jeder Python-Konsole aus ausgeführt werden können. Die einzigen Dinge, die geändert werden müssen, sind:
1) Legen Sie die Skriptdatei in denselben Ordner wie die gewünschte Formdatei.
2) Ändern Sie den Namen des Shapefiles im Python-Skript in den Namen Ihres Shapefiles.
3) stellen Sie die gewünschte Auflösung ein und;
4) Ändern Sie das Ausmaß, um es an andere Raster anzupassen.
Größere Shapefiles als das, was ich verwende, erfordern viel RAM, aber ansonsten lässt sich das Skript schnell ausführen (etwa drei Minuten, um ein Raster mit einer Auflösung von 50 m und zehn Minuten für ein Raster mit einer Auflösung von 25 m zu erstellen).
quelle