Wechat: yu389741| Email: gisdqy@163.com

Shop:https://www.giserdqy.com/shop

Python – GDAL 学习(二)


最近做毕设,方向是数字水印技术在遥感图像方面的应用,遇到了问题 对于已经将tif格式的遥感图像进行各个波段分离,之后的问题是不知道如何保存、保存成何种格式?
在网上看了很多篇博客,也对方法进行了总结,由于Python是自学,只是在网上看视频进行学习的,没有完整的知识体系和框架(可能是我强迫症的原因,总想对一种语言进行详细了解才算学会,到最后才发现,自己也就只是学会了考研需要的数据结构那本书)。
网上的大神们的帖子,我看第一步都是创建一个数据集,来测试是否支持CreateCopy方法或者Create方法,我使用的是Create方法,下面是大神的测试代码,我不知道为什么运行不了,所以我使用的是最笨的方法,把两种方法的代码都自己运行了一遍。
format = “GTiff”
driver =gdal.GetDriverByName( format )
metadata =driver.GetMetadata()
ifmetadata.has_key(gdal.DCAP_CREATE) \
 metadata[gdal.DCAP_CREATE] == ‘YES’:
  print ‘Driver %s supports Create() method.’ % format
ifmetadata.has_key(gdal.DCAP_CREATECOPY) \
  and metadata[gdal.DCAP_CREATECOPY] ==’YES’:
 print ‘Driver %s supports CreateCopy() method.’ % format
不知道为什么 总在print行报错,我现在自己调试不好,本着得过且过赶进度的原则(咳咳,下周可能就要中期答辩了,但是我的论文还没有写,唉,都是自己挖的坑啊

CreateCopy的原型
Toggle line numbers Toggle line numbers

>>>help(driver.CreateCopy)
 Help on method CreateCopy inmodule gdal:
 CreateCopy(self, filename,source_ds, strict=1, options=[], callback=None, callb
ack_data=None) method ofgdal.Driver instance
   

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

Toggle line numbers Toggle line numbers

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

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

Toggle line numbers Toggle line numbers

   1 src_ds = gdal.Open(src_filename )
   2 dst_ds = driver.CreateCopy(dst_filename, src_ds, 0,
                             [ ‘TILED=YES’, ‘COMPRESS=PACKBITS’ ] )

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

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

Toggle line numbers Toggle line numbers

   1>>>help(driver.Create)
   2 Help on method Create inmodule 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 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) )
   8dst_ds.GetRasterBand(1).WriteArray( raster )

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

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

大神原文:http://blog.sina.com.cn/s/blog_6e51df7f0100ui7y.html

我只进行到创建了6个空的tif文件,在想办法把已经分离的各个通道的数据复制到这六个文件上,然后对这六个文件分别进行水印处理,然后再将六个图层合并成一个图层

转载自:https://blog.csdn.net/qq705167895/article/details/80023566