为GeoTIFF文件的文件夹创建TFW和PRJ文件?[关闭]


16

我有一个文件夹,其中包含大量GeoTIFF格式的文件。

我需要为每个图像生成PRJ和TFW文件。

有什么办法可以做到这一点?


使用什么软件?有什么可供您选择?
jbchurchill

Answers:


16

生成TFW的最巧妙的方法是使用GDAL用Python或Java编写脚本,这将是少数几行代码。

GDAL不支持创建旧式(ArcGis 9之前的).prj文件,只能读取(请参阅此处)。支持创建新型(基于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以生成WKT样式的prj文件,也可以是其他任何仅生成.TFW的文件。

如果由于某种原因无法使用Python脚本,则可以使用:

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

但这也会复制图像数据,因此您必须删除原始数据。当然,它不会生成任何一种.prj文件。但是假设所有的tiff都在同一投影中,您可以手工制作.prj文件并为所有源图像复制它。


2
请注意,generate_tfw这在旋转栅格上无法正常使用,幸运的是这种栅格不太常见。这可以通过一点矩阵乘法来解决。
Mike T

嘿,我正在尝试使用该工具,但是我不知道该怎么做,太夸张了。能否请您详细说明如何使用?我只需要在文件夹和子文件夹中为TIF生成tfw。如果它不能在子文件夹上运行,那就可以了。我可以运行几次。谢谢
拉斐尔

在QGIS打开的菜单“栅格”中,选择“转换”,然后选择“翻译-转换格式”。出现窗口-在上一行中选择您的Geotiff,然后在Advanced parameters(高级参数)下,按+号添加命令。在名称下输入单词tfw,在值下输入是。指定输出目的地,文件名和名称...您的geotiff文件将转换为纯tiff和tfw部分。现在,您可以在您选择的图像编辑器中编辑tiff,并对其进行地理定位,只要您不更改x或y轴上的像素数即可
user29347

19

libgeotiff随附的listgeo实用程序是一个不错的命令行实用程序,可以从GeoTIFF文件中提取TWF文件。

例如,我有一个GeoTIFF目录,并且我安装了libgeotiff作为OSGeo4w的一部分。您可以运行OSGeo4w Shell,并执行以下操作:

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

如果同一个实用程序也可以提取PRJ文件,那就太好了。


“如果同一个实用程序也可以提取PRJ文件,那就太好了。” ->但事实并非如此。
astrojuanlu

0

并非如此-如果您知道文件的投影,则可以在http://spatialreference.org上查找prj文件的内容,然后使用Shell脚本将模板复制到每个图像的每个.prj文件。

对它们进行地理配准需要针对每个图像进行,因为每个图像的.tfw文件将有所不同(除非它们都位于同一位置)。如果您没有访问桌面GIS的权限,则可以使用http://warper.geothings.net/


2
除了GeoTIFF文件通常在元数据中嵌入了投影文件和世界文件..因此所有这些信息都是已知的。
Mike T

1
在这种情况下,您为什么要将其写成单独的文件?
伊恩·特顿

1
推测Joe正在使用的软件无法理解带有嵌入式元数据的GeoTIFF。
MerseyViking

是的,需要将相同的问题元数据提取为.tfw,以便gis Web应用程序“知道”每个图块的位置-使用自己的脚本提取它(当时是
excel-

0

在Java中使用Geotools可以使用以下代码:

// 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投影文件即可。


0

如果要在照片修饰应用程序中进一步编辑tiff并保留其地理位置,则使用tfw创建和启用渲染图像功能导出栅格图层是最简单的方法,即IMO。对于稍微不同的选项,可以通过菜单“栅格” /“转换” /“转换”来实现。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.