¿Crea archivos TFW y PRJ para la carpeta de archivos GeoTIFF? [cerrado]

16

Tengo una carpeta que contiene una gran cantidad de archivos en formato GeoTIFF.

Necesito generar archivos PRJ y TFW para cada una de estas imágenes.

Hay alguna manera de hacer esto?

Joe
fuente
utilizando qué software? ¿Qué hay disponible para ti?
jbchurchill

Respuestas:

16

La forma más ingeniosa de generar TFW es escribir un script en Python o Java usando GDAL, que sería un puñado de líneas de código.

La creación de archivos .prj de estilo antiguo (anteriores a ArcGis 9) no son compatibles con GDAL , solo lectura (ver aquí ). Los archivos de nuevo estilo (basados ​​en WKT) son compatibles con la creación, pero no se garantiza que cubran todos los casos. Pero de cualquier manera, en un caso supremo de actividad de desplazamiento, he escrito un script de Python que hace lo que necesita. No hay verificación de errores ni nada, pero funciona para el directorio de tiffs que tuve que entregar, 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])

Llámalo desde la línea de comando así:

python gen_tfw.py <path_to_tiff_directory> [prj]

El segundo parámetro puede ser prj para generar archivos prj de estilo WKT, o cualquier otra cosa para generar .TFWs.

Si no puede usar scripts de Python por alguna razón, puede usar:

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

Pero eso también copiará los datos de la imagen, por lo que tendrá que eliminar el original. Y, por supuesto, no generará archivos .prj de ningún sabor. Pero suponiendo que todos sus tiffs estén en la misma proyección, puede crear a mano un archivo .prj y duplicarlo para todas las imágenes de origen.

MerseyViking
fuente
2
Tenga en cuenta que generate_tfwno funciona correctamente en rásteres rotados, que afortunadamente son menos comunes. Esto se puede solucionar con un poco de multiplicación de matrices.
Mike T
Hola hombre, estoy tratando de usar la herramienta, pero no sé cómo hacerlo, exactamente. ¿Puedes por favor hacer una explicación más detallada de cómo usarlo? Solo necesito generar el tfw para los TIF, en carpetas y subcarpetas. Si no puede ejecutarse en subcarpetas, está bien. Puedo ejecutarlo varias veces. Gracias
raphael
En QGIS abra el menú "Ráster", elija "Conversión" y luego elija "Traducir - Convertir formato". Aparece la ventana: en la línea superior, elige tu geotiff y, en Parámetros avanzados, presiona + signo para agregar el comando. En Nombre ingrese la palabra tfw, en Valor ingrese sí. Especifique el destino de salida, el nombre del archivo y listo ... su archivo geotiff se convierte en tiff simple y parte tfw. Ahora puede editar tiff en el editor de imágenes de su elección y tenerlo geolocalizado siempre que no cambie la cantidad de píxeles en el eje
xo
19

La utilidad listgeo que viene con libgeotiff es una buena utilidad de línea de comandos que puede extraer el archivo TWF de los archivos GeoTIFF.

Por ejemplo, tengo un directorio de GeoTIFFs y tengo libgeotiff instalado como parte de OSGeo4w. Puede ejecutar el shell OSGeo4w y hacer esto:

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

Sería bueno si la misma utilidad también pudiera extraer el archivo PRJ también.

Mike T
fuente
"Sería bueno si la misma utilidad también pudiera extraer el archivo PRJ también". -> Pero no lo hace.
astrojuanlu
0

No realmente: si conoce la proyección de los archivos, puede buscar el contenido del archivo prj en http://spatialreference.org y luego usar un script de shell para copiar una plantilla en cada archivo .prj para cada imagen.

La georreferenciación deberá realizarse por imagen, ya que el archivo .tfw será diferente para cada imagen (a menos que estén en el mismo lugar). http://warper.geothings.net/ puede ser el camino a seguir si no tiene acceso a un SIG de escritorio para hacerlo.

Ian Turton
fuente
2
Excepto que los archivos GeoTIFF a menudo tienen una proyección y un archivo mundial incrustado en los metadatos ... por lo que toda esta información es conocida.
Mike T
1
en cuyo caso, ¿por qué lo escribirías como archivos separados?
Ian Turton
1
Presumiblemente, el software que utiliza Joe no comprende GeoTIFF con metadatos incrustados.
MerseyViking
sí, tenía el mismo problema que los metadatos necesitaban extraerse para ser .tfw para que la aplicación web gis 'conociera' las ubicaciones de cada mosaico - use su propio script para extraerlo (excel - macro en ese momento).
Mapperz
0

Usando Geotools en Java puedes usar este código:

// 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);

Si desea obtener la proyección, puede usar este código:

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

Simplemente escriba el contenido de projectionStringsu archivo de proyección.

Lars
fuente
0

Si uno quiere editar más tiff en la aplicación de retoque fotográfico y conservar su geolocalización, la OMI es la exportación de la capa ráster con la creación de tfw y la imagen renderizada habilitada. Para opciones ligeramente diferentes, hay una manera a través del menú Ráster / Conversión / Traducir.

ingrese la descripción de la imagen aquí

usuario29347
fuente