Risposte:
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.
generate_tfw
non funziona correttamente sui raster ruotati, che fortunatamente sono meno comuni. Questo può essere risolto con un po 'di moltiplicazione di matrici.
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.
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.
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 projectionString
file di proiezione.
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.