当前位置:文档之家› GDAL库学习笔记

GDAL库学习笔记

GDAL库学习笔记
GDAL库学习笔记

GDAL库学习笔记(一): GDAL库介绍

作者:lilin文章来源:https://www.doczj.com/doc/709078743.html,/点击数:

24511 更新时间:2007-2-8

可能你不玩GIS,不懂这个库到底有什么用,或者和python有什么关系。但是你要玩GIS,RS,你就应当知道这个库的价值。就算你不玩GIS,我想这个库对你也应该有致命的吸引力。为什么?看下面的介绍吧!

先看看这段GDAL主页上的英文介绍吧!is a translator library for raster geospatial data formats that is released under an X/MIT style Open Source license by the Open Source Geospatial Foundation. As a library, it presents a single abstract data model to the calling application for all supported formats. It also comes with a variety of useful commandline utilities for data translation and processing. 简单地说,GDAL是一个操作各种栅格地理数据格式的库。包括读取、写入、转换、处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持)。它使用了一个单一的抽象数据模型就支持了大多数的栅格数据(GIS对栅格,矢量,3D数据模型的抽象能力实在令人叹服)。当然除了栅格操作,这个库还同时包括了操作矢量数据的另一个有名的库ogr(ogr这个库另外介绍),这样这个库就同时具备了操作栅格和矢量数据的能力,买一送一,这么合算的买卖为什么不做。最最最重要的是这个库是跨平台的,开源的!如今这个库对各种数据格式的支持强大到令人啧啧的地步了。如果你对他的强大有什么怀疑的话,看看这里一大串的GDAL所支持格式清单,吓到了吧!再看看它的主页最后那些使用了它作为底层数据处理的软件列表吧!其中你可以不知道GRASS,你也可以不知道Quantum GIS (QGIS),但是你总该知道Google Earth吧!不知道?赶快下一个去玩玩--会当临绝顶,一览众山小!

有人说我又不玩GIS。不错,但是,你即使不玩GIS,这个库也是满有用的。首先,哪个库支持这么多栅格(图片)格式,哪个库在

C/C++/python/ruby/VB/java/C#(这个暂时不完全支持)下都能用,而且都一样用?退一步讲,3S软件又不一定要用在3S下(很多医学影像就是用PCI软件来处理的)。再退一步,你的生活即使和3S一点关系都没有,栅格数据又不单单只有GIS下才用到。你大可用这个库来读取jpg,gif,tif,xpm等格式。而

且对各种格式支持得不是一般的好,很大一部分非标准格式照样支持得非常好。我曾经在java下玩过jai,以及一系列jai的扩展库,一些图像格式在很多图片浏览器中都可以正确读取(有的甚至不是非标准格式),用jai死活就读不出来!

这个库的python版和其他的python库结合的很好。最直接、明显的支持是使用Numeric库来进行数据读取和操作。各种矩阵魔术可以发挥得淋漓尽致(图像其实就是矩阵)。而且按我的观点,python对矩阵的操作比其他的语言有明显的优势。写出来的东西比其他语言写出来的短小的多,而且好看得多。并且python的弱类型在处理栅格数据格式类型的时候代码量比强类型的语言少了数倍(不用 double,byte,short等等分开处理,这简直就是先天上的优势)。所以我就喜欢用python做图像的处理。所以就连GIS界的微软ESRI 也直接在ARCGIS9中用python来作栅格数据的导入导出。一句话,真是太方便啦

2. 安装

2.1. windows下的安装

官方安装文档在这里。下面是我自己的实践步骤:

先去https://www.doczj.com/doc/709078743.html,/dl/下一个版本,解压。打开控制台,输入:“D:\Program Files\Microsoft Visual Studio .NET

2003\Vc7\bin\vcvars32.bat" 注册vc的编译环境。

打开gdal文件夹下的nmake.opt修改GDAL_HOME = "C:\warmerda\bld"把路径改到需要把gdal安装的地方。不改也可以。这里需要添加python支持,所以修改PY_INST_DIR = $(GDAL_HOME)\pymod把路径改成python下的

Lib\site-packages文件夹下。PYDIR = "C:\Software\Python24" 改成python 的安装路径。下面的参数爱改什么就把前面的#删除(要看您有没有那些库的源码),注意一下路径就可以了。我是都没改。后面就依次运行

Toggle line numbers Toggle line numbers

1 nmake /f makefile.vc

2 nmake /f makefile.vc install

3 nmake /f makefile.vc devinstall

最后最后,还要去GDAL_HOME目录下的bin文件夹下把gdal13.dll (也有可能是gdal12.dll)copy到PY_INST_DIR路径下

到此处就完成安装gdal(python)的工作。

最后需要注意一下,gdal在.net2005下只能顺利编译1.2,1.3以上版本不能顺利编译,有一个地方指针转换出错。可能是2005的编译器比以往的严厉一点吧。

另外,安装了QGIS,对编译也有一些影响,主要是proj库的冲突,导致一个找不到"d:/program.obj"文件的错误,如果你有静态编译过proj,那么你可以打开nmake.opt修改有关proj的设置,如果搞不定,就卸载QGIS,然后编译,编译后再安装QGIS.呵呵,还好QGIS的体积没有ArcGIS那么可怕.

2.2. linux下的安装

linux下的安装就更简单了。直接

Toggle line numbers Toggle line numbers

1 ./configure

2 make

3 su

4 make install

5 ldconfig

就ok(默认就已经支持python)。当然在第一步的时候需要看看是否依赖的库都安装了。如果缺少,就去安装一个。如果对configure的条件不理解,就

用./configure --help看看具体情况。

2.3. 安装其他驱动

这里讲一个安装hdf4的驱动的例子(默认情况下gdal是不安装hdf4的),其他驱动应该和这个也差不了多少吧,可以作为其他的参考。完整步骤如下:

在windows下的安装:

从ftp://https://www.doczj.com/doc/709078743.html,/HDF/HDF/HDF%5FCurrent/bin/windows/下载

42r1-win.ZIP,解压。

编辑gdal根目录下的nmake.opt,找到“# Uncomment the following and update to enable NCSA HDF Release 4 support.”这一行

把下面两行前面的#去掉,然后改成:

HDF4_DIR = D:\warmerda\42r1-win\release

#HDF4_LIB = /LIBPATH:$(HDF4_DIR)\lib hd421m.lib

HDF4_LIB = $(HDF4_DIR)\dll\hd421m.lib $(HDF4_DIR)\dll\hm421m.lib \ $(HDF4_DIR)\lib\hd421.lib $(HDF4_DIR)\lib\hm421.lib

用HDF4_LIB=/LIBPATH:这种形式似乎可以建立gdal的库,但是往下编译会出错。而且要把$(HDF4_DIR)\dll和$(HDF4_DIR)\lib拷贝到同一个目录下,不然会提示找不到库

你也可以试一试在D:\Program Files\Microsoft Visual Studio .NET

2003\Common7\Tools\vsvars32.bat文件中添加HDF4_LIB路径到“@set LIB=”这行的末尾(不要忘记;的分割符)。

然后找一下"INC="这行,把 -I$(HDF4_DIR)\include加到下一行的末尾(应该也可以在vsvars32.bat中添加路径,不过要重启命令行)。

然后编译吧!祝你好运。

注意:上面的HDF4_DIR 是我本机的路径,你要根据你自己的路径进行设置(想起我的一个老师说过的话:“抄人家的作业可以,不要连名字也一起抄走啊” ),下面的$(HDF4_DIR)可以不用改,那个是变量,会自动替代HDF4_DIR 路径。

编译成功后,要HDF4能运行,还需要两个库,一个是zlib,一个是szip,可以到下面两个链接去下载一个

ftp://https://www.doczj.com/doc/709078743.html,/lib-external/zlib/1.2/bin

ftp://https://www.doczj.com/doc/709078743.html,/lib-external/szip/2.0/bin/windows

把这两个库下载后解压,然后设置PATH系统变量,使得它们在默认状态下也可以被动态链接成功。

在Linux下比在Windows下简单:

只要用./configure --help察看一下打开HDF4的编译开关(包括库路径,头文件路径等,看清楚),然后在./configure 后面加上那个开关以及hdf4的安装路径后就可以了。在configure后gdal会提示是否支持HDF4。编译后也要把zlib和szip的动态链接库设置好。

到此你已经可以用C/C++来操作gdal读写hdf4的格式了!

最后,为了让Python能够支持hdf的读写,别忘了把重新生成安装后的pymod 目录下的内容,还有gdal13,还有那两个hdf的库,还有zlib,szip的库拷贝到Python的Lib\site-packages目录下。

2.4. 下载

如果你实在玩不转,可以在这里下载已经编译好的gdal1.3.2程序库以及其依赖的其他库,其中包括hdf4,hdf5支持,以及proj,geos插件。注意,这里的geos是静态链接的,注意版权(geos是LGPL的license)。hdf4和hdf5用的是release版本。这里是我的nmake配置文件,你可以对照你的实际情况参考一下。

3. 快速开始

其实在主站的教程里已经有python的示例了。但是我们还是按照自己的思路来开始吧。

第一步就是打开一个数据集。对于“数据集”这个名词大家可能不会太习惯,但是对于一般的格式来说,一个“数据集”就是一个文件,比如一个gif文件就是一个以gif为扩展名的文件。但是对于众多RS数据来说,一个数据集包含的绝对不仅仅是一个文件。对于很多RS数据,他们把一张图像分成数个图像文件,然后放在一个文件夹中,用一些额外的文件来组织它们之间的关系,形成一个“数据集”。如果你不理解,那么就算了,当成jpg或者gif文件好了。

下面我们打开一个tiff文件(GeoTIFF)。这个文件是我从GRASS的示例数据spearfish中导出的一个同名影像数据。

Toggle line numbers Toggle line numbers

1 >>> import gdal

2 >>> dataset = gdal.Open("j:/gisdata/gtif/spot.tif")

3 >>> dir(dataset)

4 ['AddBand', 'AdviseRead', 'BuildOverviews', 'FlushCache',

'GetDescription', 'Get

5 Driver', 'GetGCPCount', 'GetGCPProjection', 'GetGCPs',

'GetGeoTransform', 'GetMe

6 tadata', 'GetProjection', 'GetProjectionRef', 'GetRasterBand', 'GetSubDatasets',

7 'RasterCount', 'RasterXSize', 'RasterYSize', 'ReadAsArray',

'ReadRaster', 'Refr

8 eshBandInfo', 'SetDescription', 'SetGCPs', 'SetGeoTransform',

'SetMetadata', 'Se

9 tProjection', 'WriteRaster', '__del__', '__doc__', '__init__', '__module__', '_b

10 and', '_o']

11 >>>

这样我们就打开了这个文件。并且我们可以看到可以供我们调用的函数们(更具体的API列表可以看这里)。现在我们不做修改,不做添加,所以只要带有Set 开头的函数以及有Write开头的函数我们暂时都不管。因为RS影像必然要和地理上的位置挂上钩,才能把图像正确铺展到一个坐标系中。其中的信息和对应

关系有点复杂,不适合在快速开始中介绍,我们暂时也先不管。这里需要注意的就是几个函数。

GetDescription 获得栅格的描述信息。

Toggle line numbers Toggle line numbers

1 >>> dataset.GetDescription()

2 'j:/gisdata/gtif/spot.tif'

3 >>>

看来这里的图像描述是图像的路径名,但是这是和各种不同数据集相关的,不同数据集可能有不同的描述。这要看读取驱动的实现作者的高兴了。

RasterCount 获得栅格数据集的波段数。

GetRasterBand 获得栅格数据集的波段。

Toggle line numbers Toggle line numbers

1 >>> dataset.RasterCount

2 1

3 >>> band = dataset.GetRasterBand(1)

4 >>>

这里需要解释的是Band这个词。这个词可以翻译成“波段”,“通道”等等。我这里把它统一称为“波段”。因为遥感卫星的传感器有很多个。一个传感器只负责接收一个频率范围的地物反射光波,一个频率范围的光波记录称为一个波段。是不是晕了?其实说得简单一点。其实你可以把波段看成红绿蓝几种颜色。图像不是分RGB三色吗?把R,G,B值都提取出来成为三个表。R值表就是波段一,G值表就是波段二,B值表就是波段三。

这里我们看到这张图只有一个波段(一种颜色)。就可以把它看成是一个灰度图(类似黑白照片)。如果 RasterCount是3,就有可能是彩色图。如果RasterCount 是比3大的数,恭喜你,你看到一张遥感影像。有很多卫星的传感器大于3个,比如TM就有7个波段,不仅有可见光,还有红外等其他非可见光。,所以,波段一般比RGB能表达的丰富地多。不过这样一来就需要我们从中挑出3个波段然后组合成RGB,当然这样就有可能使图像显示出来的东西不像平常我们看到的那样。这样安排是因为对科学有帮助(一些波段在科学家眼里比真实的彩色照片有价值)。不理解就跳过,很正常,我第一次听这种东西也觉得很玄:)

这里我们获取了第一个波段(红色值组成的表)。注意!这里的波段获取和通常的C数组获取不一样,开始是1不是0。获取了波段,我们就可以在下面的操作中读取这个波段的所有数值。

RasterXSize 图像的宽度(X方向上的像素个数)

RasterYSize 图像的高度(Y方向上的像素个数)

Toggle line numbers Toggle line numbers

1 >>> dataset.RasterXSize

2 950

3 >>> dataset.RasterYSize

4 700

5 >>>

可以看出我们的图像大小是950*700。还是很小的一张图。

ReadRaster 读取图像数据(以二进制的形式)

ReadAsArray 读取图像数据(以数组的形式)

Toggle line numbers Toggle line numbers

1 >>> help(dataset.ReadRaster)

2 Help on method ReadRaster in module gdal:

3 ReadRaster(self, xoff, yoff, xsize, ysize, buf_xsize=None,

buf_ysize=None, buf_t

4 ype=None, band_list=None) method of gdal.Dataset instance

5 >>> help(dataset.ReadAsArray)

6 Help on method ReadAsArray in module gdal:

7 ReadAsArray(self, xoff=0, yoff=0, xsize=None, ysize=None) method of gdal.Dataset

8 instance

9 >>>

这两个函数很重要,它们直接读取图像的数据,可以看到两个函数的帮助中有一大溜的参数。解释一下: xoff,yoff,xsize,ysize 你可能不想读取整张图像。只想读取其中的一部分。那么就用xoff,yoff指定想要读取的部分原点位置在整张图像中距离全图原点的位置。用xsize和 ysize指定要读取部分图像的矩形大小。

buf_xsize buf_ysize 你可以在读取出一部分图像后进行缩放。那么就用这两个参数来定义缩放后图像最终的宽和高,gdal将帮你缩放到这个大小。

buf_type 如果你要读取的图像的数据类型不是你想要的(比如原图数据类型是short,你要把它们缩小成byte),就可以设置它。

band_list 这就适应上面多波段的情况。你可以指定读取的波段序列。要哪几个波段,不要哪几个波段,你说了算。

举个例子吧:

Toggle line numbers Toggle line numbers

1 >>> dataset.ReadAsArray(230,270,10,10)

2 array([[255, 255, 255, 232, 232, 255, 255, 255, 255, 222],

3 [255, 255, 255, 255, 255, 255, 210, 110, 11, 122],

4 [255, 255, 255, 255, 255, 255, 210, 255, 11, 243],

5 [201, 255, 255, 255, 255, 200, 200, 110, 122, 243],

6 [111, 211, 255, 201, 255, 255, 100, 11, 132, 243],

7 [255, 100, 100, 100, 110, 100, 110, 111, 122, 243],

8 [255, 255, 255, 255, 255, 255, 122, 222, 255, 255],

9 [255, 255, 255, 255, 255, 255, 243, 243, 255, 255],

10 [255, 255, 255, 255, 255, 255, 255, 255, 255, 255],

11 [255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],'b')

12 >>> dataset.ReadRaster(230,270,10,10)

13

'\xff\xff\xff\xe8\xe8\xff\xff\xff\xff\xde\xff\xff\xff\xff\xff\xff\xd2 n\x0bz\xff\

14

xff\xff\xff\xff\xff\xd2\xff\x0b\xf3\xc9\xff\xff\xff\xff\xc8\xc8nz\xf3 o\xd3\xff\x

15

c9\xff\xffd\x0b\x84\xf3\xffdddndnoz\xf3\xff\xff\xff\xff\xff\xffz\xde\ xff\xff\xff

16

\xff\xff\xff\xff\xff\xf3\xf3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ xff\xff\xff

17 \xff\xff\xff\xff\xff\xff\xff\xff\xff'

18 >>>

我们就把图像中位于230,270,宽度10高度10的数据读取出来了。

我们看完了数据集的主要函数。似乎已经够用了。的确,如果只是为了显示图像,这些的确已经够了。但是如果需要更多信息,我们就不得不进入波段操作数据(实际上我们大多数时候都需要进入band获取信息)。下面我们现在来看看刚才读取出来的那个band有些什么东西可以供我们操作的(具体的API列表看这里)。

Toggle line numbers Toggle line numbers

1 >>> dir(band)

2 ['AdviseRead', 'Checksum', 'ComputeBandStats',

'ComputeRasterMinMax', 'DataType'

3 , 'Fill', 'FlushCache', 'GetDefaultHistogram', 'GetDescription', 'GetHistogram',

4 'GetMaximum', 'GetMetadata', 'GetMinimum', 'GetNoDataValue',

'GetOffset', 'GetO

5 verview', 'GetOverviewCount', 'GetRasterColorInterpretation',

'GetRasterColorTab

6 le', 'GetScale', 'GetStatistics', 'ReadAsArray', 'ReadRaster', 'SetDefaultHistog

7 ram', 'SetDescription', 'SetMetadata', 'SetNoDataValue',

'SetRasterColorInterpre

8 tation', 'SetRasterColorTable', 'WriteArray', 'WriteRaster',

'XSize', 'YSize', '

9 __doc__', '__init__', '__module__', '_o']

10 >>>

挑几个有用的吧。

Toggle line numbers Toggle line numbers

1 >>> band.XSize

2 950

3 >>> band.YSize

4 700

5 >>> band.DataType

6 1

7 >>>

不用解释了吧,波段图像的宽和高(象元为单位)。DataType,图像中实际数值的数据类型。具体数据类型定义在gdalconst模块里。使用的时候用import gdalconst引入。

Toggle line numbers Toggle line numbers

1 >>> import gdalconst

2 >>> dir(gdalconst)

3 ['CE_Debug', 'CE_Failure', 'CE_Fatal', 'CE_None', 'CE_Warning', 'CPLES_Backslash

4 Quotable', 'CPLES_CSV', 'CPLES_SQL', 'CPLES_URL', 'CPLES_XML', 'CPLE_AppDefined'

5 , 'CPLE_AssertionFailed', 'CPLE_FileIO', 'CPLE_IllegalArg',

'CPLE_NoWriteAccess'

6 , 'CPLE_None', 'CPLE_NotSupported', 'CPLE_OpenFailed',

'CPLE_OutOfMemory', 'CPLE

7 _UserInterrupt', 'CXT_Attribute', 'CXT_Comment', 'CXT_Element', 'CXT_Literal', '

8 CXT_Text', 'DCAP_CREATE', 'DCAP_CREATECOPY',

'DMD_CREATIONDATATYPES', 'DMD_CREAT

9 IONOPTIONLIST', 'DMD_EXTENSION', 'DMD_HELPTOPIC', 'DMD_LONGNAME', 'DMD_MIMETYPE'

10 , 'GA_ReadOnly', 'GA_Update', 'GCI_AlphaBand', 'GCI_BlackBand', 'GCI_BlueBand',

11 'GCI_CyanBand', 'GCI_GrayIndex', 'GCI_GreenBand', 'GCI_HueBand', 'GCI_LightnessB

12 and', 'GCI_MagentaBand', 'GCI_PaletteIndex', 'GCI_RedBand',

'GCI_SaturationBand'

13 , 'GCI_Undefined', 'GCI_YellowBand', 'GDT_Byte', 'GDT_CFloat32', 'GDT_CFloat64',

14 'GDT_CInt16', 'GDT_CInt32', 'GDT_Float32', 'GDT_Float64',

'GDT_Int16', 'GDT_Int

15 32', 'GDT_TypeCount', 'GDT_UInt16', 'GDT_UInt32', 'GDT_Unknown', 'GF_Read', 'GF_

16 Write', 'GPI_CMYK', 'GPI_Gray', 'GPI_HLS', 'GPI_RGB',

'GRA_Bilinear', 'GRA_Cubic

17 ', 'GRA_CubicSpline', 'GRA_NearestNeighbour', '__builtins__',

'__doc__', '__file

18 __', '__name__']

19 >>>

那些GDT开头的就是数值数据类型。

Toggle line numbers Toggle line numbers

1 >>> band.GetNoDataValue()

2 65535.0

3 >>> band.GetMaximum()

4 >>> band.GetMinimum()

5 >>> https://www.doczj.com/doc/709078743.html,puteRasterMinMax()

6 (1.0, 255.0)

7 >>>

Maximum 是表示在本波段数值中最大的值,Minimum当然就是表示本波段中最小的值啦。我们可以看到在一开始这两个都没有值。因为对于文件格式不会有固有的最大最小值。所以我们通过函数ComputeRasterMinMax计算得到了。注意!这里的最大最小值不包括“无意义值”!也就是上面显示的 NoDataValue。需要解释一下“无意义值”。不要以为0或者255在任何情况下都无意义。在很多情况下0,255需要和其他值一样表示一个实际意义。虽然可能它最终会被显示得和黑色一样。而一些位置上的点要表示的意思是“什么也不是”,它在那个位置上只是为了占一个位置,使得整体图像看起来像个矩形而已。在做实际应用的时候两种值的处理将会完全不一样。所以需要设置无意义值,来和其他的值区别开来。而用ComputeRasterMinMax算出的最大最小值,是排除了无意义值后计算出来的最大最小值。

Toggle line numbers Toggle line numbers

1 >>> band.GetRasterColorInterpretation()

2 2

3 >>> gdalconst.GCI_PaletteIndex

4 2

5 >>> colormap = band.GetRasterColorTable()

6 >>> dir(colormap)

7 ['Clone', 'GetColorEntry', 'GetColorEntryAsRGB', 'GetCount',

'GetPaletteInterpre

8 tation', 'SetColorEntry', '__del__', '__doc__', '__init__',

'__module__', '__str

9 __', '_o', 'own_o', 'serialize']

10 >>> colormap.GetCount()

11 256

12 >>> colormap.GetPaletteInterpretation()

13 1

14 >>> gdalconst.GPI_RGB

15 1

16 >>> for i in range(colormap.GetCount()):

17 ... print colormap.GetColorEntry(i),

18 ...

19 (0, 0, 0, 255) (0, 0, 28, 255) (0, 0, 56, 255) (0, 0, 85, 255) (0, 0, 113, 255)

20 (0, 0, 142, 255) (0, 0, 170, 255) (0, 0, 199, 255) (0, 0, 227, 255) (0, 0, 255,

21 255) (0, 28, 0, 255) (0, 28, 28, 255) (0, 28, 56, 255) (0, 28, 85, 255) (0, 28,

22 113, 255) (0, 28, 142, 255) (0, 28, 170, 255) (0, 28, 199, 255) (0, 28, 227, 255

23 ) (0, 28, 255, 255) (0, 56, 0, 255) (0, 56, 28, 255) (0, 56, 56, 255) (0, 56, 85

24 , 255) (0, 56, 113, 255) (0, 56, 142, 255) (0, 56, 170, 255) (0, 56, 199, 255) (

25 0, 56, 227, 255) (0, 56, 255, 255) (0, 85, 0, 255) (0, 85, 28, 255) (0, 85, 56,

26 255) (0, 85, 85, 255) (0, 85, 113, 255) (0, 85, 142, 255) (0, 85, 170, 255) (0,

27 85, 199, 255) (0, 85, 227, 255) (0, 85, 255, 255) (0, 113, 0, 255) (0, 113, 28,

28 255) (0, 113, 56, 255) (0, 113, 85, 255) (0, 113, 113, 255) (0, 113, 142, 255) (

29 0, 113, 170, 255) (0, 113, 199, 255) (0, 113, 227, 255) (0, 113, 255, 255) (0, 1

30 42, 0, 255) (0, 142, 28, 255) (0, 142, 56, 255) (0, 142, 85, 255) (0, 142, 113,

31 255) (0, 142, 142, 255) (0, 142, 170, 255) (0, 142, 199, 255) (0, 142, 227, 255)

32 (0, 142, 255, 255) (0, 170, 0, 255) (0, 170, 28, 255) (0, 170, 56, 255) (0, 170

33 , 85, 255) (0, 170, 113, 255) (0, 170, 142, 255) (0, 170, 170, 255) (0, 170, 199

34 , 255) (0, 170, 227, 255) (0, 170, 255, 255) (0, 199, 0, 255) (0, 199, 28, 255)

35 (0, 199, 56, 255) (0, 199, 85, 255) (0, 199, 113, 255) (0, 199, 142, 255) (0, 19

36 9, 170, 255) (0, 199, 199, 255) (0, 199, 227, 255) (0, 199, 255, 255) (0, 227, 0

37 , 255) (0, 227, 28, 255) (0, 227, 56, 255) (0, 227, 85, 255) (0, 227, 113, 255)

38 (0, 227, 142, 255) (0, 227, 170, 255) (0, 227, 199, 255) (0, 227, 227, 255) (0,

39 227, 255, 255) (0, 255, 0, 255) (0, 255, 28, 255) (0, 255, 56, 255) (0, 255, 85,

40 255) (0, 255, 113, 255) (0, 255, 142, 255) (0, 255, 170, 255) (0, 255, 199, 255

41 ) (0, 255, 227, 255) (0, 255, 255, 255) (28, 0, 0, 255) (28, 0, 28, 255) (28, 0,

42 56, 255) (28, 0, 85, 255) (28, 0, 113, 255) (28, 0, 142, 255) (28, 0, 170, 255)

43 (28, 0, 199, 255) (28, 0, 227, 255) (28, 0, 255, 255) (28, 28, 0, 255) (28, 28,

44 28, 255) (28, 28, 56, 255) (28, 28, 85, 255) (28, 28, 113, 255) (28, 28, 142, 2

45 55) (28, 28, 170, 255) (28, 28, 199, 255) (28, 28, 227, 255) (28, 28, 255, 255)

46 (28, 56, 0, 255) (28, 56, 28, 255) (28, 56, 56, 255) (28, 56, 85, 255) (28, 56,

47 113, 255) (28, 56, 142, 255) (28, 56, 170, 255) (28, 56, 199, 255) (28, 56, 227,

48 255) (28, 56, 255, 255) (28, 85, 0, 255) (28, 85, 28, 255) (28, 85, 56, 255) (2

49 8, 85, 85, 255) (28, 85, 113, 255) (28, 85, 142, 255) (28, 85, 170, 255) (28, 85

50 , 199, 255) (28, 85, 227, 255) (28, 85, 255, 255) (28, 113, 0, 255) (28, 113, 28

51 , 255) (28, 113, 56, 255) (28, 113, 85, 255) (28, 113, 113, 255) (28, 113, 142,

52 255) (28, 113, 170, 255) (28, 113, 199, 255) (28, 113, 227, 255) (28, 113, 255,

53 255) (28, 142, 0, 255) (28, 142, 28, 255) (28, 142, 56, 255) (28, 142, 85, 255)

54 (28, 142, 113, 255) (28, 142, 142, 255) (28, 142, 170, 255) (28, 142, 199, 255)

28, 255) (28

56 , 170, 56, 255) (28, 170, 85, 255) (28, 170, 113, 255) (28, 170, 142, 255) (28,

57 170, 170, 255) (28, 170, 199, 255) (28, 170, 227, 255) (28, 170, 255, 255) (28,

58 199, 0, 255) (28, 199, 28, 255) (28, 199, 56, 255) (28, 199, 85, 255) (28, 199,

59 113, 255) (28, 199, 142, 255) (28, 199, 170, 255) (28, 199, 199, 255) (28, 199,

60 227, 255) (28, 199, 255, 255) (28, 227, 0, 255) (28, 227, 28, 255) (28, 227, 56,

61 255) (28, 227, 85, 255) (28, 227, 113, 255) (28, 227, 142, 255) (28, 227, 170,

62 255) (28, 227, 199, 255) (28, 227, 227, 255) (28, 227, 255, 255) (28, 255, 0, 25

63 5) (28, 255, 28, 255) (28, 255, 56, 255) (28, 255, 85, 255) (28, 255, 113, 255)

64 (28, 255, 142, 255) (28, 255, 170, 255) (28, 255, 199, 255) (28, 255, 227, 255)

65 (28, 255, 255, 255) (56, 0, 0, 255) (56, 0, 28, 255) (56, 0, 56, 255) (56, 0, 85

66 , 255) (56, 0, 113, 255) (56, 0, 142, 255) (56, 0, 170, 255) (56, 0, 199, 255) (

67 56, 0, 227, 255) (56, 0, 255, 255) (56, 28, 0, 255) (56, 28, 28, 255) (56, 28, 5

68 6, 255) (56, 28, 85, 255) (56, 28, 113, 255) (56, 28, 142, 255) (56, 28, 170, 25

69 5) (56, 28, 199, 255) (56, 28, 227, 255) (56, 28, 255, 255) (56, 56, 0, 255) (56

70 , 56, 28, 255) (56, 56, 56, 255) (56, 56, 85, 255) (56, 56, 113, 255) (56, 56, 1

71 42, 255) (56, 56, 170, 255) (56, 56, 199, 255) (56, 56, 227, 255) (56, 56, 255,

72 255) (56, 85, 0, 255) (56, 85, 28, 255) (56, 85, 56, 255) (56, 85, 85, 255) (56,

73 85, 113, 255) (56, 85, 142, 255) (56, 85, 170, 255) (56, 85, 199, 255) (56, 85,

74 227, 255) (56, 85, 255, 255) (56, 113, 0, 255) (56, 113, 28, 255) (56, 113, 56,

75 255) (56, 113, 85, 255) (56, 113, 113, 255) (56, 113, 142, 255) (56, 113, 170,

76 255) (56, 113, 199, 255) (56, 113, 227, 255) (56, 113, 255, 255) (56, 142, 0, 25

113, 255)

78 (56, 142, 142, 255)

79 >>>

通过GetRasterColorInterpretation,我们知道我们的图像是一个颜色表索引的图像而不是纯粹的黑白灰度图像(PaletteIndex,其他的颜色模型,可以察看gdalconst模块中GCI打头的枚举值)。这意味着我们读出的数据有可能不是真实的数据。这些数据只是一个个实际数据的索引。真实数据存储在另一个表中。我们通过ReadRaster读出的数据值只是对应到这个表的一个索引而已。我们需要通过读出这些数据,并在真实数据表中找出真实数据,重新组织成一个RGB

表才能用来绘制。如果我们不经过对应,我们绘制出来的东西可能什么东西都不是。

用GetRasterColorTable获得了颜色表,通过 GetPaletteInterpretation我们知道我们获得的颜色表是一个RGB颜色表。GDAL支持多种颜色表,具体可以参考 gdalconst模块中GPI打头的枚举值。然后我们可以通过GetCount获得颜色的数量。通过GetColorEntry获得颜色表中的值。这里的颜色值都是一个4值的元组。里面有意义的只有前三个(如果颜色模型是GPI_RGB, GPI_HLS,都使用前3个,如果采用GPI_CMYK,则4个值都有意义了)。

Toggle line numbers Toggle line numbers

1 >>> help(band.ReadAsArray)

2 Help on method ReadAsArray in module gdal:

3 ReadAsArray(self, xoff=0, yoff=0, win_xsize=None, win_ysize=None, buf_xsize=None

4 , buf_ysize=None, buf_obj=None) method of gdal.Band instance

5 >>> help(band.ReadRaster)

6 Help on method ReadRaster in module gdal:

7 ReadRaster(self, xoff, yoff, xsize, ysize, buf_xsize=None,

buf_ysize=None, buf_t

8 ype=None) method of gdal.Band instance

9 >>>

显然,band里的ReadAsArray参数显然比dataset里面的要好用,而ReadRaster 则差不多。但是ReadAsArray读出的是数组,可以用Numeric模块进行矩阵魔法。ReadRaster读出的是二进制,虽然可以直接绘制,但是对于一些绘图API 来说,对[[RRR...][GGG...][BBB...]]表的处理明显不如[[RGB][RGB]...],有的甚至不支持。虽然可以用struct.unpack来拆封,可效率上就差很多(而且拆封出来还是数组)。数组在矩阵魔法的控制之下则会显得十分方便快捷,最后用tostring直接转化称为二进制绘制,速度也相当快。

好了,快速开始已经使我们可以初步看清楚了gdal中图像的组织。下面用一句话总结一下:波段组成图像,波段指挥颜色。

4. 反馈

如果您发现我写的东西中有问题,或者您对我写的东西有意见,请一定要发邮件跟我讲,Email( linux_23@https://www.doczj.com/doc/709078743.html, )

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

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

1. GDAL库的一些细节

1.1. 关于ReadRaster

1.1.1. 缩放

下面是我的一个小例子:我使用了ReadAsArray,返回的是Numeric模块定义的Array,我喜欢它的是因为它排列很工整,看起来很好看。 (这里的数据是用GRASS从spearfish示例数据转出的aspect数据集)

Toggle line numbers Toggle line numbers

1 >>> import gdal

2 >>> from gdalconst import *

3 >>> dataset = gdal.Open("f:/pyproj/gtif/aspect.tif")

4 >>> band = dataset.GetRasterBand(1)

5 >>> band.ReadAsArray(100,100,5,5,10,10)

6 array([[ 61, 61, 58, 58, 90, 90, 87, 87, 45, 45],

7 [ 61, 61, 58, 58, 90, 90, 87, 87, 45, 45],

8 [ 36, 36, 59, 59, 113, 113, 88, 88, 37, 37],

9 [ 36, 36, 59, 59, 113, 113, 88, 88, 37, 37],

10 [255, 255, 82, 82, 135, 135, 72, 72, 22, 22],

11 [255, 255, 82, 82, 135, 135, 72, 72, 22, 22],

12 [ 45, 45, 129, 129, 144, 144, 255, 255, 255, 255],

13 [ 45, 45, 129, 129, 144, 144, 255, 255, 255, 255],

14 [ 90, 90, 110, 110, 98, 98, 35, 35, 45, 45],

15 [ 90, 90, 110, 110, 98, 98, 35, 35, 45, 45]],'b')

16 >>> band.ReadAsArray(100,100,10,10,10,10)

17 array([[ 61, 58, 90, 87, 45, 255, 255, 117, 65, 50],

19 [255, 82, 135, 72, 22, 29, 67, 118, 77, 120],

20 [ 45, 129, 144, 255, 255, 36, 94, 108, 88, 97],

21 [ 90, 110, 98, 35, 45, 88, 109, 121, 92, 73],

22 [ 94, 108, 85, 45, 55, 97, 144, 167, 135, 21],

23 [ 96, 106, 82, 45, 45, 45, 255, 230, 251, 255],

24 [246, 236, 255, 255, 3, 255, 255, 247, 254, 255],

25 [236, 249, 255, 255, 255, 255, 255, 255, 255, 255],

26 [194, 212, 255, 255, 255, 255, 255, 255, 255, 255]],'b')

27 >>> band.ReadAsArray(100,100,20,20,10,10)

28 array([[ 54, 95, 91, 150, 53, 135, 164, 139, 35, 37],

29 [128, 152, 86, 97, 96, 91, 116, 199, 255, 200],

30 [101, 66, 71, 135, 80, 152, 255, 255, 255, 210],

31 [171, 159, 87, 247, 254, 202, 104, 255, 255, 160],

32 [223, 255, 255, 255, 255, 206, 147, 193, 218, 121],

33 [227, 255, 255, 116, 150, 238, 255, 255, 137, 162],

34 [230, 255, 231, 247, 145, 156, 134, 30, 130, 136],

35 [155, 196, 252, 230, 187, 19, 134, 195, 126, 144],

36 [ 80, 54, 85, 105, 163, 140, 192, 95, 154, 146],

37 [150, 83, 71, 161, 173, 255, 255, 120, 149, 180]],'b')

38 >>>

ReadAsArray的原型

Toggle line numbers Toggle line numbers

1 >>> help(band.ReadAsArray)

2 Help on method ReadAsArray in module gdal:

3 ReadAsArray(self, xoff=0, yoff=0, win_xsize=None, win_ysize=None, buf_xsize=None

4 , buf_ysize=None, buf_obj=None) method of gdal.Band instance

看看函数的几个参数的意义。头两个100是取值窗口的左上角在实际数据中所处象元的xy位置。后两个是取值窗口覆盖的区域大小,再后面是取值窗口取出数组进行缩放后数组的大小。这里需要注意的是这里的buffer大小是根据参数自动分配的,可以不指定,如果不指定,则和第3,4个参数一致。经过5,6两个参数的设置,可以进行缩放。比如真的取值窗口大小可以是20*20,而取出后数组就可以人工设置大小。让他称为10*10的数组,或者是40*40的数组。如果设置20*40则取出的数组对于真实图像来说有了变形。

Toggle line numbers Toggle line numbers

1 >>> band.ReadAsArray(100,100,10,10)

2 array([[ 61, 58, 90, 87, 45, 255, 255, 117, 65, 50],

3 [ 36, 59, 113, 88, 37, 26, 63, 165, 23, 74],

4 [255, 82, 135, 72, 22, 29, 67, 118, 77, 120],

5 [ 45, 129, 144, 255, 255, 36, 94, 108, 88, 97],

7 [ 94, 108, 85, 45, 55, 97, 144, 167, 135, 21],

8 [ 96, 106, 82, 45, 45, 45, 255, 230, 251, 255],

9 [246, 236, 255, 255, 3, 255, 255, 247, 254, 255],

10 [236, 249, 255, 255, 255, 255, 255, 255, 255, 255],

11 [194, 212, 255, 255, 255, 255, 255, 255, 255, 255]],'b')

通过几个例子可以看到,读取的4个size参数的作用就是把硬盘上指定区域(前四个参数定义)的数据按比例缩放到用户指定区域(后两个定义)内,必要的时候进行缩放。这里需要注意的是缩的情况(缩的时候是取几个周围点的平均值)如果是调色板数据就可能引发问题(是否可以设置重采样方式我还要再研究一下)。

补:在这里发现了一个帖子,发现RasterIO用的都是最临近(都是最临近?),而要设置重采样方式只能在BuildPyramid的时候设置了。现在看来BuildPyramid还是有些用的。

1.1.

2. 范围

现在还有一个问题。就是取值窗口超过实际数据最大的范围怎么办?

Toggle line numbers Toggle line numbers

1 >>> band.XSize

2 634

3 >>> band.YSize

4 478

5 >>> band.ReadAsArray(630,100,10,10)

6 ERROR 5: Access window out of range in RasterIO(). Requested

7 (630,100) of size 10x10 on raster of 634x478.

8 Traceback (most recent call last):

9 File "", line 1, in ?

10 File "D:\Python24\lib\gdal.py", line 837, in ReadAsArray

11 buf_xsize, buf_ysize, buf_obj )

12 File "D:\Python24\lib\gdalnumeric.py", line 178, in BandReadAsArray

13 buf_xsize, buf_ysize, datatype, buf_obj )

14 TypeError: Access window out of range in RasterIO(). Requested

15 (630,100) of size 10x10 on raster of 634x478.

16 >>>

ERROR: EOF in multi-line statement

可以看到,出错了。获取数据的时候不能越界,很不好。还要调用的时候去判断越界没。还好用python的Numeric模块可以很方便地扩展矩阵。

1.1.3. 效率

对于gtif来说,从横向读取和重纵向读取的效率会相差十分之大(那不是一点的大)!可以写一个python文件来验证一下

Toggle line numbers Toggle line numbers

1 # gtif.py

2 import gdal

3 import time

4 dataset = gdal.Open("f:/gisdata/gtif/zz.tif")

5 band = dataset.GetRasterBand(1)

6 width = dataset.RasterXSize

7 height = dataset.RasterYSize

8 bw = 128

9 bh = 128

10 bxsize = width/128

11 bysize = width/128

12 start = time.time()

13 band.ReadAsArray(0,0,width,height)

14 print time.time()-start

15 start2 = time.time()

16 for i in range(bysize):

17 for j in range(bxsize):

18 band.ReadAsArray(bw*j,bh*i,bw,bh)

19 print time.time()-start2

运行一下得到结果

F:\pyproj>gtif.py

2.35899996758

0.766000032425

然后把最后一段的循环的两个for位置调换一下(缩进要注意),变成:

Toggle line numbers Toggle line numbers

1 for j in range(bxsize):

2 for i in range(bysize):

3 band.ReadAsArray(bw*j,bh*i,bw,bh)

运行结果是:

F:\pyproj>gtif.py

2.48400020599

24.140999794

天!运行时间是第一次的N倍!切注意!切注意!

另外,我们可以看到,如果把图像分块读取,比不分块读取同样大小的图像效率明显要高出许多。

1.2. 关于ColorMap

1.2.1. ColorMap的颜色定义

ColorMap的定义在下面有详细的解释 :

颜色表:一个颜色表可能包含一个或者更多的如下面这种C结构描述的颜色元素。

typedef struct

{

/- gray, red, cyan or hue -/

short c1;

/- green, magenta, or lightness -/

short c2;

/- blue, yellow, or saturation -/

short c3;

/- alpha or blackband -/

short c4;

} GDALColorEntry;

颜色表也有一个色彩解析值。(GDALPaletteInterp)这个值有可能是下面值的一种。并且描述了C1,c2,c3,c4该如何解释。

GPI_GRAY: c1表示灰度值

GPI_RGB: c1表示红,c2表示绿,c3表示蓝,c4表示Alpha

GPI_CYMP: c1表示青,c2表示品,c3表示黄,c4表示黑

GPI_HLS: c1表示色调,c2表示亮度,c3表示饱和度

虽然有颜色表示数的区别,但是用GetColorEntry读出的都是4个值,根据PaletteInterp枚举值看截取其中的几个值形成颜色。

1.2.2. ColorMap颜色变动

需要注意的是在gdal使用ColorMap的时候,对原始的ColorMap已经做过变动了。比如 geotiff的ColorMap的数据类型是 short,默认的范围是在0~65535,但是在gdal读取出来以后,已经经过了范围压缩。压到了0~255。虽然都是short 类型,但是值已经变化。

参考快速开始那张颜色表,可以看到颜色表中的数据是经过(原始数据

/65535.0*255)调整过的。这里在使用的时候可能比较方便,但是如果你是有读取过geotiff原始数据背景的,则需要小心。可能会有习惯性思维的陷阱。因为两者的类型都是 short,但是实际的数值不一样(我就曾经以为gdal读取的是geotiff内部的原始ColorMap数据)。

1.2.3. 反馈

如果您发现我写的东西中有问题,或者您对我写的东西有意见,请一定要发邮件跟我讲,Email(linux_23@https://www.doczj.com/doc/709078743.html,)

GDAL库学习笔记(三):GDAL创建数据集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 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':

ENVI中的几何校正

几何校正 1.遥感图像产生几何畸变的原因 地物目标发出的电磁波被卫星上所载传感器接收,这些电磁波上记录和传达了地物目标的信息,这是遥感图像成像的过程也是它的内在规律。在这个过程中图像的几何畸变也随即产生了,其中原因很多,主要表现在以下几个方面: 1. 1卫星位置和运动状态变化的影响 卫星围绕地球按椭圆轨道运动,引起卫星航高和飞行速度的变化,导致图像对应产生偏离与在卫星前进方向上的位置错动。另外,运动过程中卫星的偏航、翻滚和俯仰变化也能引起图像的畸变。 以上误差总的来说,都是因为传感器相对于地物的位置、姿态和运动速度变化产生的,属于外部误差。此外,由于传感器本身原因产生的误差,即内部误差,这类误差一般很小,通常人们不作考虑。 1. 2地球自转的影响 大多数卫星都是在轨道运行的降段接收图像,即当地球自西向东自转时,卫星自北向南运动。这种相对运动的结果会使卫星的星下位置产生偏离,从而使所成图像产生畸变。 1. 3地球表面曲率的影响 地球表面是不规则的曲面,这使卫星影像成像时像点发生移动,像元对应于地面的宽度不等。特别是当传感器扫描角度较大时,影响更加突出。 1. 4地形起伏的影响 当地形存在起伏时,使原来要反映的理想的地面点被垂直在其上的实际某高点所代替,引起图像上像点也产生相应的偏离。 1. 5大气折射的影响 由于大气圈的密度是不均匀分布的,从下向上越来越小,使得整个大气圈的折射率不断变化,当地物发出的电磁波穿越大气圈时,经折射后的传播路径不再是直线而是一条曲线,从而导致传感器接收的像点发生位移。 2.进行几何校正并保证精度的必要性 遥感图像几何校正的精确与否直接关系到应用遥感信息反应地表地物的地理位置和面积的精确度,关系到从图像上获取的信息准确与否,因此在选择控制点上要十分小心,尽可能提高其精度,并且要对校正结果进行反复的分析比较,必要时还要进行多次校正。几何校正让图像上地物对应的像元出现在它应该在的地方,再通过辐射校正、影像增强等遥感图像处理技术,还图像以“本来面目”。然后通过对图像的识别、分类、解译处理实现地面空间上各类资源信息的空间分析研究,使遥感技术投入到实际生产应用中。 3.几何精校正 遥感影像图的几何校正目前有3种方案,即系统校正、利用控制点校正以及混合校正。遥感数据接收后,首先由接收部门进行校正,这种校正叫系统校正(又叫几何粗校正) ,即把遥感传感器的校准数据、传感器的位置、卫星姿态等测量值代入理论校正公式进行几何畸变校正;而用户拿到这种产品后,由于使用目的不同或投影及比例尺不同,仍旧需要做进一步的几何校正,这就需要对其进行几何精校正即利用地面控制点GCP ( GroundContr ol2Point,遥感图像上易于识别,并可精确定位的点)对因其他因素引起的遥感图像几何畸变进行纠正。混合校正则是由一般地面站提供的遥感CCT已经完成了第一阶段的几何粗校正,用户所要完成的仅仅是对图像做进一步的几何精校正。 几何精校正就是利用地面控制点GCP对各种因素引起的遥感图像几何畸变进行校正。从数学上说,其原理是通过一组GCP建立原始的畸变图像空间与校正空间的坐标变换关系,

基于GDAL库的遥感图像处理软件的框架设计与开发

基于GDAL库及OpenGL的遥感图像处理类软件的框架 设计方法研究 王顺志 (中国海洋大学信息科学与工程学院,山东青岛266100) 摘要:本文介绍了GDAL库及OpenGL图形接口的功能及特点,以及这两者对于开发遥感软件的帮助和优势,在此基础上介绍了一种遥感图像处理软件框架的设计方法,使软件实现正确读取各类格式的遥感文件,进行图像处理操作并在窗口中绘图显示结果,为这类遥感软件的开发提供参考。 关键词:GDAL OpenGL 分块读取应用程序框架类对象关系

1引言 卫星遥感技术自上世纪八十年代起进入了一个高速发展的阶段,随着美国宇航局(NASA)、欧空局(ESA)以及其他一些国家,如加拿大、日本、中国先后建立起各自的遥感系统,为科研人员提供了越来越多有价值的从太空观测地球的数据和图像,因此,如何快捷、准确地处理遥感数据成为卫星遥感一个新的课题。 计算机软硬件技术的发展和提高为遥感数字图像处理提供了重要的技术手段,由于遥感图像比普通数字图像包含更多的信息,如目标物的大小、形状、特征属性,区分各种目标并进行分类等,这就要求将遥感图像信息的获取发展为计算机支持下的遥感图像智能化识别,最终实现遥感图像理解。随着遥感技术在社会的许多领域发挥越来越重要的作用,研究人员对功能强大、使用方便的遥感数据处理软件的需求也在日益增长。如今,国际上最流行的遥感软件有加拿大 PCI公司开发的PCI Geomatica、美国 ERDAS LLC公司开发的ERDAS Imagine以及美国 Research System INC公司开发的ENVI,这些遥感软件虽然功能强大,可以通过简单的菜单操作就可以得到较为理想的结果输出,但却不能记录处理过程,然而很多从事遥感行业的研究员都希望将自己的成果在以论文形式发表的同时也可以以系统和软件的形式得到实际的应用,并为以后新的理论建立一个可扩展的开发平台。这就要求我们自己动手开发一套满足各自需求且实用的遥感软件。此类软件的开发有以下难点:遥感数据格式多样,读取方法难统一;遥感图像容量很大,全图读取或显示十分耗时;各种遥感地理、投影信息的读取;经过复杂图像处理算法后显示输出效率低等。本文介绍一种在Visual C++平台上基于GDAL库,并利用OpenGL图形接口的遥感图像处理类软件的框架设计方法,在此框架的基础上能够扩展出研发人员自己的各种遥感数据处理算法或功能模块,最终形成产品化的软件。 2GDAL库的功能及应用 任何图像处理软件的首要工作是能够正确读取数据,遥感图像处理软件也不例外。遥感数据是指太阳辐射、红外、微波等电磁波经过大气层到达地面,被地物反射后再次经过大气层,被遥感传感器接受,并由传感器将这部分能量特征传送回地面的能量特征数据。由于卫星搭载的传感器多种多样,接受数据选择的波段(或者说通道)各不相同,因此传回来的遥感数据格式也是种类繁多,这就给遥感软件读取数据模块的开发带来了不小的难度,然而GDAL库却能轻松解决这一难题。 GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行遥感数据转换和处理。有很多著名的GIS类产品都使用了GDAL/OGR库,包括ESRI 的ArcGIS 9.2,Google Earth和跨平台的GRASS GIS系统。GDAL库几乎支持现在所有的遥感数据格式,下表列出了几种常见格式(详细的格式支持见https://www.doczj.com/doc/709078743.html,/formats_list.html):

GDAL_API Tutorial

GDAL API Tutorial Before opening a GDAL supported raster datastore it is necessary to register drivers. 在打开一个GDAL支持的栅格资料之前,必需要注册驱动。 There is a driver for each supported format. 每个驱动对应各自支持的格式。 Normally this is accomplished with the GDALAllRegister() function which attempts to register all known drivers, including those auto-loaded from .so files using GDALDriverManager::AutoLoadDrivers(). 通常这个会被GDALAllRegister()函数完成,试图去注册所有已知的驱动包括使用GDALDriverManager::AutoLoadDrivers()从.so文件来加载。 If for some applications it is necessary to limit the set of drivers it may be helpful to review the code from gdalallregister.cpp. 如果一些程序有必要去限制驱动集合,检查gdalallregister.cpp的代码将会有所帮助,Python automatically calls GDALAllRegister() when the gdal module is imported. 当gdal模块被导入时,Python会自动调用GDALAllRegister()。 Once the drivers are registered, the application should call the free standing GDALOpen() function to open a dataset, passing the name of the dataset and the access desired (GA_ReadOnly or GA_Update). 一但驱动被注册,程序将会调用独立的GDALOpen()函数通过dataset的名称和需要的存取方式(GA_ReadOnly或GA_Update)来打开dataset. Note that if GDALOpen() returns NULL it means the open failed, and that an error messages will already have been emitted via CPLError(). 注意如果GDALOpen()返回NULL,意味着打开失败了,这个错误信息将会通过CPLError ()释放出。 If you want to control how errors are reported to the user review the CPLError() documentation.

Gdalwarp命令解析

Gdalwarp gdalwarp.exe投影转换和投影设置。同时也可以进行图像镶嵌。这个程序可以重新投影所支持的投影,而且如果图像("raw" with)控制信息也可以把GCPs和图像存储在一起 用法 gdalwarp [--help-general] [--formats] [-s_srs srs_def] [-t_srs srs_def] [-order n] ] [-tps] [-et err_threshold] [-te xmin ymin xmax ymax] [-tr xres yres] [-ts width height] [-wo "NAME=VALUE"] [-ot Byte/Int16/...] [-wt Byte/Int16] [-srcnodata "value [value...]"] [-dstnodata "value [value...]"] -dstalpha [-rn] [-rb] [-rc] [-rcs] [-wm memory_in_mb] [-multi] [-q] [-of format] [-co "NAME=VALUE"]* srcfile* dstfile 参数解释 ?-s_srs srs_def 源空间参考集。所有可以使用 OGRSpatialReference.SetFromUserInput()来调用的坐标系统都可以使用。包括 EPSG PCS 和GCSes(例如EPSG:4296),PROJ.4 描述。或者包含知名文 本的以prf 为扩展名的文件。建议用Proj4 的描述。 ?-t_srs srs_def 目标坐标系统集。(可以参考上面的解释) ?-order n 用于绑定的多项式规则。默认的是选择一个基于GCPs 数量的多项式。 ?-tps 允许根据已有的GCPs 使用薄板内插转换方法。可以用这个来替代-order 参数。 ?-et err_threshold 转换的错误临界的近似值。(以象元单位- 默认到0.125) ?-te xmin ymin xmax ymax 设置被创建的输出文件的地理边界范围 ?-tr xres yres 设置输出文件分辨率(单位以目标地理参考为准) ?-ts width height 设置输出文件大小(以行列多少象元计量) ?-wo "NAME=VALUE" 设置绑定参数。GDALWarpOptions::papszWarpOptions 不会显示所有的参数,多个-wo 参数可以并列。 ?-ot type 设置输出波段的数据类型。 ?-wt type 工作的象元数据类型。包括在源图像和目标图像缓冲中的象元数据类型。 ?-rn 用最临近发进行重采样(默认,最快,但是内插质量最差) ?-rb 用双线性法进行重采样 ?-rc 用立方体发进行重采样 ?-rcs 用立方曲线发进行重采样(最慢的方法)

数字图像处理-畸变校正

数字图像处理

图像畸变及校正 1 图像畸变介绍 从数字图像处理的观点来考察畸变校正, 实际上是一个图像恢复的过程, 是对一幅退化了的图像进行恢复。在图像处理中,图像质量的改善和校正技术,也就是图像复原,当初是在处理从人造卫星发送回来的劣质图像的过程中发展、完善的。目前,图像畸变校正的应用领域越来越广,几乎所有涉及应用扫描和成像的领域都需要畸变校正。图像在生成和传送的过程中,很可能会产生畸变,如:偏色、模糊、几何失真、几何倾斜等等。前几种失真主要是体现在显示器上,而后一种失真则多与图像集角度有关。不正确的显影,打印、扫描,抓拍受反射光线的影响等方式,都会使图像产生偏色现像。模糊、几何畸变主要是在仪器采集图片过程中产生,大多是因机器故障或操作不当影响导致,如在医学成像方面。而几何空间失真广泛存在于各种实际工程应用中,尤其是在遥感、遥测等领域。 2 畸变产生的原因 在图像的获取或显示过程中往往会产生各种失真(畸变):几何形状失真、灰度失真、颜色失真。引起图像失真的原因有:成像系统的象差、畸变、带宽有限、拍摄姿态、扫描非线性、相对运动等;传感器件自身非均匀性导致响应不一致、传感器件工作状态、非均匀光照条件或点光源照明等;显示器件光电特性不一致;图像畸变的存在影响视觉效果,也是影响图像检测系统的形状检测和几何尺寸测量精度的重要因素之一。 3 图像畸变校正过程所用到的重要工具 灰度直方图是关于灰度级分布的函数,是对图象中灰度级分布的统计。灰度直方图是将数字图象中的所有像素,按照灰度值的大小,统计其所出现的频度。

通常,灰度直方图的横坐标表示灰度值,纵坐标为想像素个数。直方图上的一个点的含义是,图像存在的等于某个灰度值的像素个数的多少。这样通过灰度直方图就可以对图像的某些整体效果进行描述。从数学上讲,图像的灰度直方图是图像各灰度值统计特征与图像灰度值出现的频率。从图形上来讲,它是一个一维曲线,表征了图像的最基本的统计特征。 作为表征图像特征的信息而在图像处理中起着重要的作用。由于直方图反映了图像的灰度分布状况,所以从对图像的观察与分析,到对图像处理结果的评价,灰度直方图都可以说是最简单、最有效的工具。 4 图像颜色畸变校正介绍 图像颜色畸变现象可以是由摄像器材导致,也可以是由于真实环境本身就偏色导致,还有的是由于图像放置过久氧化、老化导致。无论其产生的原因如何,其校正方法都是类似的。 如果用Matlab显示颜色畸变的图像RGB基色直方图,发现相对正常图像,颜色畸变的图像的直方图的三种基色的直方图中至少有一个直方图的像素明显集中集中在一处,或则集中在0处或则集中在255处,而另一部分有空缺,或则集中在中间而两边空,因此通过调整该直方图的像素点的像素值在区间[0,255]上的分布来解决图像颜色畸变问题。如果直方图中像素集中在0一边则说明该基色偏暗,如果集中在255处则说明该基色偏亮。下图是一有颜色畸变的图像的基色B 的直方图。

GDAL安装

https://www.doczj.com/doc/709078743.html,/chimneyqin/blog/item/6c785aeac77ef0dfd439c9ef.html 2010-05-19 15:12 最近在学习在VC中调用GDAL库处理遥感影像,现总结如下: 1. GDAL安装 (1)下载gdal的安装文件,解压到某目录下如C:\gdal下。 这里我们假定VC6的安装在默认目录C:\Program Files\Microsoft Visual Studio8下。 (2)启动cmd,即打开控制台窗口。进入VC6的安装目录下,如cd C:\Program Files\Microsoft Visual Studio8\VC\bin\,在此目录下有个文件VCVARS32.BAT,执行该文件。 然后重新回到C:\gdal下。运行命令nmake /f makefile.vc。 编译完成后,用记事本打开文件C:\gdal\nmake.opt,根据自己的情况修改GDAL_HOME = 这一行,这个指的是最终GDAL的安装目录,比如说我们安装在C:\GDAL,那么这一行就是GDAL_HOME = "C:\GDAL",在C:\gdalsrc下执行nmake /f makefile.vc install,然后是nmake /f makefile.vc devinstall,然后我们需要的东西就安装到了C:\GDAL下。 2 .GDAL使用 (1)在VS2005中新建win32控制台程序 testGDALconsole,将gdal14.dll拷贝到testGDALconsole/debug中。 (否则运行时会提示找不到gdal14.dll) (2)Tools/options: 在Library files、Include files中分别添加GDAL的LIB目录和INCLUDE 件目录 (也可以直接将gdal_priv.h拷贝到testGDALconsole.cpp所在目录下)

将GDAL编译成C#可用的DLL

目的:将GDAL编译成C#可用的DLL 环境 GDAL-1.10.1 .net framework 4.0 vs 2010 swigwin-2.0.11 代码错误记录 1、函数名称错误

....\GDAL\gdal-1.10.1\swig\csharp\gdal文件夹中的Band.cs、Dataset.cs、Driver.cs三个文 件中BandUpcast、DatasetUpcast、DriverUpcast函数名称应分别改为Band_SWIGUpcast、Dataset_SWIGUpcast、Driver_SWIGUpcast。 2、重复定义 ....\GDAL\gdal-1.10.1\swig\csharp\ogr文件夹中OgrPINVOK.cs、OsrPINVOK.cs中第188行 有名称为 static OgrPINVOKE() { }、static OsrPINVOKE() {}的函数,此函数重复定义,将重复定义的代码删除。 类似的将....\GDAL\gdal-1.10.1\swig\csharp\osr文件夹中OsrPINVOK.cs的代码也改过来。 3、安全透明代码的问题 猜测是.net framework 版本过高引起的 ....\GDAL\gdal-1.10.1\swig\csharp\gdal中有很多cs文件,在需要使用到的cs文件中加入

using System.Security; [SecuritySafeCritical] 要注意的是Dataset.cs第52行的Dispose()函数被override了,要在此函数上面,即51行也要写入 [SecuritySafeCritical] 然后就可以编译了XD 编译 用vs命令提示(2010) 进入....\GDAL\gdal-1.10.1\ 分别执行 nmake /f makefile.vc nmake /f makefie.vc install nmake /f makefile.vc devinstall 进入....\GDAL\gdal-1.10.1\swig\csharp\ 执行 nmake /f makefile.vc nmake /f makefie.vc install

国外个主流语料库使用

1. The Complete Lexical Tutor http://www.lextutor.ca/ 参考期刊网上刘玉山,胡志军的介绍。 是一个语料库中心词索引软件(concordancer),加拿大魁北克大学Tom Cobb the University of Quebec at Montreal (UQAM), 开发 三部分:learners, researchers, teachers自我学习,研究,教师命题。 特别是concordance中有13个语料库为检索对象。还可以用来对学生作文中的用词分析。http://www.lextutor.ca/concordancers/concord_e.html 可以同时提供多个语料库的在线搜索,但缺点是每次只能对一个文本加工。 2.BNC 2014年开始,免费获得,通过BYU的申请。 British National Corpus 一亿词,书面语90%,口语10%,共4124篇文本,从1980到1993年的语料 英国牛津出版社﹑朗文出版公司﹑钱伯斯—哈洛普出版公司﹑牛津大学计算机服务中心、兰卡斯特大学英语计算机中心以及大英图书馆等联合开发建立的大型语料库 共有七类 口语spoken,小说fiction,流行杂志magazine,报纸newspaper和学术期刊academic 还有COCA分类中没有的两类non-academic, miscellaneous second edition BNC World (2001) third edition BNC XML Edition (2007) extracts from regional and national newspapers, specialist periodicals and journals for all ages and interests, academic books and popular fiction, published and unpublished letters and memoranda, school and university essays, among many other kinds of text 通常可进入的那个链接是BYU, 美国杨百翰大学提供的 BYU大学在2012年对语料库经行了重新附码,用的CLAWS 7 3. COCA: the corpus of contemporary American English Brigham Young University 美国犹他州杨百翰大学 Doctor Mark Davies 3.6亿,1990-2007年间,美国国内各种语料 口语spoken,小说fiction,流行杂志magazine,报纸newspaper和学术期刊academic共五类语料来源 且持续更新中,每年以2000万词递增,目前到1990-2012,共4.5亿词 Display:显示方式,compare选项可以用来比较两个词的搭配区别,排列方式选择relevance 相关度 标记了语料的时间,便于研究语言历时与共时的变化 教学中相关用法 查找同义词,如[=scold].[V*]表示查找所有scold的同义词

GDAL开发文档

GDAL开发文档 这里列出所有相关的页面: ?GDAL数据模型 ?GDAL驱动实现向导 ?GDAL API入门 ?OGR API 使用向导 翻译:柴树杉(chaishushan@https://www.doczj.com/doc/709078743.html,) 出处:opencv-extension-library GDAL数据模型 翻译:柴树杉(chaishushan@https://www.doczj.com/doc/709078743.html,) 原文:https://www.doczj.com/doc/709078743.html,/gdal_datamodel.html 该文档简要描述了GDAL的数据模型,该模型可以容纳其他各种信息。 数据集(Dataset) 一个dataset(对应GDALDataset类)是一个光栅数据以及和它有关系的信息的集合。特别地dataset包含了光栅数据的大小(像素、线等)。dataset同时也为对应的光栅数据指定了坐标系统。dataset本身还可以包含元数据,它们以一种键/值对的方式来组织。 GDAL的数据集是基于OpenGIS Grid Coverages的格式定义的。 坐标系统 Dataset的坐标系统由OpenGIS WKT字符串定义,它包含了: ?一个全局的坐标系名称。 ?一个地理坐标系名称。 ?一个基准标识符。 ?椭球体的名字。长半轴(semi-major axis)和反扁率(inverse flattening)。 ?初子午线(prime meridian)名和其与格林威治子午线的偏移值。 ?投影方法类型(如横轴莫卡托)。 ?投影参数列表(如中央经线等)。 ?一个单位的名称和其到米和弧度单位的转换参数。 ?轴线的名称和顺序。 ?在预定义的权威坐标系中的编码(如EPSG)。

更多信息请参考OpenGIS WKT坐标系统定义,以及osr教程文档和OGRSpatialReference类的描述文档。 在GDAL中,返回坐标系统的函数是GDALDataset::GetProjectionRef()。它返回的坐标系统描述了地理参考坐标,暗含着仿射地理参考转换,这地理参考转换是由GDALDataset::GetGeoTransform()来返回。由GCPs地理参考坐标描述的坐标系统是由GDALDataset::GetGCPProjection()返回的。 注意,返回的坐标系统字符串“”表示未知的地理参考坐标系统。 仿射地理变换 GDAL数据集有两种方式描述栅格位置(用点/线坐标系)以及地理参考坐标系之间的关系。第一种也是比较常用的是使用仿射转换,另一种则是GCPs。 仿射变换由6个参数构成,它们由GDALDataset::GetGeoTransform()返回它们把点/线坐标,用下面的关系转将点/线影射到地理坐标: Xgeo = GT(0) + Xpixel*GT(1) + Yline*GT(2) Ygeo = GT(3) + Xpixel*GT(4) + Yline*GT(5) 假设影像上面为北方,GT2和GT4参数为0,而GT1是象元宽,GT5是象元高,(GT0,GT3)点位置是影像的左上角。 注意,上面所说的点/线坐标系是从左上角(0,0)点到右下角,也就是坐标轴从左到右增长,从上到下增长的坐标系(即影象的行列从左下角开始计算)。点/线位置中心是(0.5,0.5)。 GCPs 数据集可以由一系列控制点来定义空间参考坐标系。所有的GCPs共用一个地理参考坐标系,由GDALDataset::GetGCPProjection()返回。每个GCP(对应GDAL_GCP 类)包含下面内容: typedef struct { char *pszId; char *pszInfo; double dfGCPPixel; double dfGCPLine; double dfGCPX; double dfGCPY; double dfGCPZ; } GDAL_GCP;

遥感图像几何精校正实验报告

遥感图像几何精校正 实验名称:遥感图像的几何精校正。 实验目的:1.了解和熟悉envi软件的几何校正的原理 2.熟悉和掌握envi软件的几何校正的功能和使用方法; 3.对自己的图像先找到投影,再另存一幅图像,去掉投影,在其它软件中旋转一 角度,用原先的图像作为参考对旋转后的图像进行几何校正,使得其比较精确。实验原理:几何校正,主要方法是采用多项式法,机理是通过若干控制点,建立不同图像间的多项式控件变换和像元插值运算,实现遥感图像与实际地理图件间的配准,达 到消减以及消除遥感图像的几何畸变。 多项式几何校正激励实现的两大步: 1. 图像坐标的空间变换: 有几何畸变的遥感图像与没有几何畸变的遥感图像,其对应的像元的坐标是不一 样的,如下图1右边为无几何畸变的图像像元分布图,像元是均匀且不等距的分 布。为了在有几何畸变的图像上获取无几何畸变的像元坐标,需要进行两图像坐 标系统的空间装换。 图1:图像几何校正示意图 在数学方法上,对于不同二维笛卡儿坐标系统间的空间转换,通常采用的是二元 n次多项式,表达式如下: 其中x, y为变换前图像坐标, u, v为变换后图像坐标, aij , bij为多项式系数, n = 1, 2, 3, ?。 二元n次多项式将不同坐标系统下的对应点坐标联系起来, ( x, y )和( u, v )分别应 不同坐标系统中的像元坐标。这是一种多项式数字模拟坐标变换的方法,一旦有 了该多项式,就可以从一个坐标系统推算出另一个坐标系统中的对应点坐标。 如何获取和建立二元n次多项式,即二元n次多项式系数中a和b的求解,是几何 校正成败的关键。数学上有一套完善的计算方法,核心是通过已知若干存在于不 同图像上的同名点坐标,建立求解n次多项式系数的方程组,采用最小二乘法,得出 二元n次多项式系数。 不同的二元n次多项式,反映了几何畸变的遥感图像与无几何畸变的遥感图像间的 像元坐标的对应关系, 其中哪种多项式是最佳的空间变换模拟式,能达到图像间 坐标的完全配准,是需要考虑和分析的。 在二元n次多项式数字模拟中,从提高几何校正精度的角度考虑,需要兼顾的因素

GDAL使用方法VC+C#

GDAL栅格图像操作 GDAL是一个操作各种栅格和矢量(由ogr这个库实现)地理数据格式的开源库。包括读取、写入、转换、处理各种栅格和矢量数据格式(有些特定的格式对一些操作如写入等不支持)。 即使不是进行地理遥感方面的应用研究,GDAL也是一个非常有用的库,因为它可以支持大量我们常见的图像数据,比如jpg,gif之类的。完整的格式清单可以到此链接查看 https://www.doczj.com/doc/709078743.html,/formats_list.html。而且已经有包括GoogleEarth在内的很多软件都是在使用GDAL作为后台库。 本文就以VC为开发平台介绍GDAL对栅格数据的操作方法。 Include目录是开发中需要的头文件,lib中是所需要的lib文件,在VC8中应当将其存放目录添加到目录列表中,选择菜单的“工具-选项-项目和解决方案-VC++目录”,分别在“包含文件”和“库文件”中将此两个目录添加进去。 在项目的属性页中,选择“配置属性-链接器-输入”,在“附加依赖项”中添加gdal_i-vc8.lib和 gdal_id-vc8.lib两个使用GDAL中需要的静态库文件,或者在程序中添加以下两行代码也可以。 #pragma comment(lib, "gdal_i-vc8.lib") #pragma comment(lib, "gdal_id-vc8.lib") Bin目录下的动态链接库文件应当放置于程序能够访问的位置,比如windows\system32中。 此外,在程序中需要引入的头文件是gdal_priv.h。 现在开始用C++来对图像文件进行操作。 在打开文件之前需要首先注册所需要的驱动程序,一般来说我们可以默认注册所有支持的格式驱动,所使用的函数是GDALAllRegister()。然后就是打开文件操作。 这里要说一个数据集的概念,也就是所谓的Dataset。在GDAL中可以说数据的核心就是Dataset,简单来说可以将Dataset就理解为图像文件,比如说一个jpeg格式的文件就是一个数据集,当然其他一些文件格式可能在一个数据集中包含多于一个文件,比如可能除了图像数据文件外还可能会有一些附加信息文件等。 在数据集下最重要组成部分就是所谓的波段band,波段可多可少,比如一个RGB真彩色的图像就有3个波段,分别代表红色绿色和蓝色波段,如果是灰度图,那可能就只有一个波段,而很多遥感图像可能就会多于3个波段。 除了波段外,数据集中还含有图像相关的坐标系投影信息,元数据信息等数据。 文件的打开使用的是GDALOpen ( const char * pszFilename, GDALAccess eAccess ),pszFilename是文件路径,eAccess 是访问权限,可以是GA_ReadOnly只读,也可以是GA_Update 来对文件进行修改。比如我们以只读模式打开一个tif文件: GDALDataset *poDataset; //数据集对象指针 GDALAllRegister();//注册驱动 poDataset = (GDALDataset *) GDALOpen( "c:\\terra335h_EV_250_Aggr500_RefSB_b0.tif", GA_ReadOnly ); if( poDataset != NULL /*检查是否正常打开文件*/) { //do something } delete poDataset; //释放资源

中国语料库研究的历史与现状

中国语料库研究的历史与现状 语言学的研究必须以语言事实作为根据,必须详尽地、大量地占有材料,才有可能在理论上得出比较可靠的结论。传统的语言材料的搜集、整理和加工完全是靠手工进行的,这是一种枯燥无味、费力费时的工作。计算机出现后,人们可以把这些工作交给计算机去作,大大地减轻了人们的劳动。后来,在这种工作中逐渐创造了一整套完整的理论和方法,形成了一门新的学科——语料库语言学(corpus linguistics),并成为了自然语言处理的一 个分支学科。 语料库语言学主要研究机器可读自然语言文本的采集、存储、检索、统计、语法标注、句法语义分析,以及具有上述功能的语料库在语言定量分析、词典编纂、作品风格分析、自然语言理解和机器翻译等领域中的应用。多年来,机器翻译和自然语言理解的研究中, 分 析语言的主要方法是句法语义分析。因此,在很长一段时间内,许多系统都是基于规则的,而根据当前计算机的理论和技术的水平很难把语言学的各种事实和理解语言所需的广泛的背景知识用规则的形式充分地表达出来,这样,这些基于规则的机器翻译和自然语言理解系统只能在极其受限的某些子语言(sub- language)中获得一定的成功。为了摆脱困境,自然语言处理的研究者者们开始对大规模的非受限的自然语言进行调查和统计,以便采用一种基于统计的模型来处理大量的非受限语言。不言而喻,语料库语言学将有可能在大量语言材料的基础上来检验传统的理论语言学基于手工搜集材料的方法所得出的各种结论,从而使我们对于自然语言的各种复杂现象获得更为深刻全面的认识。 本文首先简要介绍国外语料库的发展情况,然后,比较详细地介绍中国语料库的发展情况和主要的成绩,使我们对于语料库研究得到一个鸟瞰式的认识。 一、国外语料库概况 现在,美国Brown大学建立了BROWN语料库(布朗语料库),英国Lancaster大学与 挪威Oslo大学与Bergen大学联合建立了 LOB 语料库。欧美各国学者利用这两个语料库 开展了大规模的研究,其中最引人注目的是对语料库进行语法标注的研究。他们设计了基于规则的自动标注系统 TAGGIT 来给布朗语料库的 100 万词的语料作自动标注,正确率为77%. 他们还设计了 CLAWS 系统来给 LOB 语料库的100万词的语料作自动标注,根据统 计信息来建立算法,自动标注正确率达 96%, 比基于规则的 TAGGIT 系统提高了将近 20%. 最近他们同时考察三个相邻标记的同现频率,使自动语法标注的正确率达到 99.5%。这个指标已经超过了人工标注所能达到的最高正确率。

GDAL API入门

GDAL API入门 打开文件 在打开GDAL所支持的光栅数据之前需要注册驱动。这里的驱动是针对GDAL支持的所有数据格式。通常可以通过调用GDALAllRegister()函数来注册所有已知的驱动,同时也包含那些用GDALDriverManager::AutoLoadDrivers()从.so文件中自动装载驱动。如果程序需要对某些驱动做限制,可以参考gdalallregister.cpp代码。 当驱动被注册之后,我们就可以用GDALOpen()函数来打开一个数据集。打开的方式可以是GA_ReadOnly或者GA_Update。 In C++: #include "gdal_priv.h" int main() { GDALDataset *poDataset; GDALAllRegister(); poDataset = (GDALDataset *) GDALOpen( pszFilename, GA_ReadOnly ); if( poDataset == NULL ) { ...; } In C: #include "gdal.h" int main() { GDALDatasetH hDataset; GDALAllRegister(); hDataset = GDALOpen( pszFilename, GA_ReadOnly ); if( hDataset == NULL ) { ...; } 如果GDALOpen()函数返回NULL则表示打开失败,同时CPLError()函数产生相应的错误信息。如果您需要对错误进行处理可以参考CPLError()相关文档。通常情况下,所有的GDAL函数都通过CPLError()报告错误。另外需要注意的是pszFilename并不一定对应一个实际的文件名(当然也可以就是一个文件名)。它的具体解释由相应的驱动程序负责。它可能是一个URL,或者是文件名以后后面带有许多用于控制打开 方式的参数。通常建议,不要在打开文件的选择对话框中对文件的类型做太多的限制。 获取Dataset信息 如果GDAL数据模型一节所描述的,一个GDALDataset包含了光栅数据的一系列的波段信息。同时它还包含元数据、一个坐标系统、投影类型、光栅的大小以及其他许多信息。

GDAL库学习笔记

ZION GDAL库学习笔记 作者:lilin 文章来源:https://www.doczj.com/doc/709078743.html,/ 如果您发现我写的东西中有问题,或者您对我写的东西有意见,请一定要发邮件跟我讲,Email( linux_23@https://www.doczj.com/doc/709078743.html, )

GDAL库学习笔记(一): GDAL库介绍 1. 介绍 可能你不玩GIS,不懂这个库到底有什么用,或者和python有什么关系。但是你要玩GIS,RS,你就应当知道这个库的价值。就算你不玩GIS,我想这个库对你也应该有致命的吸引力。为什么?看下面的介绍吧! 先看看这段GDAL主页上的英文介绍吧! is a translator library for raster geospatial data formats that is released under anX/MITstyleOpen Sourcelicense by theOpen Source Geospatial Foundation. As a library, it presents asingle abstract data modelto the calling application for all supported formats. It also comes with a variety of usefulcommandline utilitiesfor data translation and processing. 简单地说,GDAL是一个操作各种栅格地理数据格式的库。包括读取、写入、转换、处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持)。它使用了一个单一的抽象数据模型就支持了大多数的栅格数据(GIS对栅格,矢量,3D数据模型的抽象能力实在令人叹服)。当然除了栅格操作,这个库还同时包括了操作矢量数据的另一个有名的库ogr (ogr这个库另外介绍),这样这个库就同时具备了操作栅格和矢量数据的能力,买一送一,这么合算的买卖为什么不做。最最最重要的是这个库是跨平台的,开源的!如今这个库对各种数据格式的支持强大到令人啧啧的地步了。如果你对他的强大有什么怀疑的话,看看这里一大串的GDAL所支持格式清单,吓到了吧!再看看它的主页最后那些使用了它作为底层数据处理的软件列表吧!其中你可以不知道GRASS,你也可以不知道Quantum GIS (QGIS),但是你总该知道Google Earth吧!不知道?赶快下一个去玩玩--会当临绝顶,一览众山小! 有人说我又不玩GIS。不错,但是,你即使不玩GIS,这个库也是满有用的。首先,哪个库支持这么多栅格(图片)格式,哪个库在C/C++/python/ruby/VB/java/C#(这个暂时不完全支持)下都能用,而且都一样用?退一步讲,3S软件又不一定要用在3S下(很多医学影像就是用PCI软件来处理的)。再退一步,你的生活即使和3S一点关系都没有,栅格数据又不单单只有GIS下才用到。你大可用这个库来读取jpg,gif,tif,xpm 等格式。而且对各种格式支持得不是一般的好,很大一部分非标准格式照样支持得非常好。我曾经在java 下玩过jai,以及一系列jai的扩展库,一些图像格式在很多图片浏览器中都可以正确读取(有的甚至不是非标准格式),用jai死活就读不出来! 这个库的python版和其他的python库结合的很好。最直接、明显的支持是使用Numeric库来进行数据读取和操作。各种矩阵魔术可以发挥得淋漓尽致(图像其实就是矩阵)。而且按我的观点,python对矩阵的操作比其他的语言有明显的优势。写出来的东西比其他语言写出来的短小的多,而且好看得多。并且python 的弱类型在处理栅格数据格式类型的时候代码量比强类型的语言少了数倍(不用double,byte,short等等分开处理,这简直就是先天上的优势)。所以我就喜欢用python做图像的处理。所以就连GIS界的微软ESRI 也直接在ARCGIS9中用python来作栅格数据的导入导出。一句话,真是太方便啦! 2. 安装 2.1. windows下的安装 官方安装文档在这里。下面是我自己的实践步骤: 先去https://www.doczj.com/doc/709078743.html,/dl/下一个版本,解压。 打开控制台,输入: “D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat" 注册vc的编译环境。 打 开gdal文件夹下的nmake.opt修改GDAL_HOME = "C:\warmerda\bld"把路径改到需要把gdal安装的

GDAL_CSharp环境配置

一、GDAL C# DLL下载 https://www.doczj.com/doc/709078743.html,/sdk/ https://www.doczj.com/doc/709078743.html,/sdk/PackageList.aspx?file=release-1400-gdal-1-10-1-mapserver-6-4-1.zip 位于压缩包中的位置:bin\gdal\csharp\...目录下: 开发时把以_csharp.dll结尾的添加到项目引用,其余的拷贝到bebug目录下。 二、在调用Gdal.AllRegister()方法时报异常:“OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常。 原因分析:gdal初始化时,其依赖dll项不全导致异常,可采用Dependency Walker工具查看相关依赖项。把九个DLL拷贝到debug是不能解决问题的。 解决方法: 采用SharpMap的GDAL初始化方法,需要两个数据: 1.GdalConfiguration.cs 2.gdal_data_config.rar 第一步:将GdalConfiguration.cs添加到项目中,然后解压gdal_data_config.rar到debug目录下,文件夹名称为gdal。 第二步:在使用Gdal.AllRegister()初始化前,调用以下两句代码进行相关初始化数据的配置即可。SharpMap.GdalConfiguration.ConfigureGdal(); SharpMap.GdalConfiguration.ConfigureOgr();

附件1:GdalConfiguration.cs /****************************************************************************** * * Name: GdalConfiguration.cs.pp * Project: GDAL CSharp Interface * Purpose: A static configuration utility class to enable GDAL/OGR. * Author: Felix Obermaier * *****************************************************************************/ using System; using System.IO; using System.Reflection; using Gdal = OSGeo.GDAL.Gdal; using Ogr = OSGeo.OGR.Ogr; namespace SharpMap { public static partial class GdalConfiguration { private static bool _configuredOgr; private static bool _configuredGdal; ///

/// Function to determine which platform we're on /// private static string GetPlatform() { return IntPtr.Size == 4 ? "x86" : "x64"; } /// /// Construction of Gdal/Ogr /// static GdalConfiguration() { var executingAssemblyFile = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase).LocalPath; var executingDirectory = Path.GetDirectoryName(executingAssemblyFile); if (string.IsNullOrEmpty(executingDirectory)) throw new InvalidOperationException("cannot get executing directory"); var gdalPath = https://www.doczj.com/doc/709078743.html,bine(executingDirectory, "gdal"); var nativePath = https://www.doczj.com/doc/709078743.html,bine(gdalPath, GetPlatform()); // Prepend native path to environment path, to ensure the // right libs are being used. var path = Environment.GetEnvironmentVariable("PATH"); path = nativePath + ";" + https://www.doczj.com/doc/709078743.html,bine(nativePath, "plugins") + ";" + path; Environment.SetEnvironmentVariable("PATH", path); // Set the additional GDAL environment variables. var gdalData = https://www.doczj.com/doc/709078743.html,bine(gdalPath, "data"); Environment.SetEnvironmentVariable("GDAL_DATA", gdalData); Gdal.SetConfigOption("GDAL_DATA", gdalData); var driverPath = https://www.doczj.com/doc/709078743.html,bine(nativePath, "plugins"); Environment.SetEnvironmentVariable("GDAL_DRIVER_PATH", driverPath); Gdal.SetConfigOption("GDAL_DRIVER_PATH", driverPath); Environment.SetEnvironmentVariable("GEOTIFF_CSV", gdalData); Gdal.SetConfigOption("GEOTIFF_CSV", gdalData);

相关主题
文本预览
相关文档 最新文档