|
|
|
|

GDAL库学习笔记(三):GDAL创建数据集

1. 创建数据集 gdal不单是读取,还可以创建数据集。而且创建的过程也是很迅速快捷的。可以参考一下这里的快速指南(在Techniques for Creating Files,Using CreateCopy()和Using Create()这三段) gdal创建数据集有两种方式。一种用Create方法,一种用C...

作者:lilin来源:啄木鸟CPUG站|2007年02月08日

1. 创建数据集

gdal不单是读取,还可以创建数据集。而且创建的过程也是很迅速快捷的。可以参考一下这里的快速指南(在Techniques for Creating Files,Using CreateCopy()和Using Create()这三段)

gdal创建数据集有两种方式。一种用Create方法,一种用CreateCopy方法。所有支持创建新文件的驱动都支持CreateCopy方法,但只有少数支持Create方法。判断是否支持Create或者CreateCopy方法可以在驱动对象原数据当中检查DCAP_CREATE和DCAP_CREATECOPY的值。当然,要验证,还需要创建一个Driver。当然,要创建数据集更需要创建一个Driver!

Toggle line numbers
						
								   1 
								format
								=
								"GTiff"
						
						
								   2 
								driver
								=
								gdal
								.
								GetDriverByName
								(
								format
								)
						
						
								   3 
								metadata
								=
								driver
								.
								GetMetadata
								(
								)
						
						
								   4 
								if
								metadata
								.
								has_key
								(
								gdal
								.
								DCAP_CREATE
								)
								and
								metadata
								[
								gdal
								.
								DCAP_CREATE
								]
								==
								'YES'
								:
						
						
								   5 
								print
								'Driver %s supports Create() method.'
								%
								format
						
						
								   6 
								if
								metadata
								.
								has_key
								(
								gdal
								.
								DCAP_CREATECOPY
								)
								and
								metadata
								[
								gdal
								.
								DCAP_CREATECOPY
								]
								==
								'YES'
								:
						
						
								   7 
								print
								'Driver %s supports CreateCopy() method.'
								%
								format
								
								
						
				

上面是例子,先创建一个GeoTiff的数据集格式驱动driver,然后提取出驱动的原数据,看原数据中是否有DCAP_CREATE或者DCAP_CREATECOPY的属性,通过判断这两个属性的值,就可以指导这个驱动是否是支持用Create创建数据集还是支持用CreateCopy创建数据集。

原文中有一条注意:许多驱动是只读的并且不支持Create和CreateCopy 创建驱动时要创建的驱动名是什么,可以参考这里。第二列就是驱动名。第三列是是否支持创建数据集。如果不支持创建,那么也就无法调用Create或者CreateCopy了。 使用CreateCopy比较简单。就是把一个格式的图像直接转化为另一个格式的图像。

看看CreateCopy的原型:

Toggle line numbers
						
								   1 
								>>
								>
								help
								(
								driver
								.
								CreateCopy
								)
						
						
								   2 
								Help
								on
								method
								CreateCopy
								in
								module
								gdal
								:
						
						
								   3 
								CreateCopy
								(
								self
								,
								filename
								,
								source_ds
								,
								strict
								=
								1
								,
								options
								=
								[
								]
								,
								callback
								=
								None
								,
								callb
						
						
								   4 
								ack_data
								=
								None
								)
								method
								of
								gdal
								.
								Driver
								instance
						
						
								   5 
								>>
								>
								
								
						
				

第一个参数是源文件的名称,第二个是目标文件名称。第三以后的参数都可选。如果不输入也可以。程序按照默认的方式运行。第三个参数取值是0或者1(True或者False)。取值为非的时候说明即使不能精确匹配地由原数据转化为目标数据,程序也照样执行CreateCopy方法,不会产生致命错误。这种错误有可能是输出格式不支持输入数据格式象元的数据类型,或者是目标数据不支持写入空间参考等等。 文中举个例子:

Toggle line numbers
						
								   1 
								src_ds
								=
								gdal
								.
								Open
								(
								src_filename
								)
						
						
								   2 
								dst_ds
								=
								driver
								.
								CreateCopy
								(
								dst_filename
								,
								src_ds
								,
								0
								)
								
								
						
				

文中接着又举了个更复杂的例子。来说明第四个参数,第四个参数是指在格式转换中所要用到的一些特殊的参数。

Toggle line numbers
						
								   1 
								src_ds
								=
								gdal
								.
								Open
								(
								src_filename
								)
						
						
								   2 
								dst_ds
								=
								driver
								.
								CreateCopy
								(
								dst_filename
								,
								src_ds
								,
								0
								,
						
						
								   3 
								[
								'TILED=YES'
								,
								'COMPRESS=PACKBITS'
								]
								)
								
								
						
				

这个例子就是说明在转换Tiff的过程中用瓦片式存储代替条带式存储。用的压缩方法是PACKBITS。第四个参数根据各种格式都可能有不同的选项。所以无法统一列出,在这里可以看到GTiff的全部创建参数。只有在根据各种不同格式时参考各自的参数和写法。 第五个和第六个参数是登记一个挂钩函数。使得可以把转换过程反映出来(比如画个进度条什么的)。这两个函数就不多说了。

如果你不存在一个已有的文件来创建新的文件,就需要用到Create方法了。它可以把建立在内存中的虚拟数据集创建到实际文件。

Toggle line numbers
						
								   1 
								>>
								>
								help
								(
								driver
								.
								Create
								)
						
						
								   2 
								Help
								on
								method
								Create
								in
								module
								gdal
								:
						
						
								   3 
								Create
								(
								self
								,
								filename
								,
								xsize
								,
								ysize
								,
								bands
								=
								1
								,
								datatype
								=
								1
								,
								options
								=
								[
								]
								)
								method
								of
						
						
								   4 
								gdal
								.
								Driver
								instance
						
						
								   5 
								>>
								>
								
								
						
				

可以看出来,这个函数和CreateCopy很像,不过它多了几个参数,xsize,ysize是图像大小,bands是图像的波段(通道)数,datatype就是图像的象元数据类型了。 dst_ds = driver.Create( dst_filename, 512, 512, 1, gdal.GDT_Byte ) 这句就创建了一个图像。宽度是512*512,单波段,数据类型是Byte这里要注意,它少了源数据,因为这里用不到源数据。它创建了一个空的数据集。 要使它有东西,需要用其他步骤往里头塞东西。

Toggle line numbers
						
								   1 
								import
								Numeric
								,
								osr
						
						
								   2 
								dst_ds
								.
								SetGeoTransform
								(
								[
								444720
								,
								30
								,
								0
								,
								3751320
								,
								0
								,
								-
								30
								]
								)
						
						
								   3 
								srs
								=
								osr
								.
								SpatialReference
								(
								)
						
						
								   4 
								srs
								.
								SetUTM
								(
								11
								,
								1
								)
						
						
								   5 
								srs
								.
								SetWellKnownGeogCS
								(
								'NAD27'
								)
						
						
								   6 
								dst_ds
								.
								SetProjection
								(
								srs
								.
								ExportToWkt
								(
								)
								)
						
						
								   7 
								raster
								=
								Numeric
								.
								zeros
								(
								(
								512
								,
								512
								)
								)
						
						
								   8 
								dst_ds
								.
								GetRasterBand
								(
								1
								)
								.
								WriteArray
								(
								raster
								)
								
								
						
				

这里的例子往里面塞了个空间范围和坐标系(关于这些下面的文章再重点介绍),还有一个512*512的全部都是0的数组数据。当然这样做,你在打开数据的时候只能看到一片黑乎乎。如果你要使你的数据有点实质性参考价值的话,你要把一个丰富多彩的数组塞到图片当中。当然这最好的办法就是从已有的数据中读取了。当然,出了从原数据中老老实实读出数据后,还可以进行矩阵魔术。使其满足我们的需要。然后再写到磁盘上。

不是每个数据都支持Create,比如JPG,PNG。所以,要写入内存中的数据,官方建议用Create先建立一个过渡用的tiff,再用CreateCopy来创建JPG或者PNG。(有点麻烦哦)

上一篇:GDAL库学习笔记(二):GDAL库的一些细节

下一篇:GDAL库学习笔记(四):关于空间参考