Chapter 10. 栅格参考

Table of Contents

下面给出的功能是 PostGIS Raster 用户可能需要的功能,并且当前在 PostGIS Raster 中可用。 还有一些其他功能是栅格对象所需的支持功能,但对一般用户来说没有用处。

raster 是一种新的 PostGIS 类型,用于存储和分析栅格数据。

有关从光栅文件加载光栅的信息,请参阅Section 9.1, “加载和创建栅格”

对于本参考文献中的示例,我们将使用虚拟栅格的栅格表 - 由以下代码组成

CREATE TABLE dummy_rast(rid integer, rast raster);
INSERT INTO dummy_rast(rid, rast)
VALUES (1,
('01' -- little endian (uint8 ndr)
||
'0000' -- version (uint16 0)
||
'0000' -- nBands (uint16 0)
||
'0000000000000040' -- scaleX (float64 2)
||
'0000000000000840' -- scaleY (float64 3)
||
'000000000000E03F' -- ipX (float64 0.5)
||
'000000000000E03F' -- ipY (float64 0.5)
||
'0000000000000000' -- skewX (float64 0)
||
'0000000000000000' -- skewY (float64 0)
||
'00000000' -- SRID (int32 0)
||
'0A00' -- width (uint16 10)
||
'1400' -- height (uint16 20)
)::raster
),
-- Raster: 5 x 5 pixels, 3 bands, PT_8BUI pixel type, NODATA = 0
(2,  ('01000003009A9999999999A93F9A9999999999A9BF000000E02B274A' ||
'41000000007719564100000000000000000000000000000000FFFFFFFF050005000400FDFEFDFEFEFDFEFEFDF9FAFEF' ||
'EFCF9FBFDFEFEFDFCFAFEFEFE04004E627AADD16076B4F9FE6370A9F5FE59637AB0E54F58617087040046566487A1506CA2E3FA5A6CAFFBFE4D566DA4CB3E454C5665')::raster);

10.1. 栅格支持数据类型

Abstract

本节列出了专门为支持栅格功能而创建的 PostgreSQL 数据类型。

  • geomval — 具有两个字段的空间数据类型 - geom(保存几何对象)和 val(保存栅格带中的双精度像素值)。
  • addbandarg — 用作 ST_AddBand 函数的输入的复合类型,定义新波段的属性和初始值。
  • rastbandarg — 需要表达栅格和该栅格的波段索引时使用的复合类型。
  • raster — 栅格空间数据类型。
  • reclassarg — 用作定义重新分类行为的 ST_Reclass 函数的输入的复合类型。
  • summarystats — ST_SummaryStats 和 ST_SummaryStatsAgg 函数返回的复合类型。
  • unionarg — 用作 ST_Union 函数的输入的复合类型,定义要处理的波段和 UNION 操作的行为。

10.2. 栅格管理

  • AddRasterConstraints — 将栅格约束添加到已加载的栅格表中,用于特定列,该列约束了空间参考、比例、块大小、对齐、波段、波段类型以及一个标志,用于表示栅格列是否被规则地分块。表必须加载数据才能推断出约束。如果约束设置成功,则返回 true,否则会发出通知。
  • DropRasterConstraints — 删除引用栅格表列的 PostGIS 栅格约束。 如果您需要重新加载数据或更新栅格列数据,则非常有用。
  • AddOverviewConstraints — 将栅格列标记为另一栅格列的概述。
  • DropOverviewConstraints — 取消栅格列作为另一栅格列概览的标记。
  • PostGIS_GDAL_Version — 报告 PostGIS 使用的 GDAL 库的版本。
  • PostGIS_Raster_Lib_Build_Date — 报告完整的栅格库构建日期。
  • PostGIS_Raster_Lib_Version — 报告完整的栅格版本和构建配置信息。
  • ST_GDALDrivers — 通过 GDAL 返回 PostGIS 支持的栅格格式列表。 ST_AsGDALRaster 仅可使用 can_write=True 的格式
  • ST_Contour — 使用 GDAL 轮廓算法从提供的栅格波段生成一组矢量轮廓。
  • ST_InterpolateRaster — 基于输入的 3 维点集插值网格表面,使用 X 和 Y 值在网格上定位点,并使用点的 Z 值作为表面高程。
  • UpdateRasterSRID — 更改用户指定的列和表中所有栅格的 SRID。
  • ST_CreateOverview — 创建给定栅格覆盖范围的降低分辨率版本。

10.3. 栅格构造器

  • ST_AddBand — 返回一个栅格,其中在给定索引位置添加了给定类型的新波段和给定初始值。 如果未指定索引,则将带添加到末尾。
  • ST_AsRaster — 将 PostGIS 几何图形转换为 PostGIS 栅格。
  • ST_Band — 返回现有栅格的一个或多个波段作为新栅格。 对于从现有栅格构建新栅格非常有用。
  • ST_MakeEmptyCoverage — 用空栅格图块网格覆盖地理参考区域。
  • ST_MakeEmptyRaster — 返回一个空白栅格(不包含波段),其具有给定的尺寸(宽度和高度)、左上角 X 和 Y 坐标、像素大小和旋转参数(scalex、scaley、skewx 和 skewy),以及参考系统(SRID)。如果传递了一个栅格,则返回一个具有相同大小、对齐方式和 SRID 的新栅格。如果省略了 SRID,则空间参考将设置为未知(0)。
  • ST_Tile — 返回根据输出栅格的所需维度分割输入栅格而产生的一组栅格。
  • ST_Retile — 从任意平铺的栅格覆盖范围返回一组配置的平铺。
  • ST_FromGDALRaster — 从受支持的 GDAL 栅格文件返回栅格。

10.4. 栅格访问器

  • ST_GeoReference — 返回 GDAL 或 ESRI 格式的地理配准元数据,如世界文件中常见的格式。 默认为 GDAL。
  • ST_Height — 返回栅格的高度(以像素为单位)。
  • ST_IsEmpty — 如果栅格为空(宽度 = 0 且高度 = 0),则返回 true。 否则,返回 false。
  • ST_MemSize — 返回栅格占用的空间量(以字节为单位)。
  • ST_MetaData — 返回有关栅格对象的基本元数据,例如像素大小、旋转(倾斜)、左上、左下等。
  • ST_NumBands — 返回栅格对象中的波段数。
  • ST_PixelHeight — 返回空间参考系统的几何单位的像素高度。
  • ST_PixelWidth — 返回空间参考系统的几何单位的像素宽度。
  • ST_ScaleX — 返回像素宽度的 X 分量(以坐标参考系为单位)。
  • ST_ScaleY — 返回像素高度的 Y 分量(以坐标参考系为单位)。
  • ST_RasterToWorldCoord — 在给定列和行的情况下,以几何 X 和 Y(经度和纬度)形式返回栅格的左上角。 列和行从 1 开始。
  • ST_RasterToWorldCoordX — 返回栅格、列和行左上角的几何 X 坐标。 列和行的编号从 1 开始。
  • ST_RasterToWorldCoordY — 返回栅格、列和行的左上角的几何 Y 坐标。 列和行的编号从 1 开始。
  • ST_Rotation — 返回栅格的旋转弧度。
  • ST_SkewX — 返回地理参考 X 倾斜(或旋转参数)。
  • ST_SkewY — 返回地理参考 Y 倾斜(或旋转参数)。
  • ST_SRID — 返回在spatial_ref_sys表中定义的栅格的空间参考标识符。
  • ST_Summary — 返回栅格内容的文本摘要。
  • ST_UpperLeftX — 返回投影空间参考中栅格的左上角 X 坐标。
  • ST_UpperLeftY — 返回投影空间参考中栅格的左上角 Y 坐标。
  • ST_Width — 返回栅格的宽度(以像素为单位)。
  • ST_WorldToRasterCoord — 给定几何 X 和 Y(经度和纬度)或以栅格的空间参考坐标系表示的点几何,将左上角作为列和行返回。
  • ST_WorldToRasterCoordX — 返回栅格中点几何 (pt) 的列或以栅格世界空间参考系表示的 X 和 Y 世界坐标 (xw, yw)。
  • ST_WorldToRasterCoordY — 返回点几何图形 (pt) 的栅格中的行或以栅格的世界空间参考系表示的 X 和 Y 世界坐标 (xw, yw)。

10.5. 栅格波段访问器

  • ST_BandMetaData — 返回特定栅格波段的基本元数据。 如果未指定,则假定波段编号为 1。
  • ST_BandNoDataValue — 返回表示无数据的给定波段中的值。如果没有指定波段编号,默认为波段1。
  • ST_BandIsNoData — 如果波段仅填充无数据值,则返回 true。
  • ST_BandPath — 返回存储在文件系统中的波段的系统文件路径。 如果未指定波段号,则假定为 1。
  • ST_BandFileSize — 返回文件系统中存储的波段的文件大小。 如果未指定波段号,则假定为 1。
  • ST_BandFileTimestamp — 返回文件系统中存储的波段的文件时间戳。 如果未指定 波段号,则假定为 1。
  • ST_BandPixelType — 返回给定波段的像素类型。 如果未指定 波段号,则假定为 1。
  • ST_MinPossibleValue — 返回此像素类型可以存储的最小值。
  • ST_HasNoBand — 如果不存在具有给定波段编号的波段,则返回 true。 如果未指定波段号,则假定波段号为 1。

10.6. 栅格像素访问器和设置器

  • ST_PixelAsPolygon — 返回限定特定行和列的像素的多边形几何形状。
  • ST_PixelAsPolygons — 返回包围栅格带的每个像素的多边形几何图形以及每个像素的值、X 和 Y 栅格坐标。
  • ST_PixelAsPoint — 返回像素左上角的点几何形状。
  • ST_PixelAsPoints — 返回栅格波段的每个像素的点几何图形以及每个像素的值、X 和 Y 栅格坐标。 点几何的坐标是像素的左上角。
  • ST_PixelAsCentroid — 返回像素表示的区域的质心(点几何)。
  • ST_PixelAsCentroids — 返回栅格波段的每个像素的质心(点几何)以及每个像素的值、X 和 Y 栅格坐标。 点几何是像素表示的区域的质心。
  • ST_Value — 返回指定列 x、行 y 像素或特定几何点处给定波段的值。波段编号从 1 开始,如果未指定,则默认为 1。如果将参数 exclude_nodata_value 设置为 false,则所有像素都被认为与 nodata 像素相交并返回其值。如果未传递参数 exclude_nodata_value,则从栅格的元数据中读取该值。
  • ST_NearestValue — 返回由 columnx 和 rowy 指定的给定带像素的最接近的非 NODATA 值或以与栅格相同的空间参考坐标系表示的几何点。
  • ST_SetZ — 返回与输入几何图形具有相同 X/Y 坐标的几何图形,并使用请求的重采样算法将栅格中的值复制到 Z 维度。
  • ST_SetM — 返回与输入几何图形具有相同 X/Y 坐标的几何图形,并使用请求的重采样算法将栅格中的值复制到 M 维度。
  • ST_Neighborhood — 返回给定波段像素周围非 NODATA 值的二维双精度数组,该给定波段像素由 columnX 和 rowY 或以与栅格相同的空间参考坐标系表示的几何点指定。
  • ST_SetValue — 返回修改后的栅格,其结果是将给定波段中的值设置为指定列x、行y像素或与特定几何图形相交的像素。波段编号从1开始,如果未指定波段,则默认为1。
  • ST_SetValues — 返回通过设置给定波段的值而产生的修改后的栅格。
  • ST_DumpValues — 获取指定 band(波段) 的值作为二维数组。
  • ST_PixelOfValue — 获取值等于搜索值的像素的列x、行y坐标。

10.7. 栅格编辑器

  • ST_SetGeoReference — 在一次调用中设置 Georeference 6 地理配准参数。 数字应该用空格分隔。 接受 GDAL 或 ESRI 格式的输入。 默认为 GDAL。
  • ST_SetRotation — 以弧度设置栅格的旋转。
  • ST_SetScale — 以坐标参考系为单位设置像素的 X 和 Y 大小。 数字单位/像素宽度/高度。
  • ST_SetSkew — 设置地理参考 X 和 Y 倾斜(或旋转参数)。 如果只传入一个,则将X和Y设置为相同的值。
  • ST_SetSRID — 将栅格的 SRID 设置为在 Spatial_ref_sys 表中定义的特定整数 srid。
  • ST_SetUpperLeft — 将栅格左上角的值设置为投影的X和Y坐标。
  • ST_Resample — 重采样一个栅格图像,可以指定重新采样算法、新的尺寸、任意的栅格角点,以及一组栅格地理参考属性,这些属性可以自己定义,也可以从另一个栅格图像中借用。
  • ST_Rescale — 通过仅调整栅格的比例(或像素大小)来重新采样栅格。 新的像素值是使用 NearestNeighbor(英语或美式拼写)、Bilinear、Cubic、CubicSpline、 Lanczos、Max或Min重采样算法计算的。 默认为NearestNeighbor。
  • ST_Reskew — 通过仅调整栅格的倾斜(或旋转参数)来重采样栅格。 新的像素值是使用 NearestNeighbor(英语或美式拼写)、Bilinear、Cubic、CubicSpline或 Lanczos 重采样算法计算的。 默认为NearestNeighbor。
  • ST_SnapToGrid — 通过将栅格捕捉到网格来重采样栅格。 新的像素值是使用NearestNeighbor(英语或美式拼写)、Bilinear, Cubic, CubicSpline 或 Lanczos 重采样算法计算的。 默认为NearestNeighbor。
  • ST_Resize — 将栅格大小调整为新的宽度/高度
  • ST_Transform — 使用指定的重采样算法将已知空间参考系统中的栅格重新投影到另一个已知空间参考系统。 选项有 NearestNeighbor、Bilinear、Cubic、CubicSpline、Lanczos(默认为 NearestNeighbor)。

10.8. 栅格波段编辑器

  • ST_SetBandNoDataValue — 设置代表无数据的给定波段的值。 如果未指定波段,则假定为波段 1。 要将波段标记为没有 nodata 值,请设置 nodata 值 = NULL。
  • ST_SetBandIsNoData — 将带区的 isnodata 标志设置为 TRUE。
  • ST_SetBandPath — 更新out-db band的外部路径和band编号
  • ST_SetBandIndex — 更新out-db band的external band编号

10.9. 栅格波段统计和分析

  • ST_Count — 返回栅格或栅格覆盖范围的给定波段中的像素数。 如果未指定 band,则默认为 band 1。如果 except_nodata_value 设置为 true,则仅计算不等于 nodata 值的像素。
  • ST_CountAgg — 总计的。 返回一组栅格的给定波段中的像素数。 如果未指定 band,则默认为 band 1。如果 except_nodata_value 设置为 true,则仅计算不等于 NODATA 值的像素。
  • ST_Histogram — 返回一组记录,总结了栅格或栅格覆盖数据分布,其中包括分离的分箱范围。如果未指定,将自动计算分箱数。
  • ST_Quantile — 计算样本或总体上下文中栅格或栅格表覆盖范围的分位数。 因此,可以检查某个值是否位于栅格的 25%、50%、75% 百分位处。
  • ST_SummaryStats — 返回一组总结统计信息,包括给定栅格或栅格覆盖的栅格带的计数、总和、均值、标准差、最小值和最大值。如果未指定带号,则假定为带1。
  • ST_SummaryStatsAgg — 总计的。 返回一组栅格的给定栅格波段的摘要统计信息,其中包含计数、总和、平均值、标准差、最小值、最大值。 如果未指定带号,则假定为带1。
  • ST_ValueCount — 返回一组记录,其中包含像素带值以及具有给定值集的栅格(或栅格覆盖范围)给定带中的像素数计数。 如果未指定波段,则默认为波段 1。默认情况下,不计算节点数据值像素。 输出像素中的所有其他值,并将像素带值四舍五入到最接近的整数。

10.10. 栅格输入

  • ST_RastFromWKB — 从熟知的二进制 (WKB) 栅格返回栅格值。
  • ST_RastFromHexWKB — 从熟知的二进制 (WKB) 栅格的十六进制表示形式返回栅格值。

10.11. 栅格输出

  • ST_AsBinary/ST_AsWKB — 返回栅格的熟知的二进制 (WKB) 表示形式。
  • ST_AsHexWKB — 返回栅格的十六进制表示形式的熟知的二进制 (WKB)。
  • ST_AsGDALRaster — 以指定的 GDAL 栅格格式返回栅格图块。 栅格格式是编译库支持的格式之一。 使用 ST_GDALDrivers() 获取您的库支持的格式列表。
  • ST_AsJPEG — 将栅格图块选定的波段作为单个联合摄影导出组 (JPEG) 图像(字节数组)返回。 如果未指定波段且有 1 个或 3 个以上波段,则仅使用第一个波段。 如果只有 3 个波段,则使用所有 3 个波段并将其映射到 RGB。
  • ST_AsPNG — 将栅格图块选定的波段作为单个便携式网络图形 (PNG) 图像(字节数组)返回。 如果栅格中有 1、3 或 4 个波段且未指定波段,则使用所有波段。 如果有 2 个以上或多于 4 个波段且未指定波段,则仅使用波段 1。 波段映射到 RGB 或 RGBA 空间。
  • ST_AsTIFF — 将栅格选定的波段作为单个 TIFF 图像(字节数组)返回。 如果未指定波段或栅格中不存在任何指定波段,则将尝试使用所有波段。

10.12. 栅格处理:地图代数

  • ST_Clip — 返回由输入几何图形裁剪的栅格。 如果未指定波段号,则处理所有波段。 如果裁剪未指定或为 TRUE,则输出栅格将被裁剪。
  • ST_ColorMap — 根据源栅格和指定波段创建最多四个 8BUI 波段(灰度、RGB、RGBA)的新栅格。 如果未指定,则假定为波段 1。
  • ST_Grayscale — 根据源栅格和代表红色、绿色和蓝色的指定波段创建新的 1-8BUI 波段栅格
  • ST_Intersection — 返回一个栅格或一组几何像素值对,表示两个栅格的共享部分或栅格矢量化和几何图形的几何交集。
  • ST_MapAlgebra (callback function version) — 回调函数版本 - 给定一个或多个输入栅格、波段索引和一个用户指定的回调函数,返回单波段栅格。
  • ST_MapAlgebra (expression version) — 表达式版本 - 在给定一两个输入栅格、波段索引和一个或多个用户指定的 SQL 表达式的情况下,返回单波段栅格。
  • ST_MapAlgebraExpr — 1 栅格波段版本:通过对输入栅格波段和提供的像素类型应用有效的 PostgreSQL 代数运算来创建新的单波段栅格。 如果未指定波段,则假定为波段 1。
  • ST_MapAlgebraExpr — 2 栅格波段版本:通过对提供的两个输入栅格波段和像素类型应用有效的 PostgreSQL 代数运算来创建新的单波段栅格。 如果未指定波段编号,则假定每个栅格的波段 1。 生成的栅格将在第一个栅格定义的网格上对齐(比例、倾斜和像素角),并具有由“extenttype”参数定义的范围。 “extenttype”的值可以是:INTERSECTION、UNION、FIRST、SECOND。
  • ST_MapAlgebraFct — 1 波段版本 - 通过在输入栅格波段和提供的像素类型上应用有效的 PostgreSQL 函数来创建新的单波段栅格。 如果未指定波段,则假定为波段 1。
  • ST_MapAlgebraFct — 2 波段版本 - 通过在提供的 2 个输入栅格波段和像素类型上应用有效的 PostgreSQL 函数来创建新的单波段栅格。 如果未指定波段,则假定为波段 1。 如果未指定,范围类型默认为 INTERSECTION。
  • ST_MapAlgebraFctNgb — 1-波段版本:使用用户定义的 PostgreSQL 函数映射代数最近邻。 返回一个栅格,其值是涉及输入栅格波段值的邻域的 PLPGSQL 用户函数的结果。
  • ST_Reclass — 创建由从原始数据重新分类的波段类型组成的新栅格。 nband 是要更改的波段。 如果未指定 nband,则假定为 1。所有其他波段均按原样返回。 使用案例:将 16BUI 波段转换为 8BUI 等,以便更简单地呈现为可视格式。
  • ST_Union — 将一组栅格切片的并集返回为由 1 个或多个波段组成的单个栅格。

10.13. 内置地图代数回调函数

  • ST_Distinct4ma — 栅格处理函数,用于计算邻域中唯一像素值的数量。
  • ST_InvDistWeight4ma — 从像素的邻域内插像素值的栅格处理函数。
  • ST_Max4ma — 计算邻域中最大像素值的栅格处理函数。
  • ST_Mean4ma — 计算邻域中平均像素值的栅格处理函数。
  • ST_Min4ma — 计算邻域中最小像素值的栅格处理函数。
  • ST_MinDist4ma — 返回感兴趣像素与具有值的相邻像素之间的最小距离(以像素数为单位)的栅格处理函数。
  • ST_Range4ma — 计算邻域中像素值范围的栅格处理函数。
  • ST_StdDev4ma — 计算邻域中像素值的标准偏差的栅格处理函数。
  • ST_Sum4ma — 栅格处理函数,计算邻域中所有像素值的总和。

10.14. 栅格处理:DEM(高程)

  • ST_Aspect — 返回高程栅格波段的坡向(默认以度为单位)。 对于分析地形很有用。
  • ST_HillShade — 使用提供的方位角、高度、亮度和比例输入返回高程栅格带的假设照明。
  • ST_Roughness — 返回一个计算出的数字高程模型(DEM)的 '粗糙度' 的栅格。
  • ST_Slope — 返回高程栅格带的坡度(默认以度为单位)。 对于分析地形很有用。
  • ST_TPI — 返回一个计算出的地形位置指数(Topographic Position Index)的栅格。
  • ST_TRI — 返回具有计算的地形坚固性指数的栅格。

10.15. 栅格处理:栅格到几何

  • Box3D — 返回栅格封闭框的box 3d 表示形式。
  • ST_ConvexHull — 返回栅格的凸包几何形状,包括等于 BandNoDataValue 的像素值。 对于规则形状和非倾斜栅格,这给出与 ST_Envelope 相同的结果,因此仅对不规则形状或倾斜栅格有用。
  • ST_DumpAsPolygons — 从给定的栅格带中返回一组 geomval (geom,val) 行。 如果未指定波段 编号,则波段编号默认为 1。
  • ST_Envelope — 返回栅格范围的多边形表示形式。
  • ST_MinConvexHull — 返回栅格的凸包几何形状(不包括 NODATA 像素)。
  • ST_Polygon — 返回由具有非无数据值的像素值的像素并集形成的多多边形几何体。 如果未指定波段 编号,则 波段 编号默认为 1。

10.16. 栅格运算符

  • && — 如果 A 的边界框与 B 的边界框相交,则返回 TRUE
  • &< — 如果 A 的边界框位于 B 的左侧,则返回 TRUE
  • &> — 如果 A 的边界框位于 B 的右侧,则返回 TRUE
  • = — 如果 A 的边界框与 B 的边界框相同,则返回 TRUE。 使用双精度边界框。
  • @ — 如果 A 的边界框包含在 B 的边界框中,则返回 TRUE。 使用双精度边界框。
  • ~= — 如果 A 的边界框与 B 的边界框相同,则返回 TRUE
  • ~ — 如果 A 的边界框包含 B 的边界框,则返回 TRUE。 使用双精度边界框。

10.17. 栅格和栅格波段空间关系

  • ST_Contains — 如果栅格 rastB 中没有点位于栅格 rastA 的外部且 rastB 的内部至少有一个点位于 rastA 的内部,则返回 true。
  • ST_ContainsProperly — 如果 rastB 与 rastA 的内部相交,但不与 rastA 的边界或外部相交,则返回 true。
  • ST_Covers — 如果栅格 rastB 中没有点位于栅格 rastA 之外,则返回 true。
  • ST_CoveredBy — 如果栅格 rastA 中没有点位于栅格 rastB 之外,则返回 true。
  • ST_Disjoint — 如果栅格 rastA 在空间上不与 rastB 相交,则返回 true。
  • ST_Intersects — 如果栅格 rastA 与栅格 rastB 空间相交,则返回 true。
  • ST_Overlaps — 如果栅格 rastA 和 rastB 相交,但其中一个不完全包含另一个,则返回 true。
  • ST_Touches — 如果栅格 rastA 和 rastB 至少有一个共同点但它们的内部不相交,则返回 true。
  • ST_SameAlignment — 如果栅格具有相同的倾斜、比例、空间参考和偏移(像素可以放在同一网格上而不切割成像素),则返回 true;如果没有注意细节问题,则返回 false。
  • ST_NotSameAlignmentReason — 返回说明栅格是否对齐的文本,如果未对齐,则说明原因。
  • ST_Within — 如果栅格 rastA 中没有点位于栅格 rastB 的外部且 rastA 的内部至少有一个点位于 rastB 的内部,则返回 true。
  • ST_DWithin — 如果栅格 rastA 和 rastB 彼此之间的距离在指定距离内,则返回 true。
  • ST_DFullyWithin — 如果栅格 rastA 和 rastB 彼此完全在指定距离内,则返回 true。

10.18. 栅格提示

Abstract

本节记录了与 PostGIS Raster 相关的各种问题和技巧。

10.18.1. Out-DB 栅格

10.18.1.1. 包含许多文件的目录

当 GDAL 打开一个文件时,GDAL 会立即扫描该文件的目录以构建其他文件的目录。 如果此目录包含许多文件(例如数千、数百万),则打开该文件会变得非常慢(特别是如果该文件恰好位于 NFS 等网络驱动器上)。

为了控制此行为,GDAL 提供了以下环境变量: GDAL_DISABLE_READDIR_ON_OPEN。 将 GDAL_DISABLE_READDIR_ON_OPEN 设置为 TRUE 以禁用目录扫描。

在 Ubuntu 中(假设您使用的是 PostgreSQL 的 Ubuntu 软件包),可以设置 GDAL_DISABLE_READDIR_ON_OPEN /etc/postgresql/POSTGRESQL_VERSION/CLUSTER_NAME/environment 中(其中 POSTGRESQL_VERSION 是 PostgreSQL 的版本,例如 9.6,CLUSTER_NAME 是集群的名称,例如 9.6)。 主数据库)。 您还可以在此处设置 PostGIS 环境变量。

# environment variables for postmaster process
# This file has the same syntax as postgresql.conf:
#  VARIABLE = simple_value
#  VARIABLE2 = 'any value!'
# I. e. you need to enclose any value which does not only consist of letters,
# numbers, and '-', '_', '.' in single quotes. Shell commands are not
# evaluated.
POSTGIS_GDAL_ENABLED_DRIVERS = 'ENABLE_ALL'

POSTGIS_ENABLE_OUTDB_RASTERS = 1

GDAL_DISABLE_READDIR_ON_OPEN = 'TRUE'
                    

10.18.1.2. 最大打开文件数

Linux 和 PostgreSQL 允许的最大打开文件数通常是相对保守的(通常是每个进程最多 1024 个打开文件),这是基于这样一种假设而设置的,即系统主要由人类用户使用。然而,对于 Out-DB栅格数据,一个有效的查询很容易超过这个限制(例如,一个包含了 10 年的栅格数据集,每天都有一个栅格包含了最低和最高温度数据,我们想要知道该数据集中某个像素的绝对最小和最大值)。

最简单的更改是以下 PostgreSQL 设置:max_files_per_process。 默认设置为 1000,这对于Out-DB栅格来说太低了。 安全的起始值可能是 65536,但这实际上取决于您的数据集以及针对这些数据集运行的查询。 此设置只能在服务器启动时进行,并且可能只能在 PostgreSQL 配置文件中进行(例如 Ubuntu 环境中的 /etc/postgresql/POSTGRESQL_VERSION/CLUSTER_NAME/postgresql.conf )。

...
# - Kernel Resource Usage -

max_files_per_process = 65536           # min 25
                                        # (change requires restart)
...
                    

要做的主要更改是 Linux 内核的打开文件限制。 这有两个部分:

  • 整个系统最大打开文件数

  • 每个进程的最大打开文件数

10.18.1.2.1. 整个系统最大打开文件数

您可以通过以下示例检查整个系统当前最大打开文件数:

$ sysctl -a | grep fs.file-max
fs.file-max = 131072
                    

如果返回的值不够大,请按照以下示例将文件添加到 /etc/sysctl.d/ 中:

$ echo "fs.file-max = 6145324" >> /etc/sysctl.d/fs.conf

$ cat /etc/sysctl.d/fs.conf
fs.file-max = 6145324

$ sysctl -p --system
* Applying /etc/sysctl.d/fs.conf ...
fs.file-max = 2097152
* Applying /etc/sysctl.conf ...

$ sysctl -a | grep fs.file-max
fs.file-max = 6145324
                    
10.18.1.2.2. 每个进程的最大打开文件数

我们需要增加 PostgreSQL 服务器进程每个进程打开文件的最大数量。

要查看当前 PostgreSQL 服务进程使用的最大打开文件数,请按照以下示例执行操作(确保 PostgreSQL 正在运行):

$ ps aux | grep postgres
postgres 31713  0.0  0.4 179012 17564 pts/0    S    Dec26   0:03 /home/dustymugs/devel/postgresql/sandbox/10/usr/local/bin/postgres -D /home/dustymugs/devel/postgresql/sandbox/10/pgdata
postgres 31716  0.0  0.8 179776 33632 ?        Ss   Dec26   0:01 postgres: checkpointer process
postgres 31717  0.0  0.2 179144  9416 ?        Ss   Dec26   0:05 postgres: writer process
postgres 31718  0.0  0.2 179012  8708 ?        Ss   Dec26   0:06 postgres: wal writer process
postgres 31719  0.0  0.1 179568  7252 ?        Ss   Dec26   0:03 postgres: autovacuum launcher process
postgres 31720  0.0  0.1  34228  4124 ?        Ss   Dec26   0:09 postgres: stats collector process
postgres 31721  0.0  0.1 179308  6052 ?        Ss   Dec26   0:00 postgres: bgworker: logical replication launcher

$ cat /proc/31718/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             15738                15738                processes
Max open files            1024                 4096                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       15738                15738                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us
                    

在上面的示例中,我们检查了进程 31718 的打开文件限制。无论是哪个 PostgreSQL 进程,它们中的任何一个都可以。 我们感兴趣的响应是最大打开文件数

我们希望将最大打开文件数软限制硬限制增加到大于我们为 PostgreSQL 设置 max_files_per_process 指定的值。 在我们的示例中,我们将 max_files_per_process 设置为 65536。

在 Ubuntu 中(假设您使用 Ubuntu 的 PostgreSQL 软件包),更改软限制硬限制的最简单方法是编辑 /etc/init.d/postgresql (SysV) 或 /lib/systemd/system/postgresql*.service(系统)。

让我们首先解决 SysV Ubuntu 的情况,其中我们将 ulimit -H -n 262144 ulimit -n 131072 添加到 /etc/init.d/postgresql

...
case "$1" in
    start|stop|restart|reload)
        if [ "$1" = "start" ]; then
            create_socket_directory
        fi
    if [ -z "`pg_lsclusters -h`" ]; then
        log_warning_msg 'No PostgreSQL clusters exist; see "man pg_createcluster"'
        exit 0
    fi

    ulimit -H -n 262144
    ulimit -n 131072

    for v in $versions; do
        $1 $v || EXIT=$?
    done
    exit ${EXIT:-0}
        ;;
    status)
...

现在来解决 Ubuntu 中的 systemd 问题。我们将在每个/lib/systemd/system/postgresql*.service文件的 [Service]部分中添加 LimitNOFILE=131072

...
[Service]

LimitNOFILE=131072

...

[Install]
WantedBy=multi-user.target
...

进行必要的 systemd 更改后,请确保重新加载守护进程

systemctl daemon-reload