栅格术语
地理配准(Georeferencing)
地理配准的栅格数据是指其像素被固定到spatial_ref_sys表中定义的地理参考系统的栅格。通常用spatial_ref_sys表中srid列记录的空间参考标识符来标识空间参考系统。只有指定了 SRID,才能转换到其他空间参考系统(SRS)。
“地理配准” 这一术语略带误导性,因为 SRID 不一定基于地球,也可以用于其他行星,或人工坐标系(如建筑平面图、虚拟游戏世界等)。每个像素代表参考系统中的 x 单位(像素宽度)和 y 单位(像素高度)。
与之相对,非地理配准的栅格意味着其像素与任何坐标系都没有关联。最常见的例子是用相机拍摄的家庭照片。但如果是在高空侦察机上拍摄敌方目标,不包含地理配准信息就会显得疏忽。
数据库外存储(Out-of-database / Out-of-db)
可以选择将栅格存储在数据库外部的文件中。若采用这种存储方式,PostGIS 会在数据库中记录指向该文件的指针,之后就可以像引用数据库内栅格一样引用数据库外栅格。PostGIS 会处理后台的文件读取和转换,且从不修改数据库外栅格,将其视为只读。
当有大量参考数据需要供其他程序访问时,数据库外存储是合理的选择。使用时需确保 postgres 服务账户能够访问文件路径并拥有读取权限。若数据库外栅格的某些方面发生变化(如路径、维度、地理配准、波段数量或波段类型等),则需要重新注册这些数据。
栅格瓦片(Raster tile)
栅格瓦片本质上和其他栅格一样,之所以将其与普通栅格区分,是为了表明它是通过将较大的栅格分割成一组较小的栅格而创建的,这些小栅格可通过各种栅格操作重新组合。分割栅格为瓦片的主要原因是提升速度和便于管理。
覆盖范围(Coverage)
覆盖范围仅与地理配准数据相关,指的是一片无重叠的空间区域,其中第 n 个波段在栅格列的每个栅格瓦片中代表相同的读数。在 PostGIS 栅格中,覆盖范围通常存储为一个栅格表,表中特定列的每个栅格都代表空间的一个瓦片。整体来看,表列中的所有栅格形成一个连续的地理空间。
此外,每个瓦片具有相同数量的波段,且第 n 个波段存储相同类型的信息。例如,可定义一个覆盖欧洲的网格,将其分割成瓦片,每个瓦片作为栅格存储,包含两个波段:一个代表温度,另一个代表海拔。这些栅格组合起来就形成了一个覆盖欧洲的巨大栅格,且瓦片之间无重叠。
虽然可以在同一表列中存储像素大小可变的栅格,但如果每行的像素大小不同,ST_Union等操作可能会失败。同一栅格瓦片中的某个波段与其他波段共享像素元数据,因此同一栅格列 / 行中的所有波段与其同组波段具有相同的维度和像素大小。
对齐一致(Same alignment)
两个栅格若具有相同的倾斜度、相同的像素比例(一个像素在空间坐标中代表的大小),且左上角空间坐标设置使得两者的像素能处于同一网格上,则称它们对齐一致。如果是地理配准的栅格,还必须共享相同的空间参考系统。
许多操作(如合并)要求栅格对齐一致。在创建覆盖范围表时,构成覆盖范围的所有瓦片也必须对齐一致。
地图代数(Map algebra)
地图代数是对一个或多个波段上的一组像素执行数学运算的术语。可以对任意数量的波段使用地图代数,但ST_MapAlgebra操作的结果都是单波段栅格。
地图代数可使用所有 PostgreSQL 数学运算。此外,PostGIS 允许使用 PostgreSQL 支持的任何过程语言(PL)定义自定义的地图代数函数。地图代数是 PostGIS 栅格中许多函数(如ST_Union、ST_Slope和ST_HillShade)的基础。
邻域(Neighborhood)
在地图代数中,邻域是指以特定像素为中心的连续矩形像素网格。邻域从中心像素向左右各延伸 n 个像素,向上下各延伸 m 个像素,因此包含 (2n + 1)×(2m + 1) 个像素(宽度和长度始终为奇数)。
有多个函数重载了ST_MapAlgebra这一名称。从 API 角度看,由于名称相同,它们可被视为具有多个可选参数的单个函数。邻域是一个可选参数,默认值为 0(表示地图代数操作仅作用于单个单元格),也可设置为中心像素左右 n 个像素、上下 m 个像素的范围。
重分类(Reclass)
重分类是改变栅格值范围的操作。例如,可将所有正像素值重分类为 + 1,所有负像素值重分类为 - 1。如果像素值代表海平面高程,重分类后,栅格不再存储实际高度,而是表示位置在水上还是水下。
重分类通常用于去除仪器引入的噪声、简化栅格,或将栅格的浮点值转换为整数值。虽然它与地图代数类似,甚至可视为地图代数的一个子集,但重分类通常比地图代数快得多,在很多情况下速度能快几个数量级。
栅格构造函数
创建PostGIS栅格的方法有以下几种:
使用ST_AsRaster将PostGIS几何图形转换为栅格。在PostGIS3.2中,ST_InterpolateRaster将一组3D点转换为平面高程网格。
使用raster2pgsql加载程序加载栅格。如果要维护数据库外的栅格,可以使用加载程序的-R开关注册他们,而不是将他们导入数据库。
使用ST_MakeEmptyRaster和ST_AddBand从头开始创建栅格,然后使用各种其他栅格函数设置像素值,或将波段路径设置为外部栅格文件。
使用联合、切片、地图代数、重分类、调整大小、重投影、重采样等处理函数从现有栅格构建栅格。
使用ST_FromGDALRaster函数将其他各种栅格格式的栅格转换为PostGIS栅格格式。采用此方法,只需要输入栅格的二进制BLOB。
Comments