Der schnellste Weg, um ein großes Raster mit R oder Python in eine Polylinie zu konvertieren?

14

Ich habe eine große Rasterdatei (129600 x 64800 Pixel) mit globalen Gewässern (1-Bit-Werte 0 und 1) und versuche, Ozean- und Binnenwasserküsten zu extrahieren.

Ich habe mit ArcGIS und QGIS versucht, von Raster zu Polylinie zu konvertieren, aber es dauert ewig.

Kennt jemand einen besseren / schnelleren Weg (Python oder R) oder ein besseres Werkzeug für diese Aufgabe?

Aktualisieren

  • R: rasterToContour ist zwar schnell und präzise, ​​aber wenn Sie einen sehr großen Datensatz wie meinen haben (8.398.080.000 Pixel), benötigen Sie entweder sehr viel RAM (mehr als 16 GB) oder Sie erzwingen, dass R mehr Daten auf der Festplatte verarbeitet wird auch ewig dauern.
  • Python / GDAL: gdal_poligonize erstellt Polygone anstelle von Polylinien

Update 2

  • R rasterToContour: rasterToContour liefert nicht die gewünschten Ergebnisse. Im Vergleich zu ArcGIS (Raster zu Polygon gefolgt von Feature zu Linie) wird der genaue Pixelumriss nicht extrahiert, wie in den folgenden Beispielen gezeigt.

rasterToContour-Ergebnis rasterToContour-Ergebnis

ArcGIS-Ergebnis ArcGIS-Ergebnis

UPDATE 3

Python / GDAL: Ich habe gdal_polygonize über die Befehlszeile für ArcGIS in einem Test-Dataset ausgeführt und die Ergebnisse waren äußerst klar:

  • gdal: 49 sekunden
  • ArcGIS: 1,84 Sekunden
Generisches Wevers
quelle
Haben Sie das getan, siehe Update 3.
Generic Wevers
Können Sie diesen Testdatensatz bereitstellen, damit wir sehen können, ob vorgeschlagene Alternativen schneller sind und / oder die erforderlichen Ergebnisse liefern?
Kersten
Für solch ein riesiges Raster wäre es viel besser, C / C ++ mit der GDAL-Bibliothek zu verwenden.
Rodrigo

Antworten:

7

Ich arbeite mit R und habe rasterToPolygonsdas rasterPaket in der Vergangenheit benutzt, aber jetzt bevorzuge ich es gdal_polygonizeRvon John Baumgartner. Es basiert auf gdal_polygonize.pyund ist viel schneller. John Baumgartner veröffentlichte den Code und gab ein Beispiel für die Verwendung in seinem Blog .

Wenn Sie mit Python vertraut sind, können Sie es gdal_polygonize.pynatürlich auch direkt verwenden.

Iris
quelle
1
Ich werde es versuchen. Das letzte Mal, als ich gdal_polygonize.py verwendet habe, war ArcGIS noch schneller.
Generic Wevers
Ich hätte nicht gedacht, dass ArcGis schneller sein kann als GDAL. @Generic Militzer
Iris
Ah, warte, das wird Polygone erzeugen, aber ich brauche Polylinien.
Generic Wevers
Wenn Sie Ihre Daten in eine File-Geodatabase stellen, ist dies ziemlich schnell. Aber immer noch nicht schnell genug. Deshalb suche ich nach Alternativen.
Generic Wevers
2
Es ist nicht unbedingt ein Problem, dass Sie Polygone erhalten, Sie können sie immer in Polylinien konvertieren (obwohl es bei so vielen natürlich auch eine Weile dauern könnte).
Martin
6

Für die Nachwelt habe ich Erfolg mit dem bereits mit stars::Paket in Rfür diese Art der Operation schnell zu tun.

library(raster)
library(stars)
library(sf)
library(magrittr)

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- st_as_stars(r) %>% 
  st_as_sf() %>% # this is the raster to polygons part
  st_cast("MULTILINESTRING") # cast the polygons to polylines

plot(x)

Bildbeschreibung hier eingeben

plot(r)
plot(x, add = TRUE)

Bildbeschreibung hier eingeben

mikoontz
quelle
5

Versuchen Sie es rasterToContouraus dem Raster- Paket.

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- rasterToContour(r)
class(x)
> [1] "SpatialLinesDataFrame"
> attr(,"package")
> [1] "sp"

plot(r)
plot(x, add=TRUE)

Bildbeschreibung hier eingeben

Anschließend können Sie die Dateien einfach in einen lokalen Ordner schreiben, z. B. als 'ESRI Shapefile' (.shp). Verwenden Sie dazu den folgenden Code. Werfen Sie einen Blick auf ogrDriversvon rgdal , um herauszufinden , welche Treiber Ihr System ist kompatibel mit.

library(rgdal)
writeOGR(x, dsn = getwd(), layer = "coastlines", driver = "ESRI Shapefile")
fdetsch
quelle
Ich werde versuchen, die Daumen zu drücken, es wird nicht mein RAM töten. Obwohl ich 16 GB habe, was hoffentlich ausreicht, ist R bei großen Rasterdateien manchmal nicht so effizient. Aber mal sehen.
Generic Wevers
Die Konvertierung hat irgendwie funktioniert, aber ich konnte nicht im Detail nachschauen. Kannst du mir sagen, wie ich den SpatialLineDataFrame in ein Shapefile oder etwas Vergleichbares übertragen kann, da ich mich normalerweise mehr mit Rasterdaten befasse? Ich habe gegoogelt und immer noch Probleme, da ich den Ebenennamen (OGRwrite) nicht kenne.
Generic Wevers
Haha, ich verstehe definitiv deinen Standpunkt. Siehe oben Update.
Fdetsch
2
Ein weiterer Hinweis: Versuchen Sie, 'maxpixels' rasterToContourauf einen höheren Wert einzustellen , z. B. 1e + 9. Sie werden dann mit mehr Details enden. Die Standardeinstellung erzeugt ziemlich verallgemeinerte Konturlinien.
Fdetsch
1
Wenn Sie nicht bereit sind, resampleIhre Daten in einer gröberen räumlichen Auflösung zu speichern, kann ich mir nur vorstellen, dass Sie Ihre Daten in mehrere Kacheln (z. B. 16 Sub-Raster) aufteilen und diese dann rasterToContouriterativ und separat bearbeiten Schließlich werden mergedie resultierenden Shapefiles zu einem riesigen Shapefile. Bei Interesse bietet das Rsenal -Paket unserer Arbeitsgruppe eine Funktion splitRasterzum Erstellen mehrerer Sub-Raster aus einem riesigen Raster.
Fdetsch
2

Obwohl ich ein großer Fan von GDAL bin, war das Polygonisierungs-Tool auch für meine Anwendungen viel zu langsam.

Eine schnelle Alternative ist gdal_trace_outlinevon Dans GDAL Skripten , die auch mehr Möglichkeiten in Bezug auf Toleranz hat, Donuts, usw.

Auf gdal_polygonizediese Weise werden auch Polygone erstellt, mit denen Sie anschließend konvertieren müssenogr2ogr -nlt MULTILINESTRING .

Nachteil ist, dass Sie es selbst kompilieren müssen, es sei denn, Sie verwenden ein Linux- oder Mac-OsX-System.

Kersten
quelle
Leider ist es mit der Fehlermeldung fehlgeschlagen: "Segmentierungsfehler (Core Dumped)". Ich vermute, dass meine Datei zu groß ist oder zu viele kleine Polygone erzeugt.
Generic Wevers