Respostas:
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.
generate_tfw
não funciona corretamente em rasters rotacionados, que felizmente são menos comuns. Isso pode ser corrigido com um pouco de multiplicação de matrizes.
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.
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.
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 projectionString
no seu arquivo de projeção.
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.