Di più

Gdal_translate crea immagini speculari

Gdal_translate crea immagini speculari


Sto riscontrando un problema con gdal_translate: durante la traduzione da un file XYZ a AAIGrid o geotiff, il raster viene specchiato e "spostato" a sud su un asse.

La parte superiore dell'immagine allegata è il file originale, quando visualizzato in QGis, il file inferiore è stato tradotto in formato AAIGrid con gdal_translate utilizzando

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

Lo stesso accade quando provo a tradurre il file XYZ in Geotiff.

Modifica: aggiunto file di esempio. Il file ha questo aspetto, le prime 2 colonne sono coordinate nel sistema di coordinate locale EPSG:3301 e la terza colonna è l'altezza in metri

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

Uscita da gdalinfo

gdalinfo 65714_dem_10m.xyz.grid Driver: AAIGrid/Arc/Info File griglia ASCII: 65714_dem_10m.xyz.grid 65714_dem_10m.xyz.prj La dimensione è 500, 500 Il sistema di coordinate è: PROJCS["Estonian_Coordinate_System_of_1997", GE_OGCS[ "Estonia_1997", SPHEROID["GRS_1980",6378137,298.257222101]], PRIMEM["Greenwich",0], UNIT["Grado",0.017453292519943295]], PROIEZIONE["Lambert_Conformal_Conic_2SP"], PARAMETRO["standard_parallel333_1",34].333333333333 , PARAMETRO["parallelo_standard_2",58], PARAMETRO["latitudine_di_origine",57.51755393055556], PARAMETRO["meridiano_centrale",24], PARAMETRO["falso_est",500000], PARAMETRO["falso_nord",6375000], UNIT["Metro ",1]] Origine = (715000.000000000000000,6575000.000000000000000) Dimensione pixel = (10.000000000000000,-10.000000000000000) Coordinate angolo: In alto a sinistra ( 715000.000, 6575000.000) ( 27d46'16.00"E, 59d15'32.02"N) In basso a sinistra ( 715000.000, 6570000.000 ) ( 27d45'58.29"E, 59d12'50.69"N) In alto a destra ( 720000.000, 6575000.000) ( 27d51'31.03"E, 59d15'22.83"N) In basso a destra ( 720000.000, 6570000.000) ( 27d51'12.91"E, 59d12'41.51"N) Centro ( 717500.000, 6572500.000) ( 27d48'44.56"E, 59d14' 6.79"N) Banda 1 Blocco=500x1 Tipo=Float32, ColorInterp= Non definito

Il.xyzil file è ordinato in un modo insolito, X crescente e Y crescente. La maggior parte dei driver GDAL può gestire tale orientamento capovolgendo l'immagine internamente. Quindi anche le coordinate "superiore" e "inferiore" vengono invertite:

Driver: File XYZ con griglia XYZ/ASCII: la dimensione test.xyz è 500, 2 Il sistema di coordinate è "Origin = (75000.000000000000000,6575000.000000000000000) Dimensione pixel = (10.000000000000000,10.000000000000000) Coordinate angolo: In alto a sinistra ( 715000.000, 6575000.000) In basso a sinistra ( 715000.000) , 6575020.000) Superiore Destra ( 720000.000, 6575000.000) Inferiore Destra ( 720000.000, 6575020.000) Centro ( 717500.000, 6575010.000) Banda 1 Blocco=500x1 Tipo=Float32, ColorInterp=Undefined Min=28.452 Max=31.080 NoData Value=0

Se ordini il.xyzfile per X crescente e Y decrescente, i metadati appaiono in modo logico:

Driver: File XYZ con griglia XYZ/ASCII: testsort.xyz La dimensione è 500, 2 Il sistema di coordinate è "Origin = (75000.000000000000000,6575020.000000000000000) Dimensione pixel = (10.000000000000000,-10.000000000000000) Coordinate angolo: In alto a sinistra ( 715000.000, 6575020.000) In basso a sinistra ( 715000.000, 6575000.000) Superiore Destra ( 720000.000, 6575020.000) Inferiore Destra ( 720000.000, 6575000.000) Centro ( 717500.000, 6575010.000) Banda 1 Blocco=500x1 Tipo=Float32, ColorInterp=Undefined Min=28,452 Max=31.080 NoData Value=0

Sfortunatamente, il formato AAIGrid non è progettato per il primo orientamento e nessuno ha implementato per rilevare questo problema tramite un messaggio di errore o ribaltando internamente le coordinate. Di conseguenza, l'intestazione per AAIGrid viene generata in modo errato:

ncols 500 nrows 2 xllcorner 715000.000000000000 yllcorner 6574980.000000000000 cellsize 10.000000000000 NODATA_value 0

I seguenti dati sono sempre in linea da in alto a sinistra a in basso a destra.

Come una sorta di hack, puoi usare gdalwarp invece di gdal_translate per salvare il tuo raster come tif, e quindi tradurre in AAIGrid:

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

che fornisce l'intestazione corretta:

ncols 500 nrows 2 xllcorner 715000.000000000000 yllcorner 6575000.000000000000 cellsize 10.000000000000 NODATA_value 0

Puoi provare se questa soluzione alternativa funziona. Usa questo comando:

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

Apri il file TFW e modifica la quarta riga che fornisce la dimensione in pixel nord-sud. Credo che tu abbia ora come "-10". Cambialo in positivo "10" e prova con QGIS. L'immagine potrebbe aprirsi in una posizione corretta. Se lo fa, puoi scrivere un nuovo GeoTIFF con tutti i normali tag di geotrasformazione con gdalwarp

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

Devo dire che questa è solo un'ipotesi azzardata, ma potrebbe funzionare.


Riprendendo un vecchio argomento su una questione ancora attuale.

Propongo 2 soluzioni alternative per risolvere il problema del mirroring verticale dei file ESRI ASC esportati da QGIS:

  1. Una soluzione solo per la GUI
  2. Una soluzione alternativa alla riga di comando

Soluzione alternativa solo GUI GUI

Ciò comporta:

  1. Esporta come GeoTiff, impostando una "Risoluzione verticale" negativa
  2. Usa Raster->Conversione->Traduci per esportare come ASC
  3. Imposta le opzioni di esportazione ASC

Esporta come GeoTiff, impostando una "Risoluzione verticale" negativa

Questo crea un file GeoTIFF standard e valido, in cui l'ordine delle righe è invertito. Per fare ciò, la "Risoluzione verticale" deve essere negativa. Basta aggiungere un segno "meno" a qualsiasi risoluzione sia presente. Non modificarne il valore assoluto. Per esempio:

"Risoluzione verticale = 1000" -> "Risoluzione verticale = -1000" "Risoluzione verticale = 50" -> "Risoluzione verticale = -50"

hai l'idea :) Seleziona "Aggiungi file salvato alla mappa" per caricare il file GeoTIFF salvato nella mappa corrente e ispezionarlo visivamente.

Usa Raster->Conversione->Traduci per esportare come ASC

L'esportazione ASC in QGIS è disponibile solo tramite gdal_translate (e altri strumenti GDAL, in realtà), a cui puoi accedere tramite il menu Raster-> Conversione-> Traduci.

Seleziona nel pannello dei livelli il file che hai appena esportato e scegli il comando di menu "Raster->Conversione->Traduci":

Imposta le opzioni di esportazione ASC

Assicurati di avere queste opzioni selezionate. In particolare, "Aggiungi file salvato alla mappa" importerà l'asc appena creato nella mappa QGIS corrente in modo che tu possa assicurarti visivamente che tutto abbia funzionato correttamente.

Fare clic su Esegui; se tutto fosse a posto, la tua mappa dovrebbe avere il livello ASC finale renderizzato esattamente sul raster originale.

Soluzione alternativa da riga di comando

Vedi il GIST che ho pubblicato: https://gist.github.com/rafdouglas/9a5548b4a259ec2c7823826b65feeafd

#!/bin/bash # # corregge l'errore di mirroring verticale dei file ASC esportati da QGIS # tramite il comando "Raster->Conversion->Translate" # (che a sua volta invoca gdal_translate) # # RafDouglas - 190505 # # # header di esempio sezione del file ASC: # #ncols 600 #nrows 300 #xllcorner 565200.000000000000 #yllcorner 4797400.000000000000 #cellsize 10.000000000000 #NODATA_value 0 if [ -z $1 ]; then echo "Utilizzo: $0 file_input.asc" exit fi if [ ! -e $1]; then echo "Utilizzo: $0 file_input.asc" echo "Il file di input specificato ($1) non esiste." 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" #aggiunge le righe di dati in ordine inverso tail -n+7 "$infile"|tac >> "$mytmp_file" if [ ! -e $file di uscita]; then mv -n "$mytmp_file" "$outfile" cp -n "$inprj" "$outprj" echo echo "File di output: $outfile è pronto" else cp -n "$inprj" "$mytmp_prj" echo echo "Attenzione : $outfile è già presente. Non sovrascriverlo." echo "File di output: $mytmp_file è pronto" fi echo

Guarda il video: GDAL Tutorial #2: Converting, Resampling, Reprojecting, Clipping