http://www.gissky.net- GIS空间站

我要投稿 投稿指南 RSS订阅 网站资讯通告:
搜索: 您现在的位置: GIS空间站 >> 技术专栏 >> 技术前沿 >> 正文

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

作者:lilin    文章来源:啄木鸟CPUG站    点击数:    更新时间:2007-2-8
摘要:

1.1. 注意

在转换GTiff的过程中,需要注意一点。利用默认的参数在生成gtiff的过程中有可能出问题。比如用

Toggle line numbers
   1 dataset = gdal.Open("e:/gisdata/gtif/sd.tif")
   2 width = dataset.RasterXSize
   3 height = dataset.RasterYSize
   4 data = dataset.ReadAsArray(0,0,width,height)
   5 driver = gdal.GetDriverByName("GTiff")
   6 driver.CreateCopy("e:/sd.tif",dataset,0)

代码转出的GTiff文件虽然在ESRI的系列软件和其他一些看图程序中可以正常显示,但是在windows图像浏览器中不能正常显示,更重要的是在java的jai中不能正常显示。究其原因,是GDAL在导出的时候把284号域(PlanarConfiguration域)设成了2,也就是RRRR……,GGGG……,BBBB……模式显示。但是在一些软件中只认值1,也就是RGBRGBRGBRGB……,所以上面的代码需要修改成

Toggle line numbers
   1 dataset = gdal.Open("e:/gisdata/gtif/sd.tif")
   2 width = dataset.RasterXSize
   3 height = dataset.RasterYSize
   4 data = dataset.ReadAsArray(0,0,width,height)
   5 driver = gdal.GetDriverByName("GTiff")
   6 driver.CreateCopy("e:/sd.tif",dataset,0,["INTERLEAVE=PIXEL"])

默认的INTERLEAVE是BAND(tags[284]=2),我们把它改成PIXEL(tags[284]=1)。这样就可以正常显示了。 更多的创建参数看这里

1.2. 小例子

下面介绍一个建立3波段GTiff的小例子。当然凭空想个数据出来是很难的一件事情,除非我可以飞到几万米高空瞻仰地球母亲:),于是我只好从另一个GTiff中读数据出来然后保存成另一个GTiff文件,做个意思吧。

import gdal
import Numeric
dataset = gdal.Open("e:/gisdata/gtif/sd.tif")
width = dataset.RasterXSize
height = dataset.RasterYSize
datas = dataset.ReadAsArray(0,0,width,height)
driver = gdal.GetDriverByName("GTiff")
tods = driver.Create("e:/gisdata/sd2.tif",width,height,3,options=["INTERLEAVE=PIXEL"])
tods.WriteRaster(0,0,width,height,datas.tostring(),width,height,
                band_list=[1,2,3])


  • 这是一个很简单的另存遥感图像的方法(不包括空间信息)。这里尤其注意Create函数中的options= [ " INTERLEAVE=PIXEL " ] 参数。没有这个参数,波段像素组织会错。保存出的图像只有横向的1/3。而且彩色完全不对 。

当然datas可以另外组织,比如这样也可以

datas = dataset.ReadAsArray(0,0,width,height)
datas = Numeric.concatenate(datas)


  • 当然从波段里读取数据再拼接成完整的图像更是可以的。

datas = []
for i in range(3):
    band = dataset.GetRasterBand(i+1)
    data = band.ReadAsArray(0,0,width,height)
    datas.append(Numeric.reshape(data,(1,-1)))
datas = Numeric.concatenate(datas)


  • 注意:从波段中读取的数组要拼接组织成RRR...GGG...BBB...这种形式才可以正确导出。不然整个图像看起来就像冥王星上的地形图。(这里有一点很奇怪,既然是PIXEL组织的,居然是RRR...GGG...BBB...形式而不是通常认为的RGB,RGB,RGB...形式)。如果你需要各个波段输入的话,可以循环到各个波段中,然后用Band对象的WriteRaster来操作,而非在Dataset中调用WriteRaster。

下面再看看空间参考如何导入。比如我们导入一个NAD27的空间参考,我们可以这样写

import osr
tods.SetGeoTransform( [ 444720, 30, 0, 3751320, 0, -30 ] )
srs = osr.SpatialReference()
srs.SetUTM( 11, 1 )
srs.SetWellKnownGeogCS( 'NAD27' )
tods.SetProjection( srs.ExportToWkt() )


  • 呵呵,于是这个Tiff就变成了GTiff。空间参考系统是NAD27,起点(444720,3751320),像素大小30的TIFF了。当然直接这样写肯定是不对的。空间转换参数要进行配准运算,然后确定。我们这里就只是写个意思,说明可以这样写入文件罢了。我这里用的空间参考是美国常用的。至于中国的空间参考,你要西安还是北京,就看你高兴了。当然前提是先配准。

2. 反馈

如果您发现我写的东西中有问题,或者您对我写的东西有意见,请一定要发邮件跟我讲,Email( linux_23@163.com )

上一页  [1] [2] 

Tags:GDAL,开源  
责任编辑:gissky
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 中国地图