Answers:
生成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文件并为所有源图像复制它。
generate_tfw
这在旋转栅格上无法正常使用,幸运的是这种栅格不太常见。这可以通过一点矩阵乘法来解决。
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文件,那就太好了。
并非如此-如果您知道文件的投影,则可以在http://spatialreference.org上查找prj文件的内容,然后使用Shell脚本将模板复制到每个图像的每个.prj文件。
对它们进行地理配准需要针对每个图像进行,因为每个图像的.tfw文件将有所不同(除非它们都位于同一位置)。如果您没有访问桌面GIS的权限,则可以使用http://warper.geothings.net/。
在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
投影文件即可。