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

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

GDAL库学习笔记(七): GDAL和PIL的互操作

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

这里注意,在pil的下,截取区域矩形的定义和gdal不同,gdal是顶点X、顶点Y、宽、高;pil是顶点X、顶点Y、终点X,终点Y

诶,似乎不一样啊!

确实不一样,不过这就是gdal和pil的区别了。转换一下吧。

Toggle line numbers
   1 >>> data = ds.ReadAsArray(130,90,10,10)
   2 >>> datas = [i for i in data]
   3 >>> from Numeric import *
   4 >>> datas = [reshape(i,(-1,1)) for i in data]
   5 >>> datas = concatenate(datas,1)
   6 >>>

激动人心的时刻到了!当当当当~~~~~


>>> datas.tostring()
'\xd4\xce\xd3\xd8\xd2\xd7\xd4\xcf\xcd\xcf\xca\xc8\xcc\xc7\xc5\xce\xcb\xcd\xce\xc
e\xd3\xc3\xc5\xcd\x7f\x83\x8d\xbf\xc1\xc9\xd1\xcb\xd0\xd5\xcf\xd4\xca\xc7\xc7\xd
4\xd1\xd1\xd3\xd0\xd0\xd3\xd1\xd5\xd1\xd1\xd6\xc0\xc2\xca|\x80\x8a\xc5\xc7\xcf\x
cd\xc7\xcc\xcd\xc7\xcc\xd1\xcf\xd1\xd1\xcf\xd1\xca\xc8\xca\xd0\xce\xd2\xce\xce\x
d3\xbf\xc1\xc9\x88\x8c\x96\xc3\xc5\xcd\xd0\xca\xcf\xd0\xca\xcf\xce\xcc\xce\xcb\x
c8\xca\xca\xc8\xca\xca\xc8\xcc\xcc\xcc\xd1\xb8\xba\xc2w{\x85\xb9\xbb\xc3\xcc\xc8
\xcd\xcf\xc9\xce\xca\xc7\xc9\xca\xc2\xc8\xd4\xd0\xd6\xd4\xd2\xd6\xcb\xc9\xce\xb5
\xb5\xbe\x87\x88\x93\xbe\xc0\xc6\xd3\xcf\xd4\xd4\xce\xd3\xd0\xcd\xcf\xcd\xc5\xcb
\xce\xca\xd0\xbf\xbd\xc2\xcf\xcc\xd4\xc6\xc6\xcd\x80\x82\x8a\xc1\xc3\xc9\xd3\xd0
\xd2\xd3\xcd\xd0\xd0\xcd\xcf\xcb\xc3\xc9\xcc\xc8\xce\xcc\xc9\xd3\xd0\xcd\xd5\xc0
\xc0\xc7\x86\x88\x8c\xbe\xc0\xc6\xd0\xca\xcb\xce\xc8\xc9\xd1\xcb\xd0\xce\xc8\xcd
\xd5\xcf\xd4\xce\xca\xcf\xd0\xcc\xd2\xc4\xc0\xc8\x88\x84\x8c\xc5\xc1\xc7\xd0\xca
\xcb\xce\xc8\xc9\xc9\xc5\xca\xc9\xc5\xca\xd4\xd0\xd5\xd1\xcd\xd2\xd0\xcc\xd1\xc3
\xbf\xc5\x85\x81\x89\xd0\xcc\xd1\xce\xc8\xc9\xd2\xcc\xcd\xc9\xc7\xcb\xcc\xca\xce
\xcc\xca\xce\xd2\xcf\xd1\xd0\xcd\xcf\xcd\xc9\xce\xa8\xa4\xaa\xcb\xc8\xca'
>>>


相同了吧!

这里就表现了两个库的设计哲学不同了。gdal的核心是band,读取的数据是默认以band组织的,pil的核心是dataset,读取的数据默认是统一组织的。换句话说,gdal看{{RRR……}{GGG……}{BBB……}}比较顺眼,pil看{RGB,RGB,RGB……}比较顺眼。

同时把数据降低到Band水平(其实不能说降低,Band的水平不比DataSet低),就可以看出来在Band水平,两个库是一样一样一样的啊!


>>> r,g,b = region.split()
>>> r.tostring()
'\xd4\xd8\xd4\xcf\xcc\xce\xce\xc3\x7f\xbf\xd1\xd5\xca\xd4\xd3\xd3\xd1\xc0|\xc5\x
cd\xcd\xd1\xd1\xca\xd0\xce\xbf\x88\xc3\xd0\xd0\xce\xcb\xca\xca\xcc\xb8w\xb9\xcc\
xcf\xca\xca\xd4\xd4\xcb\xb5\x87\xbe\xd3\xd4\xd0\xcd\xce\xbf\xcf\xc6\x80\xc1\xd3\
xd3\xd0\xcb\xcc\xcc\xd0\xc0\x86\xbe\xd0\xce\xd1\xce\xd5\xce\xd0\xc4\x88\xc5\xd0\
xce\xc9\xc9\xd4\xd1\xd0\xc3\x85\xd0\xce\xd2\xc9\xcc\xcc\xd2\xd0\xcd\xa8\xcb'
>>> band = ds.GetRasterBand(1)
>>> band.ReadRaster(130,90,10,10)
'\xd4\xd8\xd4\xcf\xcc\xce\xce\xc3\x7f\xbf\xd1\xd5\xca\xd4\xd3\xd3\xd1\xc0|\xc5\x
cd\xcd\xd1\xd1\xca\xd0\xce\xbf\x88\xc3\xd0\xd0\xce\xcb\xca\xca\xcc\xb8w\xb9\xcc\
xcf\xca\xca\xd4\xd4\xcb\xb5\x87\xbe\xd3\xd4\xd0\xcd\xce\xbf\xcf\xc6\x80\xc1\xd3\
xd3\xd0\xcb\xcc\xcc\xd0\xc0\x86\xbe\xd0\xce\xd1\xce\xd5\xce\xd0\xc4\x88\xc5\xd0\
xce\xc9\xc9\xd4\xd1\xd0\xc3\x85\xd0\xce\xd2\xc9\xcc\xcc\xd2\xd0\xcd\xa8\xcb'
>>>


再比较两个库的写入,写入数据gdal用的是WriteRaster。同样DataSet一个,Band一个。另外Band买一送一,还有个WriteArray可用

Toggle line numbers
   1 >>> help(ds.WriteRaster)
   2 Help on method WriteRaster in module gdal:
   3 
   4 WriteRaster(self, xoff, yoff, xsize, ysize, buf_string, buf_xsize=None, buf_ysiz
   5 e=None, buf_type=None, band_list=None) method of gdal.Dataset instance
   6 
   7 >>> help(band.WriteRaster)
   8 Help on method WriteRaster in module gdal:
   9 
  10 WriteRaster(self, xoff, yoff, xsize, ysize, buf_string, buf_xsize=None, buf_ysiz
  11 e=None, buf_type=None) method of gdal.Band instance
  12 
  13 >>> help(band.WriteArray)
  14 Help on method WriteArray in module gdal:
  15 
  16 WriteArray(self, array, xoff=0, yoff=0) method of gdal.Band instance
  17 
  18 >>>

这个就不用做试验了吧。就是把一个二进制字符串放到buf_string位置,那个xoff,yoff,xsize,ysize就是要把数据贴到整张图的什么位置,buf_xsize,buf_ysize是那个二进制字符串表示的区域大小(建议和xsize,ysize一致,不然gdal会自动缩放,而且自动缩放的方法是我们不能控制的,只会用最临近法)。buf_type说明的是输入的二进制字符串的数据类型,如果和原底图的数据类型不一样,会自动扩充和截断数据长度,band_list就是要输入的波段的列表。

上一页  [1] [2] [3] 下一页

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