Erstellen von TFW- und PRJ-Dateien für Ordner mit GeoTIFF-Dateien? [geschlossen]

16

Ich habe einen Ordner, der eine große Anzahl von Dateien im GeoTIFF-Format enthält.

Ich muss für jedes dieser Bilder sowohl PRJ- als auch TFW-Dateien generieren.

Gibt es eine Möglichkeit, dies zu tun?

Joe
quelle
Mit welcher Software? Was steht Ihnen zur Verfügung?
jbchurchill

Antworten:

16

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.

MerseyViking
quelle
2
Beachten Sie, dass generate_tfwdies bei gedrehten Rastern, die glücklicherweise weniger häufig sind , nicht richtig funktioniert. Dies kann mit ein wenig Matrixmultiplikation behoben werden.
Mike T
Hey Mann, ich versuche das Tool zu benutzen, aber ich weiß nicht, wie ich es machen soll, genau. Können Sie uns bitte genauer erklären, wie wir es benutzen? Ich muss nur die tfw für die TIFs in Ordnern und Unterordnern generieren. Wenn es nicht in Unterordnern ausgeführt werden kann, ist das in Ordnung. Ich kann es mehrmals ausführen. Danke
Raffael
Wählen Sie im QGIS-Menü "Raster" die Option "Konvertierung" und anschließend "Übersetzen - Format konvertieren". Das Fenster wird angezeigt. Wählen Sie in der oberen Zeile Ihren Geotiff aus und drücken Sie unter Erweiterte Parameter + Zeichen, um einen Befehl hinzuzufügen. Geben Sie unter Name das Wort tfw und unter Wert das Wort yes ein. Geben Sie das Ausgabeziel, den Namen der Datei und den Namen des Voilas an. Ihre Geotiff-Datei wird in Nur-TIFF- und TFW-Teil konvertiert. Jetzt können Sie tiff in einem Bildeditor Ihrer Wahl bearbeiten und geolokalisieren, solange Sie nicht die Anzahl der Pixel auf der x- oder y-Achse
ändern
19

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.

Mike T
quelle
"Es wäre schön, wenn dasselbe Dienstprogramm auch die PRJ-Datei extrahieren könnte." -> Aber das tut es nicht.
Astrojuanlu
0

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.

Ian Turton
quelle
2
Abgesehen davon, dass in GeoTIFF-Dateien häufig sowohl eine Projektions- als auch eine Weltdatei in den Metadaten eingebettet ist, sind alle diese Informationen bekannt.
Mike T
1
In welchem ​​Fall würden Sie es als separate Dateien ausgeben?
Ian Turton
1
Vermutlich versteht die von Joe verwendete Software GeoTIFFs mit eingebetteten Metadaten nicht.
MerseyViking
ja hatte das gleiche Problem Metadaten extrahiert , die für die GIS - Web - App sein .tfw zu ‚wissen‘ die Orte jeder Kachel - Verwendung eigenes Skript extrahiert es (Excel -. Makro zu der Zeit)
Mapperz
0

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 projectionStringin Ihre Projektionsdatei.

Lars
quelle
0

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.

Bildbeschreibung hier eingeben

user29347
quelle