Der einfachste Weg für mich, dieses Problem zu lösen, war die Verwendung des virtuellen GDAL-Formats . Mit diesem Format konnte ich den gesamten Satz von Bildern als ein einzelnes Bildobjekt behandeln und in drei relativ einfachen Schritten transformieren.
Erstellen des virtuellen Datensatzes
GDAL (einschließlich der Windows-Binärdateien von Tamas Szekeres für GISInternals und neuerer Versionen von OSGeo4W ) enthält ein Dienstprogramm namens gdalbuildvrt, mit dem ein erstes virtuelles Dataset erstellt werden kann.
Eine einfache Möglichkeit, dies zu verwenden, besteht darin, alle Ihre Bilder einer Textdatei hinzuzufügen und diese Textdatei dann als Eingabe für gdalbuildvrt zu verwenden. Hier ist ein Beispiel (Sie müssen den zweiten Befehl wieder in eine Zeile setzen):
dir /b *.tif > my_images.txt
gdalbuildvrt
-hidenodata
-vrtnodata "255 255 255"
-resolution highest
-input_file_list my_images.txt
my_image.vrt
Dadurch erhalten Sie eine XML-Datei, die Sie für alle GDAL-Vorgänge als ein einziges Image behandeln können. Es stellt Nodata auch intern als weiß dar, verbirgt jedoch die Nodata-Definition vor Tools, die daraus lesen.
Erstellen der neu abgetasteten Übersicht
Als Nächstes führen Sie das Resampling und die Ausgabe des Übersichtsbilds durch. Sie können dies entweder mit gdal_translate oder gdalwarp tun . Denken Sie bei beiden daran, dass die resultierende Größe width * height * 3
(Anzahl der 8-Bit-Bänder) Bytes beträgt. Wenn dies größer als 4 GB ist, sollten Sie sich die GeoTIFF-Optionen für die Syntax ansehen, um BigTIFF als Ausgabe anzugeben (-co "BIGTIFF = YES").
Für gdal_translate müssen Sie die Abmessungen des virtuellen Bildes mit dem praktischen Befehl gdalinfo bestimmen . Nehmen Sie diese Dimensionen und dividieren Sie sie durch einen konsistenten Faktor, um die Ausgabebreite und -höhe Ihrer Datei in Pixel zu bestimmen.
Der Befehl sieht ungefähr so aus (in einer Zeile):
gdal_translate
-outsize 53120 14000
-co "TILED=YES"
-co "PROFILE=GEOTIFF"
-co "BLOCKXSIZE=256"
-co "BLOCKYSIZE=256"
my_image.vrt
my_image.tif
Für gdalwarp müssen Sie die resultierende Pixelgröße kennen. In diesem Fall verwende ich 0,5 Meter. Sie möchten auch die Resampling-Methode aufrufen. Ich bevorzuge Cubicspline für Orthophoto-Übersichten. Es ist weicher, aber Sie werden diese nicht bis zur vollen Auflösung verwenden und meiner Erfahrung nach erzeugt es ein komprimierbareres Bild, wenn Sie etwas wie JPEG oder ECW verwenden.
gdalwarp
-r cubicspline
-of GTiff
-dstnodata "255 255 255"
-tr 0.5 0.5
-co "PROFILE=GEOTIFF"
-co "BIGTIFF=YES"
-co "TILED=YES"
-co "BLOCKXSIZE=256"
-co "BLOCKYSIZE=256"
my_image.vrt
my_image.tif
Möglicherweise möchten Sie auch JPEG-Komprimierungsoptionen für diese neu abgetasteten GeoTIFF-Übersichten verwenden. es verkleinert die Ausgabedatei erheblich mit ( laut Frank ) nur einer geringfügigen Leistungseinbuße.
-co "COMPRESS=JPEG"
-co "JPEG_QUALITY=80"
-co "PHOTOMETRIC=YCBCR"
Übersichten
Sie sollten auch den praktischen Befehl gdaladdo über das resultierende Bild ausführen , um interne "Pyramiden" zu erstellen, damit Anforderungen für niedrigere Auflösungen als die vollständigen Bildabmessungen mit einer Teilmenge von Daten erfüllt werden können. Die Leistungssteigerung ist in den meisten Fällen den Speicherplatz mehr als wert. Sie sollten mit den Levels herumspielen, die Sie hier verwenden. Bei sehr großen Bildern können Sie möglicherweise einige ablegen. Der Befehl gdaladdo sieht ungefähr so aus:
gdaladdo
-r average
my_image.tif
2 4 8 16 32 64 128 256
Ich würde vorschlagen, mit diesen Ebenen zu experimentieren, um eine optimale Leistung zu erzielen. Möglicherweise ist ein anderes Resampling-Intervall für Ihre Anwendung besser oder Sie können je nach Bildgröße einige der höheren Zahlen löschen (oder es werden mehr benötigt).
Wenn Sie eine externe Übersicht erstellen (mit der Option -ro), sollten Sie die Konfigurationszeilen für die JPEG-Komprimierung hinzufügen:
--config COMPRESS_OVERVIEW JPEG
--config PHOTOMETRIC_OVERVIEW YCBCR
--config INTERLEAVE_OVERVIEW BAND
(Ich glaube, dass diese vom übergeordneten GeoTIFF für eingebettete Übersichten geerbt werden.)
Anmerkungen
Als ich mit diesem Problem konfrontiert wurde, fragte ich auf dem # gdal-Kanal auf freenode.irc.net. Dies ist eine erstaunliche Ressource, und ich bin Howard Butler, Frank Warmerdam und Even Rouault zu großem Dank verpflichtet, dass sie mir dabei geholfen haben.
^
für einen Zeilenumbruch, der bei der Ausführung verbunden wird (z. B.^
am Ende jedes obigen Codezeilenbeispiels hinzufügen , um sowohl Lesbarkeit als auch Ausführungsfähigkeit zu gewährleisten). Wichtige Einschränkung:Ja, aber durch Versuch und Irrtum konnte ich feststellen, dass -vrtnodata 255 den Effekt hat, alles, was weiß ist, als Nodata zu kennzeichnen, nicht nur außerhalb der Karte, die gdal2tiles dann mit Alpha-Transparenz gemäß dem Flag -a behandelt.
Am Ende ist ein Teil Ihres Quellbilds transparent, in meinem Fall die weißen Teile gestrichelter Straßen. Dies ist kein Terminal, aber es wäre sicher schön, wenn Sie gdal2tiles die Farbe "no src image" angeben könnten, entweder als Ergebnis von ursprünglichen Hohlräumen im vrt oder als Ergebnis von Warp. Für mein Set wäre ein blassblauer Farbton genau das Richtige.
Nach noch mehr Versuch und Irrtum scheint es, dass Hidenodata der Schlüssel sind. Ich weiß nicht, warum diese Tools so minimal dokumentiert sind. Hier ist was für mich funktioniert, gdal 1.8.
quelle
Ich bin mit GDAL nicht allzu vertraut, aber ich denke, dass eine Methode oder ein Befehl verfügbar ist, mit der Sie ein Pixel eines bestimmten Werts mit einem anderen Wert festlegen können.
Nichts damit zu tun, aber in einfachem SQL so etwas wie (nur zur Veranschaulichung - das ist viel mehr Pseudocode):
UPDATE-Raster SET pixel = 255 WHERE pixel = NoData;
Ich würde gerne die Antwort wissen!
quelle