Konvertieren Sie riesige XYZ-CSVs in GeoTIFF

11

Ich habe eine große Datenmenge in Form von CSV, die UTM-Koordinaten als Xund Yund einen Höhenwert als ZInformation enthält. Ich muss diese Daten zur weiteren Analyse in ein DEM als GeoTIFF konvertieren. In diesem Fall bedeutet eine große Menge 16 m. Linien mit einem Punkt in den X, Yund Zpro Zeile. Die Punkte sind gleichmäßig verteilt, daher ist keine Interpolation erforderlich. Jeder Punkt muss nur in eine Rasterzelle konvertiert werden.

Die Originaldaten kamen ohne Trennzeichen mit festen Spaltenbreiten. Ich habe bereits herausgefunden, wie man die Dateisyntax konvertiert, um ein Trennzeichen anstelle fester Breiten zu verwenden und alle Leerzeichen mit dem Stream-Texteditor sed zu entfernen . Von hier an, normalerweise würde mein Workflow wird die Daten in ArcGIS zu importieren , indem Sie einen Feature - Class von den Erstellung X, Yund ZDaten und in einem zweiten Schritt, den Punkt Shape - Datei in eine GeoTIFF Umwandlung, die unter Verwendung von Punkt - zu - Raster - Werkzeug. Die Datei, die ich derzeit habe, ist jedoch viel zu groß für diesen Prozess.

Anstelle des oben beschriebenen Workflows suchte ich nach einer effizienten Alternative und entdeckte GDAL. Das gdal_translatenächstgelegene unterstützte Format, das ich in der Liste der unterstützten Dateitypen finden kann, ist jedoch das ASCII-Raster, jedoch kein durch Kommas getrenntes XYZ. Eine weitere Schwierigkeit besteht darin, dass ich UTM-Koordinaten habe , während die meisten Beispiele Dezimalgradkoordinaten zu verwenden scheinen. Ich muss jedoch im UTM-System bleiben (oder zumindest muss sich mein GeoTIFF-Ausgang in einem UTM-Koordinatensystem befinden).

Ich suche nach einer Möglichkeit , die CSV XYZ mithilfe von GDAL in ein GeoTIFF umzuwandeln , konnte jedoch bisher keine Beispiele finden, die sich genau mit diesem Problem befassen. Ich würde mich sehr über einige Hinweise oder sogar Codebeispiele freuen.

Arne
quelle
Warum ist die GDAL-Methode Ihrer Meinung nach effizienter als die Esri-Methode?
Artwork21
Das genaue Beispiel für die Verwendung eines xyz-csv für ein TIFF finden Sie in der Dokumentation hier: gdal.org/gdal_grid.html
Matte
Was genau ist die Frage? Im Moment lautet die Antwort "Ja, Sie können GDAL zum Konvertieren verwenden". :}
bugmenot123
Die Frage ist, wie die Konvertierung angewendet wird. Matte's Kommentar scheint die Lösung zu bieten - ich werde es versuchen.
Arne
In Ordnung! Können Sie einen minimalen Beispielfall für Daten angeben? Möchten Sie eine Antwort in GDAL oder wären auch andere kostenlose Tools (z. B. GMT) in Ordnung?
Bugmenot123

Antworten:

16

Sie können dies mit GDAL tun, es unterstützt direkt das XYZ-Format . Es spielt keine Rolle, ob Ihre Koordinaten UTM sind, gdal_translate wird im selben Koordinatensystem ausgegeben.

Die Konvertierung in GeoTIFF ist also so einfach wie:

gdal_translate test.xyz test.tif

Weitere Verwendungsinformationen finden Sie im GeoTIFF- Dokument für Ausgabeoptionen (z. B. Komprimierung) und im Dokument gdal_translate . Insbesondere sollten Sie das Koordinatensystem mit dem -a_srsParameter angeben .

-a_srs srs_def:

Überschreiben Sie die Projektion für die Ausgabedatei. Das srs_def kann eines der üblichen GDAL / OGR-Formulare sein, vollständige WKT, PROJ.4, EPSG: n oder eine Datei, die das WKT enthält.

gdal_translate -a_srs EPSG:12345 test.xyz test.tif

Durch Kommas / Leerzeichen getrennte und feste Spaltenbreiten mit und ohne Kopfzeile werden unterstützt.

Die unterstützten Spaltentrennzeichen sind Leerzeichen, Komma, Semikolon und Tabellen.

$ head -n 2 test_space.xyz 
x y z
146.360047076550984 -39.0631214488636616 0.627969205379486084

$ gdalinfo test_space.xyz
Driver: XYZ/ASCII Gridded XYZ
Files: test_space.xyz
Size is 84, 66
Coordinate System is `'
Origin = (146.359922066953317,-39.062997159090934)
Pixel Size = (0.000250019195332,-0.000248579545455)
Corner Coordinates:
Upper Left  ( 146.3599221, -39.0629972) 
Lower Left  ( 146.3599221, -39.0794034) 
Upper Right ( 146.3809237, -39.0629972) 
Lower Right ( 146.3809237, -39.0794034) 
Center      ( 146.3704229, -39.0712003) 
Band 1 Block=84x1 Type=Float32, ColorInterp=Undefined
  Min=0.336 Max=0.721 

$ head -n 2 test_commas.xyz 
x, y, z
146.360047076550984, -39.0631214488636616, 0.627969205379486084

$ gdalinfo test_commas.xyz
Driver: XYZ/ASCII Gridded XYZ
etc...

$ head -n 2 test_formatted.xyz
x                       y                       z
146.3600471            -39.06312145             0.627969205

$ gdalinfo test_formatted.xyz
Driver: XYZ/ASCII Gridded XYZ
etc...

Die einzigen Fallstricke, die mir bekannt sind, sind:

  1. Das Öffnen eines großen Datensatzes kann langsam sein, da der Treiber die gesamte Datei scannen muss, um die Größe des Datensatzes und die räumliche Auflösung zu bestimmen. und
  2. Die Datei muss korrekt sortiert sein (nach Y, dann nach X).

    Zellen mit denselben Y-Koordinaten müssen auf aufeinanderfolgenden Linien platziert werden. Für denselben Y-Koordinatenwert müssen die Linien im Datensatz durch Erhöhen der X-Werte organisiert werden. Der Wert der Y-Koordinate kann jedoch zunehmen oder abnehmen.

    $ head -n 5 test.csv
    x,y,z
    146.3707979,-39.07778764,0.491866767
    146.3787985,-39.07157315,0.614820838
    146.3637974,-39.07132457,0.555555582
    146.3630473,-39.07579901,0.481217861
    
    $ gdalinfo test.csv
    ERROR 1: Ungridded dataset: At line 3, too many stepY values
    gdalinfo failed - unable to open 'test.csv'.
    
    $ tail -n +2 test.csv| sort -n -t ',' -k2 -k1 > test_sorted.xyz
    
    $ head -n 5 test_sorted.xyz 
    146.3600471,-39.07927912,0.606096148
    146.3602971,-39.07927912,0.603663027
    146.3605471,-39.07927912,0.603663027
    146.3607971,-39.07927912,0.589507282
    146.3610472,-39.07927912,0.581049323
    
    $ gdalinfo test_sorted.xyz
    Driver: XYZ/ASCII Gridded XYZ
    etc...
user2856
quelle
2
Ich würde dringend empfehlen, der Ausgabe ein CRS zuzuweisen, um die Koordinaten zu verdeutlichen:-a_srs EPSG:12345
bugmenot123
1
Guter Punkt @bugmenot
user2856