1.2.2 矢量数据、栅格数据与网格数据
地理要素经过抽象才能存储在计算机中,按照存储数据结构的不同,其可分为矢量数据和栅格数据两类(见图1-2)。
图1-2 矢量数据结构和栅格数据结构
• 矢量数据利用记录地理要素坐标(也可包括拓扑关系)的方式进行存储,并将属性信息放置在单独的属性表中,属性表中的每条记录都与地理要素一一对应,具有定位明显、属性隐含的特点。
• 栅格数据将一个空间划分成一系列规律分布的格网,并用每个格网的数值表达属性信息,这些格网构成的数据阵列通过参数设置的方式将其放置或拟合在特定的坐标系中,具有属性明显、定位隐含的特点。
相对来说,矢量数据的空间位置精度比较高,并且输出的地图一般比较容易且细腻,但是由于矢量数据的录入与管理比较复杂,有时需要维护其拓扑信息,因此往往给数据管理和空间分析带来一些麻烦。栅格数据一般在空间分析操作上较简单,并且不需要维护其拓扑关系,但是常常占据较大的存储空间,而且空间位置精度较低。
网格数据(Mesh Data)是指在二维空间或三维空间中,通过顶点(Vertices)、边(Edges)与面(Faces)等方式记录多维数据,是矢量数据和栅格数据的补充形式,多用于存储气候气象数据、水文数据、洋流数据等。
1. 矢量数据
矢量数据通常用点、线、多边形等基本几何对象描述地理要素。几何对象可以通过WKT和WKB两种方式进行描述。
1)WKT
WKT采用文本的方式存储几何对象,主要包括类型声明部分和数据部分。其中,类型声明部分采用英文文本进行声明,数据部分放置在类型声明部分的后面,并用小括号括起来。对于具有多个节点的几何对象(如线、多边形等),同一个节点内的数据用空格隔开,不同节点之间的数据用逗号隔开,例如,一个坐标为(20,15)的点对象的声明方式如下:
“Point”表示该几何对象的类型为点对象,小括号中的第一个数字表示X坐标,第二个数字表示Y坐标。
包含Z值和M值的点需要在“Point”之后通过字母“Z”与“M”进行声明,并将Z值和M值加入小括号中,例如:
“Point Z”中的“10”表示Z值,“Point M”中的“8”表示M值,“Point ZM”中的“10”和“8”分别表示Z值和M值。
【小提示】任何一个几何对象的任何一个节点都可以包括Z值和M值,Z值通常表示高程信息,将几何对象推向三维;M值通常表示其他属性信息,如温度、湿度等,将几何对象推向第四个维度。
利用WKT表达一个具有四个节点的线,其节点坐标分别为(10,10),(20,20),(30,30)和(40,40):
利用WKT表达一个具有四个节点的多边形,其节点坐标分别为(10,10),(10,20),(20,20)和(20,15):
注意,最后一个节点和第一个节点相同,以闭合图形。
在上述WKT代码中,“Polygon”后面由两个小括号组成,第一层小括号标识数据为“Polygon”数据;第二层小括号标识一个环(Ring),包括内环(Inner Ring)和外环(Outer Ring)两类。一个多边形至少包括一个外环。利用内环可以将一个多边形“挖出”中空的部分;利用多个外环可以将一个多边形分为多个部分,表达“飞地”的地理要素概念。
例如,当需要一个多边形表达两个岛屿组成一个地理要素单位,并且其中一个岛屿具有中空的“水体”时,可以利用两个外环和一个内环组成一个多边形,如图1-3所示。
图1-3 由两个外环和一个内环组成的多边形
另外,利用几何对象集合(GeometryCollection)可以将多个不同类型的几何对象组合为一个几何对象。例如,将一个坐标为(10,10)的点和由两个节点组成的线组合为一个几何对象,WKT代码如下:
2)WKB
WKB采用二进制方式存储几何对象信息,包括字节序、几何类型和坐标三部分。• 字节序部分:可以为0(大端字节序,Big-Indian)或1(小端字节序,Little-Indian),占一个字节。
• 几何类型部分:用4个字节的编码表示一个几何类型,几何类型和编码的对应关系如表1-2所示。
• 坐标部分:一个坐标(X坐标、Y坐标、Z值、M值)用一个双浮点类型(Double)空间存储,占8个字节。
表1-2 WKB几何类型和编码的对应关系
例如,采用WKB方式表示一个坐标为(20,15)的点的十六进制:
这个点对象共占据21个字节,第1个字节表示大端字节序;第2~5个字节“00 00 00 01”表示几何类型为点;第6~13个字节“40 34 00 00 00 00 00 00”表示X坐标20,第14~21个字节“40 2E 00 00 00 00 00 00”表示Y坐标15。
可见,采用WKT方式描述几何图形更直观,但是由于WKT字符串需要被解释器解释后才能被计算机处理,所以读取速度相对较慢;采用WKB方式描述几何图形更适合计算机读取,但是失去了直观性。
2. 栅格数据
栅格数据采用某种数据类型的数值阵列存储数据,阵列中的每个数值称为一个像元(Pixel)。由于数据阵列本身不存在空间信息,因此需要元数据进行界定。栅格数据的元数据包括空间坐标系、数据类型等。
在ENVI DAT栅格数据格式中,后缀名为“hdr”的头文件存储了完整的元数据信息。此处以某ENVI DAT格式数据的“hdr”文件为例,介绍常用的元数据信息:
1)数据类型与行列数波段数
数据类型是指一个栅格像元中数值的数据类型(Data Type)。GDAL规定了12种栅格数据类型,可以覆盖绝大多数的栅格数据(见表1-3)。
表1-3 常用的栅格数据类型及其GDAL定义
栅格数据的行列数是指栅格像元阵列的行列数。注意,栅格数据行列号的定义是从左上角开始的(栅格空间),因此第一行位于栅格像元阵列的最上方,第一列位于栅格像元阵列的最左方,这与坐标系的方向定义(坐标空间)不同(见图1-4)。
图1-4 栅格空间行列号的定义与坐标空间的方向定义
2)坐标参考系
坐标参考系(Coordinate Reference System,CRS)界定了栅格数据所处的投影坐标系或地理坐标系。
3)参考坐标与像元大小
GeoTiff、PNG等格式的栅格数据常常存在一个单独的世界文件(World File),它通过六个参数界定栅格影像的行列号与实际地理坐标的仿射关系,通常称为栅格数据的“六参数”。
世界文件的名称通常与栅格数据文件的名称相同,但其后缀名是在栅格数据文件的后缀名后加上字母“w”,如“jpgw”、“tifw”、“tiffw”和“pngw”等。
但是,有时为了保证文件扩展名为三个字符,也可以把世界文件扩展名中间的字母去掉,如“jgw”、“tfw”和“pgw”等。
另外,世界文件的扩展名也可以设置为“wld”。
【小提示】世界文件并不是必需的,因为这些参数还可以保存在栅格数据的元数据文件(如ENVI DAT格式数据的“hdr”文件)中,也可以保存在数据本身(如GeoTiff文件的内部标签)中。
世界文件一共有六行数值,每行数值代表一个参数,各定义如下:
• 第一行(A):栅格数据中一个像元的宽在x轴方向的大小,使用地图坐标单位。
• 第二行(D):栅格数据中一个像元的宽在y轴方向的大小,使用地图坐标单位。
• 第三行(B):栅格数据中一个像元的高在x轴方向的大小,使用地图坐标单位。
• 第四行(E):栅格数据中一个像元的高在y轴方向的大小,使用地图坐标单位。由于栅格空间和坐标空间在纵向方向的相反关系,该参数通常为负值。
• 第五行(C):栅格数据左上角像元中心点的x坐标,使用地图坐标单位。
• 第六行(F):栅格数据左上角像元中心点的y坐标,使用地图坐标单位。
地图坐标与行列号的仿射关系为:
x=A×col+B×row+C
y=D×col+E×row+F
其中,x和y分别表示X坐标和Y坐标;col和row分别表示列号和行号。
4)坐标范围
栅格数据的坐标范围(Extent)通常由X坐标最小值(xmin)、X坐标最大值(xmax)、Y坐标最小值(ymin)、Y坐标最大值(ymax)组成,它们通常被称为栅格数据的“四至范围”。
5)栅格数据的存储格式
栅格数据的存储格式包括波段顺序格式、波段按行交叉、波段按像元交叉等类型。
(1)波段顺序格式(Band Sequential Format,BSQ)采用按波段存储的方式,先存储一个波段中的数据,然后存储另一个波段中的数据,直到全部数据存储完毕。
(2)波段按行交叉(Band Interleaved by Line Format,BIL)采用按行存储的方式,先存储第一行的第一波段数据,然后存储第一行的第二波段数据,直到第一行的数据全部存储完毕;然后按照上述方式存储其他行数据,直到全部数据存储完毕。
(3)波段按像元交叉(Band Interleaved by Pixel Format,BIP)采用按像元存储的方式,先存储第一个像元全部波段的数据,然后存储其他像元全部波段的数据,直到全部像元存储完毕。
上述三种存储格式的读取性能存在差异,BSQ适合单个波段中部分区域数据的存储,BIP适合对某个像元的波谱信息进行存取,BIL则是BSQ和BIP的折中方式。当栅格数据只包括一个波段时,BSQ、BIL和BIP的存储没有区别。
3. 网格数据
作为矢量数据和栅格数据的补充,网格数据兼顾了两者的优势:既可以像矢量数据一样在顶点上存储数据(Defined on Vertices),也可以像栅格数据一样在面上存储数据(Defined on Face)。网格数据既可以像矢量数据一样以不规则的多边形描述数据的定位信息,也可以像栅格数据一样以规则的网格描述数据的定位信息,如图1-5所示。
图1-5 网格数据的网格类型
网格数据存储大量信息的同时占据较少的磁盘空间,例如,存储高程信息的TIN数据通常比栅格存储方式的数据要小很多,并保持较高的精度。网格数据具有特定的应用方向,主要包括:
(1)存储具有空间自相关(满足地理学第一定律)的数据。
(2)存储长时序(包含多个时刻)的数据。
(3)存储具有矢量(方向)的数据,如风向、流向等。
因此,网格数据多应用在气象、水文等领域。
在QGIS中,网格数据的读取依赖网格数据抽象库(Mesh Data Abstraction Library,MDAL)。与GDAL类似,MDAL采用C++语言编写,并通过MIT协议发布。MDAL起源于QGIS 2中的Crayfish插件,目前主要应用在QGIS软件中,并为MDAL提供大量反馈信息。自QGIS 3.2以来就逐渐集成了MDAL,并在QGIS 3.4逐渐稳定成熟。MDAL支持2DM、NetCDF、GRIB等多种网格数据格式,其支持的全部数据类型可以在https://www.mdal.xyz/网站中查询。
【小提示】在QGIS 3.10中,MDAL仅支持1D和2D网格数据;在QGIS 3.12中,MDAL开始支持3D网格数据。