第四节 栅格数据结构

一、简单栅格数据结构

1.栅格数据结构的概念

栅格结构是最简单最直观的空间数据结构,又称为网格结构(Raster或Grid Cell)或象元结构(Pixel),是指将地球表面划分为大小均匀紧密相邻的网格阵列,每个网格作为一个象元或象素,由行、列号定义,并包含一个代码,表示该象素的属性类型或量值,或仅仅包含指向其属性记录的指针。因此,栅格结构是以规则的阵列来表示空间地物或现象分布的数据组织,组织中的每个数据表示地物或现象的非几何属性特征。如图2-13所示,在栅格结构中,点用一个栅格单元表示;线状地物则用沿线走向的一组相邻栅格单元表示,每个栅格单元最多只有两个相邻单元在线上;面或区域用记有区域属性的相邻栅格

图2-13 点、线、面数据的矢量与栅格表示

单元的集合表示,每个栅格单元可有多于两个的相邻单元同属一个区域。任何以面状分布的对象(土地利用、土壤类型、地势起伏、环境污染等),都可以用栅格数据逼近。遥感影像就属于典型的栅格结构,每个象元的数字表示影像的灰度等级。矢量数据与栅格数据表示见图2-14。

图2-14 矢量数据与栅格数据表示

(a)矢量结构;(b)栅格结构

2.栅格数据结构的特点

栅格结构的显著特点是:属性明显,定位隐含,即数据直接记录属性的指针或属性本身,而所在位置则根据行列号转换为相应的坐标给出,也就是说定位是根据数据在数据集中的位置得到的。由于栅格结构是按一定的规则排列的,所表示的实体的位置很容易隐含在网格文件的存贮结构中,在后面讲述栅格结构编码时可以看到,每个存贮单元的行列位置可以方便地根据其在文件中的记录位置得到,且行列坐标可以很容易地转为其他坐标系下的坐标。在网格文件中每个代码本身明确地代表了实体的属性或属性的编码,如果为属性的编码,则该编码可作为指向实体属性表的指针。由于栅格行列阵列容易为计算机存储、操作和显示,因此这种结构容易实现,算法简单,且易于扩充、修改,也很直观,特别是易于同遥感影像结合处理,给地理空间数据处理带来了极大的方便,受到普遍欢迎,许多系统都部分和全部采取了栅格结构。栅格结构的另一个优点是,特别适合于FORTRAN、BASIC等高级语言作文件或矩阵处理,这也是栅格结构易于为多数GIS设计者接受的原因之一。

3.栅格数据的获取途径

栅格结构数据主要可由四个途径得到,即

(1)目读法。在专题图上均匀划分网格,逐个网格地决定其代码,最后形成栅格数字地图文件。

(2)矢量数字化。数字化仪手扶或自动跟踪数字化地图,得到矢量结构数据后,再转换为栅格结构。

(3)扫描数字化。逐点扫描专题地图,将扫描数据重采样和再编码得到栅格数据文件。

(4)分类影像输入。将经过分类解译的遥感影像数据直接或重采样后输入系统,作为栅格数据结构的专题地图。

在转换和重采样时,需尽可能保持原图或原始数据精度,通常有两种办法:

第一,在决定栅格代码时尽可能保持地表的真实性,保证最大的信息容量,如图2-15所示为一块举行的地表区域,其内部含有ABC 三种地物类型,O点位于中心,将这个矩形区域近似地表示为栅格结构的一个栅格单元时,可根据需要,采取如下方案之一决定该栅格单元的代码。

(1)中心点法。是将栅格中心点的值作为本栅格元素的值,既用处于栅格中心处的地物类型或现象特性决定栅格代码。如图2-15所示的矩形区域中,中心点O落在代码为C的地物范围内,按中心点法的规则,该矩形区域相应的栅格单元的代码应为C,中心点法常用于具有连续分布特性的地理要素,如降雨量分布、人口密度图等。

(2)面积占优法。是把栅格中占有最大面积的属性值定为本栅格元素的值。如图2-15所示,显示B类地物所占面积最大,故相应栅格代码定为B,面积占优法常用于分类较细、地物类别斑块较小的情况。

(3)百分比法。根据矩形区域内各地理要素所占面积的百分比数确定栅格单元的代码。如可记面积最大的两类AB,也可根据B类和A类所占面积百分比数在代码中加入数字。

(4)重要性法。往往突出某些主要属性,对于这些属性,只要在栅格中出现,不管所占比例大小,就把该属性作为本栅格元素的值,即根据栅格内不同地物的重要性,选取最重要的地物类型决定相应的栅格单元代码。在图2-15中,假设A类为重要的地物类型,即A类比B类和C类更为重要,则栅格单元的代码应为A。重要性法常用于具有特殊意义而面积较小的地理要素,特别是点、线状地理要素,如城镇、交通枢纽、交通线、河流水系等,在栅格中代码应尽量表示这些重要地物。

图2-15 栅格单元代码

第二,缩小单个栅格单元的面积,即增加栅格单元的总数,行列数也相应地增加。这样,每个栅格单元可代表更为精细的地面矩形单元,混合单元减少。混合类别和混合的面积都大大减小,可以大大提高量算的精度;接近真实的形态,表现更细小的地物类型。然而增加栅格个数、提高数据精度的同时也带来了一个严重的问题,那就是数据量的大幅度增加,数据冗余严重。为了解决这个难题,已发展了一系列栅格数据压缩编码方法,如游程长度编码、块码和四叉树码等。

二、栅格数据的编码方法

为减小栅格数据的存储量,主要有以下几种不同的数据结构和编码方法。

1.直接栅格编码

直接编码就是将栅格数据看作一个数据矩阵,逐行(或逐列)逐个记录代码,可以每行从左到右逐像元记录(图2-16和图2-17),也可奇数行从左到右而偶数行由右向左记录,为了特定的目的还可采用其他特殊的顺序。

图2-16 直接栅格编码一

图2-17 直接栅格编码二

2.链式编码(Chain Codes)

链式编码又称为弗里曼链码(Freeman,1961)或边界链码。链式编码主要是记录线状地物和面状地物的边界。它把线状地物和面状地物的边界表示为:由某一起始点开始并按某些基本方向确定的单位矢量链。基本方向可定义为:东=0,东南=1,南=2,西南=3,西=4,西北=5,北=6,东北=7等八个基本方向(图2-18)。

链式编码的前两个数字表示起点的行、列数,从第三个数字开始的每个数字表示单位矢量的方向,八个方向以0~7的整数代表。如图2-19所示的地物,其链式编码如表2-16所示。

图2-18 链式编码基本方向

图2-19 链式编码示意图

表2-16 链式编码

链式编码对线状和多边形的表示具有很强的数据压缩能力,且具有一定的运算功能,如面积和周长计算等,探测边界急弯和凹进部分等都比较容易,类似矢量数据结构,比较适于存储图形数据。缺点是对叠置运算如组合、相交等则很难实施,对局部修改将改变整体结构,效率较低,而且由于链码以每个区域为单位存储边界,相邻区域的边界则被重复存储而产生冗余。

3.游程长度编码(Run-length Codes)

游程长度编码是栅格数据压缩的重要编码方法,它的基本思路是:对于一幅栅格图像,常常有行(或列)方向上相邻的若干点具有相同的属性代码,因而可采取某种方法压缩那些重复的记录内容。其编码方案是,只在各行(或列)数据的代码发生变化时依次记录该代码以及相同代码重复的个数;或逐个记录各行(或列)代码发生变化的位置和相应代码,从而实现数据的压缩。

例如对图2-17所示的栅格数据,可按第一种方式沿行方向进行如下游程长度编码:(0,1),(2,2),(5,5);(2,5),(5,3);(2,4),(3,2),(5,2);(0,2),(2,1),(3,3),(5,2);(0,2),(3,4),(5,1),(3,1);(0,3),(3,5);(0,4),(3,4);(0,5),(3,3)。也可按第二种方式沿列方向进行如下编码:(1,0),(2,2),(4,0);(1,2),(4,0);(1,2),(5,3),(6,0);(1,5),(2,2),(4,3),(7,0);(1,5),(2,2),(3,3),(8,0);(1,5),(3,3);(1,5),(6,3);(1,5),(5,3)。

游程长度编码对图2-17只用了44个整数就可以表示,而如果用前述的直接编码却需要64个整数表示,可见游程长度编码压缩数据是十分有效又简便的。事实上,压缩比的大小是与图的复杂程度成反比的,在变化多的部分,游程数就多,变化少的部分游程数就少,图件越简单,压缩效率就越高。

游程长度编码在栅格加密时,数据量没有明显增加,压缩效率较高,且易于检索,叠加合并等操作,运算简单,适用于机器存储容量小,数据需大量压缩,而又要避免复杂的编码解码运算增加处理和操作时间的情况。

4.块状编码(Block Codes)

块码是游程长度编码扩展到二维的情况,采用方形区域作为记录单元,每个记录单元包括相邻的若干栅格,数据结构由初始位置(行、列号)和半径,再加上记录单元的代码组成。根据块状编码的原则,对图2-17所示图像可以具体编码如下:(1,1,1,0),(1,2,2,2),(1,4,1,5),(1,5,1,5),(1,6,2,5),(1,8,1,5);(2,1,1,2),(2,4,1,2),(2,5,1,2),(2,8,1,5);(3,3,1,2),(3,4,1,2),(3,5,2,3),(3,7,2,5);(4,1,2,0),(4,3,1,2),(4,4,1,3);(5,3,1,3),(5,4,2,3),(5,6,1,3),(5,7,1,5),(5,8,1,3);(6,1,3,0),(6,6,3,3);(7,4,1,0),(7,5,1,3);(8,4,1,0),(8,5,1,0)。其记录单元见图2-20。

一个多边形所包含的正方形越大,多边形的边界越简单,块状编码的效率就越好。块状编码对大而简单的多边形更为有效,而对那些碎部较多的复杂多边形效果并不好。块状编码在合并、插入、检查延伸性、计算面积等操作时有明显的优越性。然而对某些运算不适应,必须在转换成简单数据形式才能顺利进行。

图2-20 对图2-17进行块码编码的记录单元

5.四叉树编码(Quad-tree Codes)

四叉树结构的基本思想是将一幅栅格地图或图像等分为四部分。逐块检查其格网属性值(或灰度)。如果某个子区的所有格网值都具有相同的值。则这个子区就不再继续分割,否则还要把这个子区再分割成四个子区。这样依次地分割,直到每个子块都只含有相同的属性值或灰度为止。

也就是根据栅格数据二维空间分布的特点,将空间区域按照4个象限进行递归分割(2n×2 n,且n>1),直到子象限的数值单调为止,最后得到一棵四分叉的倒向树。四叉树分解,各子象限大小不完全一样,但都是同代码栅格单元组成的子块,其中最上面的一个结点叫做根结点,它对应于整个图形。不能再分的结点称为叶子结点,可能落在不同的层上,该结点代表子象限单一的代码,所有叶子结点所代表的方形区域覆盖了整个图形。从上到下、从左到右为叶子结点编号,最下面的一排数字表示各子区的代码。

为了保证四叉树分解能不断地进行下去,要求图形必须为2n×2n的栅格阵列。n 为极限分割次数,n+1是四叉树最大层数或最大高度(图2-21和图2-22)。

四叉树编码法有许多有趣的优点:①容易而有效地计算多边形的数量特征;②阵列各部分的分辨率是可变的,边界复杂部分四叉树较高即分级多,分辨率也高,而不需表示许多细节的部分则分级少,分辨率低,因而既可精确表示图形结构又可减少存贮量;③栅格到四叉树及四叉树到简单栅格结构的转换比其他压缩方法容易;④多边形中嵌套异类小多边形的表示较方便。

四叉树编码的最大缺点是转换的不定性,用同一形状和大小的多边形可能得出多种不同的四叉树结构,故不利于形状分析和模式识别。但因它允许多边形中嵌套多边形即所谓“洞”这种结构存在,使越来越多的GIS工作者都对四叉树结构很感兴趣。上述这些压缩数据的方法应视图形的复杂情况合理选用,同时应在系统中备有相应的程序。另外,用户的分析目的和分析方法也决定着压缩方法的选取。

图2-21 用四叉树表示一个多边形

图2-22 图2-21的树状结构

四叉树结构按其编码的方法不同又分为常规四叉树和线性四叉树。常规四叉树除了记录叶结点之外,还要记录中间结点。结点之间借助指针联系,每个结点需要用六个量表达:四个叶结点指针,一个父结点指针和一个结点的属性或灰度值。这些指针不仅增加了数据贮存量,而且增加了操作的复杂性。常规四叉树主要在数据索引和图幅索引等方面应用。

线性四叉树则只存贮最后叶结点的信息,包括叶结点的位置、深度和本结点的属性或灰度值。所谓深度是指处于四叉树的第几层上,由深度可推知子区的大小。

线性四叉树叶结点的编号需要遵循一定的规则,这种编号称为地址码,它隐含了叶结点的位置和深度信息。最常用的地址码是四进制或十进制的Morton码。

6.几种编码方法比较分析

几种编码方法比较分析见表2-17。

表2-17 几种编码方法比较分析

三、栅格数据与矢量数据比较分析

栅格数据与矢量数据是两种表示地理信息的方法,前者属性明显,位置隐含,而后者位置明显,属性隐含。它们都有自己独特的优势,都是有效地表示地理信息的方法。栅格数据结构和矢量数据结构的优缺点如下。

(一)栅格数据结构

1.优点

(1)结构简单。

(2)空间数据的叠置与组合十分方便。

(3)空间分析易于进行。

(4)数学模拟方便。

(5)技术开发费用低。

2.缺点

(1)图形数据量大。

(2)难以建立网络连接关系。

(3)地图输出不精美。

(二)矢量数据结构

1.优点

(1)结构严密,数据量小。

(2)能完整地描述拓扑关系。

(3)图形数据和属性数据的恢复、更新和综合都能实现。

(4)图形输出精确美观。

2.缺点

(1)结构复杂,处理技术也复杂。

(2)图形叠置与图形组合很困难。

(3)绘图费用高,尤其高质量绘图。

(4)数学模拟和空间分析困难。

由上述比较可知,栅格结构和矢量结构在表示地理信息方面是同等有效的,它们各具特色,互为补充,所以有些大型数据库既存储栅格结构数据,又存储矢量结构数据,根据需要来调用某种结构的数据,以获取最强的分析能力并提高效率。