Ich möchte eine Rasterdatei von einem Raster mit 10 Klassen in ein Raster mit 8 Klassen unter Verwendung von Pyhton, GDAL und / oder Numpy umklassifizieren. Die Klassen werden als Ganzzahlen dargestellt. Ich habe versucht, die Schritte aus diesem Beitrag zu befolgen. Raster mit GDAL und Python , dem doc numpy.equal und dem Dokument gdal_calc neu klassifizieren. Allerdings ohne Erfolg.
Die neu zu klassifizierende Rasterdatei hat ganzzahlige Werte zwischen 0 und 11 und enthält auch die Werte 100 und 255. Im Folgenden wird die Neuklassifizierung (von Wert: zu Wert) dargestellt:
nodata: 4, 0: 4, 1: 1, 2: 2, 3: 3, 4: 3, 5: 4, 6: 5, 7: 5, 8: 6, 9: 7, 10: 8, 100: nodata, 255: nodata,
Was ich tun konnte, ist die Rasterdatei auszuwählen, die mit tkinter.FileDialog neu klassifiziert werden soll, und die Rasterinformationen wie Geotransform und Pixelgröße mit reclass = gdal.Open (Raster, GA_ReadOnly) abzurufen.
Wie löse ich das oben genannte?
Es könnte erwähnenswert sein, dass die zu klassifizierenden Raster in einigen Fällen ziemlich groß sein können (500 MB bis 5 GB).
quelle
Antworten:
Hier haben Sie ein einfaches Python-Skript zur Neuklassifizierung, ich habe es geschrieben und es funktioniert für mich:
Ändern Sie einfach die Bereiche.
Ich hoffe es wird helfen.
quelle
file2
entweder mitdel file2
oder schließenfile2 = None
, um sicherzustellen, dass es auf die Festplatte geschrieben wird..FlushCache()
beeinflusst nur den internen Kachel-Cache von GDAL.Anstatt die von dmh126 beschriebene Neuklassifizierung als Double-for-Schleife durchzuführen, verwenden Sie Folgendes
np.where
:Auf einem Array von 6163 x 3537 Pixel (41,6 MB) erfolgt die Klassifizierung in 1,59 Sekunden, wobei die Verwendung der Double-for-Schleife 12 Minuten und 41 Sekunden dauert. Insgesamt nur eine Beschleunigung von 478x.
Fazit: Verwenden Sie niemals eine Double-for-Schleife
numpy
quelle
Hier ist ein grundlegendes Beispiel mit Rasterio und Numpy:
quelle
Um die Antwort von @Mattijn zu vervollständigen, denke ich, dass dies zu einem Problem führen wird, wenn sich die Eingabeklassen mit den Ausgabeklassen überschneiden. Ich möchte nicht, dass mein neuer Wert durch die nächste Regel geändert wird.
Ich weiß nicht, ob ich an Geschwindigkeit verliere, aber ich sollte eine tiefe Kopie machen:
quelle
Hier ist ein weiterer Rasterio- Ansatz, den ich mithilfe des Rasterio-Kochbuchs und der Antwort von @ Mattijn zusammen gehackt habe .
quelle
In einigen Fällen kann die Numpy- Digitalisierung hilfreich sein, um schnell von Bereichen zu Behältern zu gelangen.
quelle
Mit Raster-RGB-Farbtabellenunterstützung:
quelle
Eine etwas andere Alternative könnte die folgende sein:
Dieses Skript spielt mit numpy.where ( https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html ): in allen Schritten außer dem letzten, anstatt einen Wert zurückzugeben, wenn der Bedingung ist nicht erfüllt, es gibt eine andere np.where zurück. Und es geht so lange weiter, bis alle möglichen Werte des Rasters berücksichtigt sind.
quelle