给定最小的ESRI ASCII文件,在libtiff或libgeotiff中设置哪些对应字段?

时间:2018-12-03 06:43:25

标签: mesh gdal geotiff libtiff libtiff.net

我有一个格式为ESRI的ASCII文件:

ncols         5 
nrows         4 
xllcorner     0 
yllcorner     0 
cellsize      10 
NODATA_value  -9999 
25.4 26.1 27 28.6 27.7
25 26 26.4 27.9 27.4
25.1 25.8 26.8 28.6 27.6
27.5 28 27.7 30.6 28.3

我需要使用libtiff.net(或其等效的C ++,libtiff或libgeotiff或GDAL或任何其他C#或C ++库)将其转换为geotiff文件。

>

但是我根本不知道要设置什么字段,有很多字段,例如TIFFTAG_IMAGEWIDTHTIFFTAG_SAMPLESPERPIXELTIFFTAG_BITSPERSAMPLE,但我不知道它们是否是否相关。

鉴于上述的ESRI ASCII文件,如何使用libtiff.net或libtiff库创建geotiff文件?

我为什么要这样做?

在我的应用程序中,我有一个网格,并且必须将网格转换为栅格文件。我想直接从网格采样中创建这样的Geotiff栅格文件,而不先创建中间ASCII文件,因为与最终Geotiff输出文件相比,中间文件的大小很大。

我能想到的唯一方法是在获取网格上的网格点时使用libtiff.net直接操作geotiff文件。

如何执行此操作,还是有更好的方法?

2 个答案:

答案 0 :(得分:2)

即使您计划不在应用程序中使用GDAL(稍后会对此进行更多介绍),也不会阻止您从ESRI ASCII GRID(export)生成Geotiff,并检查生成的TIFF标签文件(这些是从给定的网格生成Geotiff的必要标签)。

AsTiffTagViewer给出以下输出(similar to TiffTags utility output):

gdal_translate -of "GTiff" in.asc out.tif

您会看到有11个标准Tiff标签和3个非标准标签(但我们知道数据类型,更重要的是最后3个标签的尺寸TagCode (Count DataType): Value // my comments ImageWidth (1 Short): 5 // ncols ImageLength (1 Short): 4 // nrows BitsPerSample (1 Short): 32 Compression (1 Short): Uncompressed Photometric (1 Short): MinIsBlack StripOffsets (1 Long): 260 SamplesPerPixel (1 Short): 1 RowsPerStrip (1 Short): 4 //nrows StripByteCounts (1 Long): 80 PlanarConfig (1 Short): Contig SampleFormat (1 Short): 3 33550 (3 Double): 33922 (6 Double): 42113 (6 ASCII): -9999 // NODATA_value 3,{{ 1}})。让我们确认一下,我们有2个GeoTiff标签和一个非标准GDAL专用标签。

Libgeotiff C库随6实用程序一起分发,用于转储GeoTIFF元数据。输出:

6

根据listgeo的尺寸,我们可以识别以下2个标签。另外,由于网格是规则的(X和Y间距相等,并且没有偏斜的网格线),我们可以建立以下公式:

Geotiff_Information: Version: 1 Key_Revision: 1.0 Tagged_Information: ModelTiepointTag (2,3): 0 0 0 0 40 0 ModelPixelScaleTag (1,3): 10 10 0 End_Of_Tags. Keyed_Information: End_Of_Keys. End_Of_Geotiff. Corner Coordinates: Upper Left ( 0.000, 40.000) Lower Left ( 0.000, 0.000) Upper Right ( 50.000, 40.000) Lower Right ( 50.000, 0.000) Center ( 25.000, 20.000) 标签:

Tagged_Information

33550标签:

ModelPixelScaleTag = [ cellsize , cellsize , 0 ]

剩下最后一个标签33922。 geotiff格式没有用于nodata值的标准标签。 GDAL将频段nodata值存储在非标准TIFFTAG_GDAL_NODATA ASCII标签(代码42113)中。

最后,例如,我们可以使用Libgeotiff C库编写一个函数,该函数将网格的标题(ModelTiepointTag = [ 0 , 0 , 0 , UpperLeftCorner_X , UpperLeftCorner_Y , 0] where UpperLeftCorner_X = xllcorner UpperLeftCorner_Y = yllcorner + cellsize * nrows )与Tiff标签相关联:

42113

注意:当您说不能使用GDAL时,有一种内存栅格格式可以在添加网格样本时用作栅格的临时占位符:

https://www.gdal.org/frmt_mem.html

答案 1 :(得分:0)

实际上,可以使用GDAL库(或其等效的.Net GDAL.Net)轻松完成此任务。 Python中甚至还有an example here

if __name__ == '__main__':
# Import libs
import numpy, os
from osgeo import osr, gdal

# Set file vars
output_file = "out.tif"

# Create gtif
driver = gdal.GetDriverByName("GTiff")
dst_ds = driver.Create(output_file, 174, 115, 1, gdal.GDT_Byte )
raster = numpy.zeros( (174, 115) )

# top left x, w-e pixel resolution, rotation, top left y, rotation, n-s pixel resolution
dst_ds.SetGeoTransform( [ 14.97, 0.11, 0, -34.54, 0, 0.11 ] )

# set the reference info 
srs = osr.SpatialReference()
srs.SetWellKnownGeogCS("WGS84")
dst_ds.SetProjection( srs.ExportToWkt() )

# write the band
dst_ds.GetRasterBand(1).WriteArray(raster)

还有Python脚本:

--id.attrs 'role=writer:ecert,email=user1@gmail.com'

将代码转换为.Net应该很简单。