Criando arquivos TFW e PRJ para a pasta de arquivos GeoTIFF? [fechadas]

16

Eu tenho uma pasta que contém um grande número de arquivos no formato GeoTIFF.

Preciso gerar arquivos PRJ e TFW para cada uma dessas imagens.

Existe alguma maneira de fazer isso?

Joe
fonte
usando qual software? O que está disponível para você?
jbchurchill

Respostas:

16

A maneira mais eficiente de gerar TFWs é escrever um script em Python ou Java usando GDAL, o que seria um punhado de linhas de código.

A criação de arquivos .prj à moda antiga (anterior ao ArcGis 9) não é compatível com GDAL , apenas leitura (veja aqui ). Os arquivos de novo estilo (com base no WKT) são suportados para criação, mas não é garantido que eles abranjam todos os casos. Mas de qualquer maneira, em um caso supremo de atividade de deslocamento, escrevi um script Python que faz o que você precisa. Não há verificação de erros nem nada, mas funciona para o diretório de tiffs que eu tinha em mãos, 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])

Chame a partir da linha de comando da seguinte maneira:

python gen_tfw.py <path_to_tiff_directory> [prj]

O segundo parâmetro pode ser prj para gerar arquivos prj no estilo WKT ou qualquer outra coisa para gerar apenas .TFWs.

Se você não puder usar scripts Python por qualquer motivo, poderá usar:

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

Mas isso também copiará os dados da imagem, portanto você terá que excluir o original. E, é claro, não gerará arquivos .prj de qualquer um dos tipos. Mas, supondo que todos os seus argumentos estejam na mesma projeção, você pode criar manualmente um arquivo .prj e duplicá-lo para todas as imagens de origem.

MerseyViking
fonte
2
Observe que generate_tfwnão funciona corretamente em rasters rotacionados, que felizmente são menos comuns. Isso pode ser corrigido com um pouco de multiplicação de matrizes.
Mike T
Ei, cara, estou tentando usar a ferramenta, mas não sei fazer exatamente. Você pode, por favor, fazer uma explicação mais detalhada de como usá-lo? Eu só preciso gerar o tfw para os TIFs, em pastas e subpastas. Se não puder ser executado em subpastas, tudo bem. Eu posso executá-lo várias vezes. Obrigado
raphael
No QGIS, abra o menu "Raster", escolha "Conversion" e escolha "Translate - Convert format". Aparecerá uma janela - na linha superior, escolha seu geotiff e, em Parâmetros avançados, pressione o sinal + para adicionar o comando. Em Nome, digite a palavra tfw, em Valor, digite sim. Especifique o destino da saída, o nome do arquivo e pronto ... seu arquivo geotiff é convertido em tiff simples e parte tfw. Agora você pode editar tiff no editor de imagem de sua escolha e tem geolocated, desde que você não altere o número de pixels em eixo x ou y
user29347
19

O utilitário listgeo que acompanha o libgeotiff é um bom utilitário de linha de comando que pode extrair o arquivo TWF dos arquivos GeoTIFF.

Por exemplo, eu tenho um diretório de GeoTIFFs e o libgeotiff instalado como parte do OSGeo4w. Você pode executar o shell OSGeo4w e faça o seguinte:

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

Seria bom se o mesmo utilitário também pudesse extrair o arquivo PRJ.

Mike T
fonte
"Seria bom se o mesmo utilitário também pudesse extrair o arquivo PRJ também." -> Mas não.
astrojuanlu
0

Na verdade, não - se você conhece a projeção dos arquivos, pode procurar o conteúdo do arquivo prj em http://spatialreference.org e usar um shell script para copiar um modelo para cada arquivo .prj de cada imagem.

A georreferenciação precisa ser feita por imagem, pois o arquivo .tfw será diferente para cada imagem (a menos que eles estejam no mesmo local). http://warper.geothings.net/ pode ser o caminho a percorrer se você não tiver acesso a um GIS da área de trabalho para fazer isso.

Ian Turton
fonte
2
Exceto que os arquivos GeoTIFF geralmente têm um arquivo mundial e de projeção incorporado nos metadados. Portanto, todas essas informações são conhecidas.
Mike T
1
nesse caso, por que você escreveria como arquivos separados?
Ian Turton
1
Presumivelmente, o software que Joe está usando não entende GeoTIFFs com metadados incorporados.
MerseyViking
yes teve o mesmo problema que os metadados precisaram ser extraídos para serem .tfw para o aplicativo da web gis 'conhecer' os locais de cada bloco - use o próprio script para extraí-lo (excel - macro na época.)
Mapperz
0

Usando Geotools em Java, você pode 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);

Se você deseja obter a projeção, pode usar este código:

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

Basta escrever o conteúdo projectionStringno seu arquivo de projeção.

Lars
fonte
0

Se alguém quiser editar mais o aplicativo de retoque de fotos e reter sua localização geográfica, a exportação da camada rasterizada com a criação de tfw e a imagem renderizada ativada é a maneira mais fácil, IMO. Para opções ligeiramente diferentes, existe um caminho no menu Raster / Conversion / Translate.

insira a descrição da imagem aqui

user29347
fonte