Ответы:
Самый лучший способ генерировать TFW - это написать скрипт на Python или Java с использованием GDAL, который будет состоять из нескольких строк кода.
Создание файлов в старом стиле (до ArcGis 9) .prj не поддерживает GDAL , только чтение (см. Здесь ). Файлы нового стиля (на основе WKT) поддерживаются для создания, но не гарантируется, что они охватывают все случаи. Но в любом случае, в высшем случае смещения, я написал скрипт на Python, который делает то, что вам нужно. Там нет проверки ошибок или чего-то еще, но это работает для каталога TIFF, который я должен был передать, 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])
Вызовите это из командной строки следующим образом:
python gen_tfw.py <path_to_tiff_directory> [prj]
Вторым параметром может быть prj для генерации prj-файлов в WKT-стиле или что-то еще для генерации .TFW.
Если вы не можете использовать скрипты Python по какой-либо причине, вы можете использовать:
gdal_translate -co "TFW=YES" in.tif out.tif
Но это также скопирует данные изображения, поэтому вам придется удалить оригинал. И, конечно, он не будет генерировать файлы .prj любого типа. Но если предположить, что все ваши картинки находятся в одной проекции, вы можете просто вручную создать файл .prj и продублировать его для всех исходных изображений.
generate_tfw
не работает должным образом на повернутых растров, которые, к счастью, менее распространены. Это можно исправить с помощью умножения матрицы.
Listgeo утилита , которая поставляется с libgeotiff хорошая утилита командной строки , которая может извлечь файл TWF из GeoTIFF файлов.
Например, у меня есть каталог GeoTIFFs, и у меня есть libgeotiff, установленный как часть OSGeo4w. Вы можете запустить оболочку OSGeo4w и сделать это:
$ listgeo -tfw BN24_GeoTif_1-01.tif
World file written to 'BN24_GeoTif_1-01.tfw'.
Было бы хорошо, если бы эта же утилита могла также извлечь файл PRJ.
Не совсем - если вы знаете проекцию файлов, вы можете посмотреть содержимое файла prj по адресу http://spatialreference.org и затем использовать сценарий оболочки, чтобы скопировать шаблон в каждый файл .prj для каждого изображения.
Привязка к ним должна выполняться для каждого изображения отдельно, поскольку файл .tfw будет отличаться для каждого изображения (если только они не находятся в одном месте). http://warper.geothings.net/ может оказаться подходящим вариантом, если у вас нет доступа к настольной ГИС для этого.
Используя Geotools в Java, вы можете использовать этот код:
// 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);
Если вы хотите получить прогноз, вы можете использовать этот код:
// get the projection string from CRS
CoordinateReferenceSystem crs = reader.getCoordinateReferenceSystem();
String projectionString = crs.toWKT();
Просто напишите содержимое projectionString
вашего файла проекции.
Если кто-то хочет еще отредактировать TIFF в приложении ретуши фотографий и сохранить его геолокацию, экспорт растрового слоя с созданием tfw и включенным отображенным изображением является самым простым способом, IMO. Для немного разных опций есть путь через меню Raster / Conversion / Translate.