Creazione di file TFW e PRJ per la cartella dei file GeoTIFF? [chiuso]


16

Ho una cartella che contiene un gran numero di file in formato GeoTIFF.

Devo generare sia file PRJ che TFW per ciascuna di queste immagini.

C'è un modo per farlo?


usando quale software? Cosa è a tua disposizione?
jbchurchill

Risposte:


16

Il modo più semplice per generare TFW è scrivere uno script in Python o Java usando GDAL, che sarebbe una manciata di righe di codice.

La creazione di file .prj vecchio stile (pre ArcGis 9) non è supportata da GDAL , ma solo lettura (vedi qui ). I file di nuovo stile (basati su WKT) sono supportati per la creazione, ma non è garantito che coprano tutti i casi. Ma in entrambi i casi, in un caso supremo di attività di spostamento, ho scritto uno script Python che fa quello che ti serve. Non c'è nessun controllo degli errori o altro, ma funziona per la directory di TIFF che ho dovuto gestire, YMMV.

# Written by MerseyViking (mersey dot viking at gmail dot com), 2011.
# Released into the public domain - May 8, 2011
# I accept no responsibility for any errors or loss of data, revenue, or life this script may cause. Use at your own risk.

import osgeo.gdal as gdal
import osgeo.osr as osr
import os
import glob
import sys

def generate_tfw(path, gen_prj):
    for infile in glob.glob(os.path.join(path, '*.tif')):
        src = gdal.Open(infile)
        xform = src.GetGeoTransform()

        if gen_prj == 'prj':
            src_srs = osr.SpatialReference()
            src_srs.ImportFromWkt(src.GetProjection())
            src_srs.MorphToESRI()
            src_wkt = src_srs.ExportToWkt()

            prj = open(os.path.splitext(infile)[0] + '.prj', 'wt')
            prj.write(src_wkt)
            prj.close()

        src = None
        edit1=xform[0]+xform[1]/2
        edit2=xform[3]+xform[5]/2

        tfw = open(os.path.splitext(infile)[0] + '.tfw', 'wt')
        tfw.write("%0.8f\n" % xform[1])
        tfw.write("%0.8f\n" % xform[2])
        tfw.write("%0.8f\n" % xform[4])
        tfw.write("%0.8f\n" % xform[5])
        tfw.write("%0.8f\n" % edit1)
        tfw.write("%0.8f\n" % edit2)
        tfw.close()

if __name__ == '__main__':
    generate_tfw(sys.argv[1], sys.argv[2])

Chiamalo dalla riga di comando in questo modo:

python gen_tfw.py <path_to_tiff_directory> [prj]

Il secondo parametro può essere prj per generare file prj in stile WKT o qualsiasi altra cosa per generare semplicemente .TFW.

Se non puoi utilizzare gli script Python per qualsiasi motivo, puoi utilizzare:

gdal_translate -co "TFW=YES" in.tif out.tif

Ma questo copierà anche i dati dell'immagine, quindi dovrai eliminare l'originale. E, naturalmente, non genererà file .prj di entrambi i tipi. Ma supponendo che tutti i tuoi tiff siano nella stessa proiezione, potresti semplicemente creare un file .prj e duplicarlo per tutte le immagini di origine.


2
Si noti che generate_tfwnon funziona correttamente sui raster ruotati, che fortunatamente sono meno comuni. Questo può essere risolto con un po 'di moltiplicazione di matrici.
Mike T,

Ehi amico, sto cercando di usare lo strumento, ma non so come fare, esattamente. Potete per favore fare spiegazioni più dettagliate su come usarlo? Devo solo generare il file tfw per i TIF, in cartelle e sottocartelle. Se non può funzionare su sottocartelle, va bene. Posso eseguirlo più volte. Grazie
Raffaello,

Nel menu "Raster" di QGIS, seleziona "Conversione", quindi "Traduci - Converti formato". Viene visualizzata la finestra: nella riga superiore scegli il tuo geotiff e in Parametri avanzati, premi + segno per aggiungere il comando. In Nome immettere la parola tfw, in Valore immettere Sì. Specifica la destinazione dell'output, il nome del file e voilà ... il tuo file geotiff viene convertito in parte tiff e tfw. Ora puoi modificare tiff nell'editor di immagini che preferisci e lo ha geolocalizzazione finché non cambi il numero di pixel nell'asse xo y
user29347

19

L' utilità listgeo fornita con libgeotiff è una bella utility da riga di comando che può estrarre il file TWF dai file GeoTIFF.

Ad esempio, ho una directory di GeoTIFF e ho installato libgeotiff come parte di OSGeo4w. È possibile eseguire la shell OSGeo4w e procedere come segue:

$ listgeo -tfw BN24_GeoTif_1-01.tif
World file written to 'BN24_GeoTif_1-01.tfw'.

Sarebbe bello se la stessa utility potesse estrarre anche il file PRJ.


"Sarebbe bello se la stessa utility potesse estrarre anche il file PRJ." -> Ma non lo fa.
astrojuanlu,

0

Non proprio - se conosci la proiezione dei file, puoi cercare il contenuto del file prj su http://spatialreference.org e quindi usare uno script di shell per copiare un modello in ciascuno di un file .prj per ogni immagine.

La georeferenziazione dovrà essere eseguita in base all'immagine, poiché il file .tfw sarà diverso per ogni immagine (a meno che non siano tutti nello stesso posto). http://warper.geothings.net/ potrebbe essere la strada da percorrere se non hai accesso a un GIS desktop per farlo.


2
Solo che i file GeoTIFF hanno spesso sia un file di proiezione che un file mondiale incorporato nei metadati .. quindi tutte queste informazioni sono note.
Mike T,

1
in tal caso, perché dovresti scriverlo come file separato?
Ian Turton

1
Presumibilmente il software che Joe sta usando non comprende i GeoTIFF con metadati incorporati.
MerseyViking

sì, aveva lo stesso problema che i metadati dovevano essere estratti .tfw affinché l'app web gis potesse "conoscere" le posizioni di ogni riquadro - usare il proprio script per
estrarlo

0

Utilizzando Geotools in Java è possibile utilizzare questo codice:

// read geotiff file (using org.geotools.gce.geotiff.GeoTiffReader)
GeoTiffReader reader = new GeoTiffReader(geotiff);
// get transformation
AffineTransform transformation = reader.getMetadata().getModelTransformation();
// create org.geotools.data.WorldFileWriter (world file is created automatically!)
WorldFileWriter worldFileWriter = new WorldFileWriter(myWorldFile, transformation);

Se vuoi ottenere la proiezione puoi usare questo codice:

// get the projection string from CRS
CoordinateReferenceSystem crs = reader.getCoordinateReferenceSystem();
String projectionString = crs.toWKT();

Basta scrivere il contenuto del projectionStringfile di proiezione.


0

Se si desidera modificare ulteriormente tiff nell'app di fotoritocco e mantenerne la geolocalizzazione, l'esportazione del livello raster con creazione tfw e immagine renderizzata abilitata è il modo più semplice, IMO. Per opzioni leggermente diverse è possibile accedere al menu Raster / Conversione / Traduci.

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.