Создание файлов TFW и PRJ для папки файлов GeoTIFF? [закрыто]

16

У меня есть папка, которая содержит большое количество файлов в формате GeoTIFF.

Мне нужно создать файлы PRJ и TFW для каждого из этих изображений.

Есть ли способ сделать это?

Джо
источник
с помощью какого программного обеспечения? Что доступно для вас?
Jbchurchill

Ответы:

16

Самый лучший способ генерировать 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 и продублировать его для всех исходных изображений.

MerseyViking
источник
2
Обратите внимание, что generate_tfwне работает должным образом на повернутых растров, которые, к счастью, менее распространены. Это можно исправить с помощью умножения матрицы.
Майк Т
Эй, чувак, я пытаюсь использовать инструмент, но я не знаю, как это сделать, точно. Можете ли вы сделать более подробное объяснение, как его использовать? Мне просто нужно сгенерировать TFW для TIF, в папках и подпапках. Если он не может работать в подпапках, это нормально. Я могу запустить его несколько раз. Спасибо
Raphael
В QGIS откройте меню «Растр», выберите «Преобразование», затем выберите «Перевести - Преобразовать формат». Появится окно - в верхней строке выберите свой геотиф и в разделе «Дополнительные параметры» нажмите +, чтобы добавить команду. В поле Имя введите слово tfw, в поле Значение введите yes. Укажите место назначения вывода, имя файла и вуаля ... ваш геотиф-файл преобразуется в обычный формат tiff и tfw. Теперь вы можете редактировать TIFF в редакторе изображений по вашему выбору и иметь геолокацию до тех пор, пока вы не измените количество пикселей по оси X или Y
user29347
19

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». -> Но это не так.
astrojuanlu
0

Не совсем - если вы знаете проекцию файлов, вы можете посмотреть содержимое файла prj по адресу http://spatialreference.org и затем использовать сценарий оболочки, чтобы скопировать шаблон в каждый файл .prj для каждого изображения.

Привязка к ним должна выполняться для каждого изображения отдельно, поскольку файл .tfw будет отличаться для каждого изображения (если только они не находятся в одном месте). http://warper.geothings.net/ может оказаться подходящим вариантом, если у вас нет доступа к настольной ГИС для этого.

Ян Тертон
источник
2
За исключением того, что файлы GeoTIFF часто содержат как метаданные, так и файлы проекции и мира, поэтому вся эта информация известна.
Майк Т
1
в каком случае зачем записывать его в виде отдельных файлов?
Ян Тертон
1
Предположительно, программное обеспечение, которое использует Джо, не понимает GeoTIFF со встроенными метаданными.
MerseyViking
да, нужно было извлечь метаданные той же проблемы, чтобы быть .tfw, чтобы веб-приложение ГИС «знало» расположение каждой плитки - используйте собственный скрипт для ее извлечения (excel - макрос в то время.)
Mapperz
0

Используя 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вашего файла проекции.

Lars
источник
0

Если кто-то хочет еще отредактировать TIFF в приложении ретуши фотографий и сохранить его геолокацию, экспорт растрового слоя с созданием tfw и включенным отображенным изображением является самым простым способом, IMO. Для немного разных опций есть путь через меню Raster / Conversion / Translate.

введите описание изображения здесь

user29347
источник