Chapter 12. 栅格参考

Table of Contents
12.1. 栅格支持的数据类型
12.2. 栅格管理
12.3. 栅格构造器
12.4. 栅格存取器
12.5. 栅格波段访问器
12.6. 栅格像素访问器和设置器
12.7. 栅格编辑器
12.8. 栅格波段编辑器
12.9. 栅格波段统计和分析
12.10. 栅格输入
12.11. 栅格输出
12.12. 栅格处理:地图代数
12.13. 内置地图代数回调函数
12.14. 栅格处理:DEM(高程)
12.15. 栅格处理:栅格到几何图形
12.16. 栅格运算符
12.17. 栅格和栅格波段空间关系
12.18. 栅格技巧
12.18.1. Out-DB栅格

下面给出的功能是PostGIS栅格的用户可能需要的,并且目前在PostGIS栅格中可用。还有其他功能是对一般用户不使用的栅格对象所需的支持功能。

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

有关从栅格文件加载栅格的信息,请参阅 Section 11.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);

12.1. 栅格支持的数据类型

Abstract

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

Geomval — 具有两个字段的空间数据类型-geom(保存几何图形对象)和val(保存来自栅格标注栏的双精度像素值)。
添加带宽参数 — 用作ST_AddBand函数的输入的复合类型,用于定义新标注栏的属性和初始值。
粗制滥造 — 当需要表示栅格和该栅格的波段索引时使用的复合类型。
栅格 — 栅格空间数据类型。
重新分类 — 用作ST_Reclass函数的输入的复合类型,用于定义重分类行为。
摘要统计信息 — ST_SummaryStats和ST_SummaryStatsAgg函数返回的复合类型。
工会 — 用作ST_UNION函数的输入的复合类型,用于定义要处理的波段和UNION操作的行为。

12.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 — 基于三维点的输入集对栅格曲面进行内插,使用X和Y值来定位栅格上的点,并使用点的Z值作为曲面高程。
更新栅格SRID — 更改用户指定的列和表中所有栅格的SRID。
ST_CreateOverview — 创建给定栅格覆盖的降低分辨率版本。

12.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栅格文件返回栅格。

12.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)。

12.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。

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

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

12.7. 栅格编辑器

ST_SetGeoReference — 在单个调用中设置地理参考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(英式或美式拼写)、双线性、立方、立方样条线或Lanczos重采样算法计算新的像素值。默认为NearestNeighbor。
ST_Reskew — 通过仅调整其倾斜(或旋转参数)来重采样栅格。使用NearestNeighbor(英式或美式拼写)、双线性、立方、立方样条线或Lanczos重采样算法计算新的像素值。默认为NearestNeighbor。
ST_SnapToGrid — 通过将栅格捕捉到栅格来重采样栅格。使用NearestNeighbor(英式或美式拼写)、双线性、立方、立方样条线或Lanczos重采样算法计算新的像素值。默认值为NearestNeighbor。
ST_Resize — 将栅格大小调整为新的宽度/高度
ST_Transform — 使用指定的重采样算法将已知空间参考系中的栅格重投影到另一个已知空间参考系。选项包括NearestNeighbor、双线性、立方、三次样条、默认为NearestNeighbor的Lanczos。

12.8. 栅格波段编辑器

ST_SetBandNoDataValue — 设置表示无数据的给定标注栏的值。如果未指定波段,则假定波段1。要将波段标记为没有nodata值,请将nodata值设置为NULL。
ST_SetBandIsNoData — 将波段的isnodata标志设置为true。
ST_SetBandPath — 更新数据库外波段的外部路径和波段编号
ST_SetBandIndex — 更新数据库外波段的外部波段编号

12.9. 栅格波段统计和分析

ST_Count — 返回栅格或栅格覆盖的给定波段中的像素数。如果未指定波段,则默认为波段1。如果EXCLUDE_NODATA_VALUE设置为TRUE,将只计算不等于NODATA值的像素。
ST_CountAgg — 聚合。返回一组栅格的给定波段中的像素数。如果未指定波段,则默认为波段1。如果EXCLUDE_NODATA_VALUE设置为TRUE,将只计算不等于NODATA值的像素。
ST_Histogram — 返回一组记录,其中汇总了栅格或栅格覆盖率数据分布的单独面元范围。如果未指定,则自动计算垃圾箱的数量。
ST_Quantile — 在样本或总体的上下文中计算栅格或栅格表覆盖率的分位数。因此,可以将值检查为位于栅格的25%、50%、75%的百分位数。
ST_SummaryStats — 返回由栅格或栅格Coverage的给定栅格波段的COUNT、SUM、Mean、STDDEV、MIN、MAX组成的摘要统计信息。假定带区1未指定带区。
ST_SummaryStatsAgg — 聚合。返回由一组栅格的给定栅格波段的COUNT、SUM、Mean、STDDEV、MIN、MAX组成的摘要统计信息。假定带区1未指定带区。
ST_ValueCount — 返回一组记录,其中包含像素带值和具有给定值的栅格(或栅格覆盖)的给定波段中的像素数的计数。如果未指定带,则默认为带1。默认情况下,不计算nodata值像素。并且输出像素中的所有其他值,并且将像素带值四舍五入为最接近的整数。

12.10. 栅格输入

ST_RastFromWKB — 从知名的二进制(WKB)栅格返回栅格值。
ST_RastFromHexWKB — 从知名二进制(Wkb)栅格的祸不单行表示中返回栅格值。

12.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图像(字节数组)返回。如果未指定标注栏或栅格中不存在任何指定标注栏,则将尝试使用所有标注栏。

12.12. 栅格处理:地图代数

ST_Clip — 返回由输入几何图形剪裁的栅格。如果未指定波段编号,则处理所有波段。如果 crop 未指定或为TRUE,则将裁剪输出栅格。
ST_ColorMap — 从源栅格和指定的标注栏中创建最多包含四个8BUI标注栏(灰度、RGB、RGBA)的新栅格。如果未指定,则假定为带1。
ST_Grayscale — 根据源栅格和表示红色、绿色和蓝色的指定波段创建新的One-8BUI波段栅格
ST_Intersection — 返回一个栅格或一组几何体-像素值对,表示两个栅格的共享部分或栅格和几何体的矢量化的几何体交集。
ST_MapAlgebra(回调函数版本) — 回调函数版本-返回给定一个或多个输入栅格、波段索引和一个用户指定的回调函数的单波段栅格。
ST_MapAlgebra(表达式版本) — 表达式版本-返回给定一个或两个输入栅格、波段索引以及一个或多个用户指定的SQL表达式的单波段栅格。
ST_MapAlgebraExpr — 1个栅格波段版本:通过对输入栅格波段和提供的像素类型应用有效的PostgreSQL代数运算来创建新的单波段栅格。如果未指定波段,则假定为波段1。
ST_MapAlgebraExpr — 2个栅格波段版本:创建通过对提供的两个输入栅格波段应用有效的PostgreSQL代数运算形成的新单波段栅格。如果未指定波段编号,则假定每个栅格的波段1。生成的栅格将在第一个栅格定义的栅格上对齐(缩放、倾斜和像素角),其范围由“extenttype”参数定义。“extenttype”的值可以是:交集、并集、第一个、第二个。
ST_MapAlgebraFct — 单波段版本-通过在输入栅格波段上应用有效的PostgreSQL函数和所生成的像素类型创建新的单波段栅格。如果未指定波段,则假定为波段1。
ST_MapAlgebraFct — 2波段版本-创建新的单波段栅格,该栅格是通过在2个输入栅格波段上应用有效的PostgreSQL函数和像素类型生成的。如果未指定波段,则假定波段1。如果未指定范围类型,则默认为相交。
ST_MapAlgebraFctNgb — 1波段版本:使用自定义PostgreSQL函数的地图代数最近邻。返回值为PLPGSQL用户函数的结果的栅格,该用户函数涉及输入栅格波段中的值的邻域。
ST_Reclass — 创建由从原始标注栏重新分类的标注栏类型组成的新栅格。nband是要更改的频带。如果未指定nband,则假定为1。所有其他波段将原封不动地返回。用例:将16BUI波段转换为8BUI,以此类推,以便更简单地呈现为可视格式。
ST_Union — 将一组栅格平铺的并集返回由1个或多个标注栏组成的单个栅格。

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

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

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

ST_Aspect — 返回高程栅格标注栏的纵横比(默认情况下以度为单位)。对于分析地形非常有用。
ST_HillShade — 使用提供的方位角、海拔高度、亮度和比例输入返回高程栅格波段的假设照明。
ST_Roughness — 返回具有计算出的DEM“粗糙度”的栅格。
ST_Slope — 返回高程栅格标注栏的坡度(默认情况下以度为单位)。对于分析地形非常有用。
ST_TPI — 返回具有计算出的地形位置索引的栅格。
ST_TRI — 返回具有计算出的地形崎岖指数的栅格。

12.15. 栅格处理:栅格到几何图形

Box3D — 返回栅格的封闭框的框3D表示。
ST_ConvexHull — 返回栅格的凸壳几何图形,包括等于BandNoDataValue的像素值。对于形状规则且无倾斜的栅格,这将提供与ST_Entaine相同的结果,因此仅适用于形状不规则或倾斜的栅格。
ST_DumpAsPolygons — 返回给定栅格标注栏中的一组geomval(geom,val)行。如果未指定波段编号,则波段编号默认为1。
ST_Envelope — 返回栅格范围的多边形表示。
ST_MinConvexHull — 返回不包括NODATA像素的栅格凸包几何图形。
ST_Polygon — 返回由像素值不是无数据值的像素并集形成的多多边形几何图形。如果未指定波段编号,则波段编号默认为1。

12.16. 栅格运算符

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

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

ST_Contains — 如果栅格栅格B的点没有位于栅格RASTA的外部,并且栅格B的内部至少有一个点位于RASTA的内部,则返回TRUE。
ST_ContainsProperly — 如果rastB与Rasta的内部相交,但不与Rasta的边界或外部相交,则返回TRUE。
ST_Covers — 如果栅格栅格B的点没有位于栅格RASTA之外,则返回TRUE。
ST_CoveredBy — 如果没有栅格RASTA的点位于栅格栅格B之外,则返回TRUE。
ST_Disjoint — 如果栅格RASTA在空间上不与rastB相交,则返回TRUE。
ST_Intersects — 如果栅格RASTA与栅格栅格B在空间上相交,则返回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。

12.18. 栅格技巧

Abstract

本部分记录了与PostGIS栅格相关的各种问题和提示。

12.18.1. Out-DB栅格

12.18.1.1. 包含许多文件的目录

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

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

在Ubuntu中(假设您使用的是用于Ubuntu的PostgreSQL包), GDAL_DISABLE_READDIR_ON_OPEN 可以设置为 /etc/postgresql/POSTGRESQL_VERSION/CLUSTER_NAME/environment (其中,PostgreSQL_Version是PostgreSQL的版本,例如9.6,CLUSTER_NAME是集群的名称,例如maindb)。您还可以在此处设置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'
                    

12.18.1.2. 最大打开文件数

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

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

...
# - Kernel Resource Usage -

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

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

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

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

12.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
                    
12.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 (System D)。

让我们首先讨论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)
...

现在来谈一谈system d Ubuntu案例。我们将添加 LimitNoFile=131072 致每一位 /lib/systemd/system/postgresql*.service 文件中的 [服务] 部分。

...
[Service]

LimitNOFILE=131072

...

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

进行必要的系统ID更改后,请确保重新装载守护进程

systemctl daemon-reload