Mehr

Gdal_translate erstellt gespiegelte Bilder


Ich habe ein Problem mit gdal_translate - beim Übersetzen von einer XYZ-Datei in AAIGrid oder Geotiff wird das Raster gespiegelt und auf einer Achse nach Süden "bewegt".

Der obere Teil des angehängten Bildes ist die Originaldatei, wenn sie in QGis angezeigt wird, wurde die untere Datei mit gdal_translate unter Verwendung von . in das AAIGrid-Format übersetzt

gdal_translate -of AAIGrid -a_srs EPSG:3301 grid.xyz grid.grd

Das gleiche passiert, wenn ich versuche, die XYZ-Datei in Geotiff zu übersetzen.

Bearbeiten: Dateibeispiel hinzugefügt. Die Datei sieht so aus, die ersten 2 Spalten sind Koordinaten im lokalen Koordinatensystem EPSG: 3301 und die dritte Spalte ist die Höhe in Metern

719935 6575005 30.709999 719945 6575005 31.08 719955 6575005 30.805 719965 6575005 30.772499 719975 6575005 30.2775 719985 6575005 30.1175 719995 6575005 30.012501 715005 6575015 28.525 715015 6575015 28.715 715025 6575015 28.834999 715035 6575015 28.6875 715045 6575015 28.452499 715055 6575015 29.147499

Ausgabe von gdalinfo

gdalinfo 65714_dem_10m.xyz.grid Treiber: AAIGrid/Arc/Info ASCII-Gitterdateien: 65714_dem_10m.xyz.grid 65714_dem_10m.xyz.prj Größe beträgt 500, 500 "Estonia_1997", SPHEROID["GRS_1980",6378137,298.257222101]], PRIMEM["Greenwich",0], UNIT["Degree",0.017453292519943295]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel333333",333333333. , PARAMETER["standard_parallel_2",58], PARAMETER["latitude_of_origin",57.51755393055556], PARAMETER["central_meridian",24], PARAMETER["false_easting",500000], PARAMETER["false_northing",6375000], UNIT[" ",1]] Ursprung = (715000.000000000000000,6575000.000000000000000) Pixelgröße = (10.000000000000000,-10.000000000000000) Eckkoordinaten: Oben links ( 715000.000, 6575000.000) ( 27d46'16.00"E, 59d15'32.02"N) Unten links ( 715000.000, 6570000.000 ) ( 27d45'58.29"E, 59d12'50.69"N) Oben rechts ( 720000.000, 6575000.000) ( 27d51'31.03"E, 59d15'22.83"N) Unten rechts ( 720000.000, 6570000.000) ( 27d51'12.91"E, 59d12'41.51"N) Mitte ( 717500.000, 6572500.000) ( 27d48'44.56"E, 59d14' 6.79"N) Band 1 Block=500x1 Typ=Float32, ColorInterp= Nicht definiert

Das.xyzDatei wird auf ungewöhnliche Weise sortiert, X aufsteigend und Y aufsteigend. Die meisten GDAL-Treiber können diese Ausrichtung verarbeiten, indem sie das Bild intern spiegeln. Somit werden auch die "oberen" und "unteren" Koordinaten gespiegelt:

Treiber: XYZ/ASCII Gridded XYZ Files: test.xyz Größe ist 500, 2 Koordinatensystem ist "Ursprung = (715000.000000000000000,6575000.000000000000000) Pixelgröße = (10.000000000000000,10.000000000000000) Eckkoordinaten: Oben links ( 715000.000, 6575000.000) Unten links ( 715000.000 , 6575020.000) Oben rechts ( 720000.000, 6575000.000) Unten rechts ( 720000.000, 6575020.000) Mitte ( 717500.000, 6575010.000) Band 1 Block=500x1 Type=Float32, ColorInterp=Undefined Min=28.452 Max=31.080 NoData Value=0

Wenn du die sortierst.xyzDatei von X aufsteigend und Y absteigend, erscheinen die Metadaten logisch:

Treiber: XYZ/ASCII Gridded XYZ Files: testsort.xyz Size is 500, 2 Coordinate System is"Origin = (715000.000000000000000,6575020.000000000000000) Pixel Size = (10.0000000000000000,-10.0000000000000000) Eckkoordinaten: Oben links ( 715000.000, 6575020.000) Unten links ( 715000.000, 6575000.000) Oben rechts ( 720000.000, 6575020.000) Unten rechts ( 720000.000, 6575000.000) Mitte ( 717500.000, 6575010.000) Band 1 Block=500x1 Type=Float32, ColorInterp=Undefined Min=28.452 Max=31.080 NoData Value=0

Leider ist das AAIGrid-Format nicht für die erste Orientierung ausgelegt, und niemand hat implementiert, um dieses Problem durch eine Fehlermeldung oder internes Zurückdrehen der Koordinaten abzufangen. Als Konsequenz wird der Header für AAIGrid falsch generiert:

ncols 500 nrows 2 xllcorner 715000.000000000000 yllcorner 6574980.000000000000 Zellengröße 10.000000000000 NODATA_value 0

Die folgenden Daten sind immer zeilenweise von links oben nach rechts unten.

Als eine Art Hack können Sie gdalwarp anstelle von gdal_translate verwenden, um Ihr Raster als tif zu speichern und dann in AAIGrid zu übersetzen:

gdalwarp test.xyz 3301.tif gdalinfo 3301.tif gdal_translate -of AAIGRID 3301.tif 3301.asc

was den richtigen Header liefert:

ncols 500 nrows 2 xllcorner 715000.000000000000 yllcorner 6575000.000000000000 Zellengröße 10.000000000000 NODATA_value 0

Sie können versuchen, ob diese Problemumgehung funktioniert. Verwenden Sie diesen Befehl:

gdal_translate -of GTiff -co PROFILE=BASELINE -co TFW=YES -a_srs EPSG:3301 grid.xyz grid.tif

Öffnen Sie die TFW-Datei und bearbeiten Sie die vierte Zeile, die die Nord-Süd-Pixelgröße angibt. Ich glaube, dass Sie jetzt als "-10" haben. Ändern Sie es auf positiv "10" und testen Sie mit QGIS. Das Bild kann an einer richtigen Stelle geöffnet werden. Wenn dies der Fall ist, können Sie mit gdalwarp ein neues GeoTIFF mit allen normalen Geotransformations-Tags schreiben

gdalwarp -of GTiff -s_srs epsg:3301 -t_srs epsg:3301 grid.tif normalized.tif

Ich muss sagen, dass dies nur eine wilde Vermutung ist, aber es kann funktionieren.


Wiederaufnahme eines alten Themas zu einem immer noch aktuellen Thema.

Ich schlage 2 Problemumgehungen vor, um das Problem der vertikalen Spiegelung von aus QGIS exportierten ESRI ASC-Dateien zu lösen:

  1. Ein GUI-only Workaround
  2. Ein Kommandozeilen-Workaround

Nur GUI-Problemumgehung

Dies beinhaltet:

  1. Als GeoTiff exportieren, während eine negative "Vertikale Auflösung" eingestellt wird
  2. Verwenden Sie Raster->Konvertierung->Übersetzen, um als ASC . zu exportieren
  3. ASC-Exportoptionen festlegen

Als GeoTiff exportieren, während eine negative "Vertikale Auflösung" eingestellt wird

Dadurch wird eine gültige Standard-GeoTIFF-Datei erstellt, in der die Reihenfolge der Zeilen umgekehrt ist. Dazu muss die "Vertikale Auflösung" negativ sein. Fügen Sie einfach ein "Minus"-Zeichen zu der Auflösung hinzu. Ändern Sie den absoluten Wert nicht. Beispielsweise:

"Vertikale Auflösung = 1000" -> "Vertikale Auflösung = -1000" "Vertikale Auflösung = 50" -> "Vertikale Auflösung = -50"

Sie haben die Idee :) Aktivieren Sie "Gespeicherte Datei zur Karte hinzufügen", um die gespeicherte GeoTIFF-Datei in Ihre aktuelle Karte zu laden und sie visuell zu überprüfen.

Verwenden Sie Raster->Konvertierung->Übersetzen, um als ASC . zu exportieren

Der ASC-Export in QGIS ist nur über gdal_translate (und tatsächlich andere GDAL-Tools) verfügbar, auf die Sie über das Menü Raster->Konvertierung->Übersetzen zugreifen können.

Wählen Sie im Ebenenbedienfeld die Datei aus, die Sie gerade exportiert haben, und wählen Sie den Menübefehl "Raster->Konvertierung->Übersetzen":

ASC-Exportoptionen festlegen

Stellen Sie sicher, dass diese Optionen aktiviert sind. Insbesondere importiert "Gespeicherte Datei zur Karte hinzufügen" die neu erstellte asc in Ihre aktuelle QGIS-Karte, damit Sie visuell sicherstellen können, dass alles richtig funktioniert hat.

Klicken Sie auf Ausführen; Wenn alles in Ordnung war, sollte Ihre Karte den endgültigen ASC-Layer genau über dem ursprünglichen Raster gerendert haben.

Problemumgehung über die Befehlszeile

Siehe das von mir veröffentlichte GIST: https://gist.github.com/rafdouglas/9a5548b4a259ec2c7823826b65feeafd

#!/bin/bash # # korrigiert den vertikalen Spiegelungsfehler von aus QGIS exportierten ASC-Dateien # über den Befehl "Raster->Conversion->Translate" # (der wiederum gdal_translate aufruft) # # RafDouglas - 190505 # # # example header Abschnitt der ASC-Datei: # #ncols 600 #nrows 300 #xllcorner 565200.000000000000 #yllcorner 4797400.000000000000 #cellsize 10.000000000000 #NODATA_value 0 if [ -z $1 ]; then echo "Verwendung: $0 input_file.asc" exit fi if [ ! -e $1]; then echo "Verwendung: $0 input_file.asc" echo "Die angegebene Eingabedatei ($1) existiert nicht." exit fi mypid=$$ mytmp_file="temp_""$mypid"'.asc' mytmp_prj="temp_""$mypid"'.prj' infile=$1 inprj=$(echo $infile|sed 's/.asc/ .prj/g') outfile=$(echo $infile|sed 's/.asc/_proper.asc/g') outprj=$(echo $infile|sed 's/.asc/_proper.prj/g') head -6 "$infile"|awk '{h[$1]=$2}END{ yllcorner_proper=h["yllcorner"]+h["nrows"]*h["cellsize"] print "ncols " h["ncols "] print "nrows " h["nrows"] print "xllcorner " h["xllcorner"] #print "yllcorner " h["yllcorner"] print "yllcorner " yllcorner_proper print "cellsize " h["cellsize"] print " NODATA_value " h["NODATA_value"] }' > "$mytmp_file" #hinzufügen der Datenzeilen in umgekehrter Reihenfolge tail -n+7 "$infile"|tac >> "$mytmp_file" if [ ! -e $outfile ]; then mv -n "$mytmp_file" "$outfile" cp -n "$inprj" "$outprj" echo echo "Ausgabedatei: $outfile ist fertig" else cp -n "$inprj" "$mytmp_prj" echo "Waring : $outfile ist bereits vorhanden. Es wird nicht überschrieben." echo "Ausgabedatei: $mytmp_file ist fertig" fi echo


Schau das Video: Convert between CSV and GeoTIFF with GDAL in Python (Oktober 2021).