Antworten:
Der einfachste Weg, TFWs zu generieren, besteht darin, ein Skript in Python oder Java mit GDAL zu schreiben, was eine Handvoll Codezeilen wäre.
Die Erstellung von .prj-Dateien im alten Stil (vor ArcGis 9) wird nicht in GDAL unterstützt , sondern nur beim Lesen (siehe hier ). Dateien im neuen Stil (basierend auf WKT) werden bei der Erstellung unterstützt, es kann jedoch nicht garantiert werden, dass sie alle Fälle abdecken. In jedem Fall habe ich in einem überragenden Fall von Verschiebungsaktivitäten ein Python-Skript geschrieben, das genau das tut, was Sie benötigen. Es gibt keine Fehlerprüfung oder ähnliches, aber es funktioniert für das Verzeichnis der Tiffs, die ich zur Hand hatte, 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])
Rufen Sie es von der Kommandozeile wie folgt auf:
python gen_tfw.py <path_to_tiff_directory> [prj]
Der zweite Parameter kann prj sein, um prj-Dateien im WKT-Stil zu generieren, oder alles andere, um nur .TFWs zu generieren.
Wenn Sie Python-Skripte aus irgendeinem Grund nicht verwenden können, können Sie Folgendes verwenden:
gdal_translate -co "TFW=YES" in.tif out.tif
Dadurch werden jedoch auch die Bilddaten kopiert, sodass Sie das Original löschen müssen. Und natürlich werden keine .prj-Dateien mit beiden Geschmacksrichtungen erzeugt. Unter der Annahme, dass sich alle Ihre Tiffs in derselben Projektion befinden, können Sie einfach eine .prj-Datei von Hand erstellen und für alle Quellbilder duplizieren.
generate_tfw
dies bei gedrehten Rastern, die glücklicherweise weniger häufig sind , nicht richtig funktioniert. Dies kann mit ein wenig Matrixmultiplikation behoben werden.
Das mit libgeotiff gelieferte Dienstprogramm listgeo ist ein nützliches Befehlszeilenprogramm , mit dem Sie die TWF-Datei aus GeoTIFF-Dateien extrahieren können.
Zum Beispiel habe ich ein Verzeichnis mit GeoTIFFs und ich habe libgeotiff als Teil von OSGeo4w installiert. Sie können die OSGeo4w-Shell ausführen und dies tun:
$ listgeo -tfw BN24_GeoTif_1-01.tif
World file written to 'BN24_GeoTif_1-01.tfw'.
Es wäre schön, wenn dasselbe Dienstprogramm auch die PRJ-Datei extrahieren könnte.
Nicht wirklich - wenn Sie die Projektion der Dateien kennen, können Sie den Inhalt der prj-Datei unter http://spatialreference.org nachschlagen und dann mithilfe eines Shell-Skripts für jedes Bild eine Vorlage in jede .prj-Datei kopieren.
Die Georeferenzierung muss für jedes Bild einzeln durchgeführt werden, da die .tfw-Datei für jedes Bild unterschiedlich ist (es sei denn, sie befinden sich alle am selben Ort). http://warper.geothings.net/ ist möglicherweise der richtige Weg, wenn Sie dazu keinen Zugriff auf ein Desktop-GIS haben.
Mit Geotools in Java können Sie diesen Code verwenden:
// 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);
Wenn Sie die Projektion erhalten möchten, können Sie diesen Code verwenden:
// get the projection string from CRS
CoordinateReferenceSystem crs = reader.getCoordinateReferenceSystem();
String projectionString = crs.toWKT();
Schreiben Sie den Inhalt einfach projectionString
in Ihre Projektionsdatei.
Wenn Sie das Bild in der Fotoretuschierungs-App weiter bearbeiten und die Geolokalisierung beibehalten möchten, ist der Export von Rasterebenen mit der Erstellung eines zweiten Bilds und aktiviertem gerendertem Bild der einfachste Weg, IMO. Für leicht abweichende Optionen gibt es einen Weg durch das Menü Raster / Konvertierung / Übersetzen.