第 11 章。網格參考

目錄

以下列出的函式是 PostGIS 網格使用者可能會需要,且目前在 PostGIS 網格中可用的函式。還有其他函式是網格物件所需的支援函式,一般使用者不會用到。

raster 是一種新的 PostGIS 類型,用於儲存和分析網格資料。

若要從網格檔案載入網格,請參閱第 10.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);

11.1. 網格支援的資料類型

摘要

本節列出專為支援網格功能而建立的 PostgreSQL 資料類型。

  • geomval — 一種具有兩個欄位的空間資料類型 - geom (保存幾何物件) 和 val (保存來自網格波段的雙精度像素值)。
  • addbandarg — 一種複合類型,用作 ST_AddBand 函式的輸入,定義新波段的屬性和初始值。
  • rastbandarg — 一種複合類型,用於需要表達網格和該網格的波段索引時。
  • raster — 網格空間資料類型。
  • reclassarg — 一種複合類型,用作 ST_Reclass 函式的輸入,定義重新分類的行為。
  • summarystats — ST_SummaryStats 和 ST_SummaryStatsAgg 函式傳回的複合類型。
  • unionarg — 一種複合類型,用作 ST_Union 函式的輸入,定義要處理的波段和 UNION 作業的行為。

11.2. 網格管理

  • AddRasterConstraints — 將網格限制新增至已載入的網格表格,用於限制特定欄位的空間參考、縮放、區塊大小、對齊、波段、波段類型以及表示網格欄位是否為規則區塊的旗標。必須載入表格資料才能推斷限制。如果完成限制設定,則傳回 true,否則會發出通知。
  • DropRasterConstraints — 刪除參考網格表格欄位的 PostGIS 網格限制。如果您需要重新載入資料或更新網格欄位資料,這很有用。
  • AddOverviewConstraints — 將網格欄位標記為另一個網格欄位的概觀。
  • DropOverviewConstraints — 將網格欄位取消標記為另一個網格欄位的概觀。
  • PostGIS_GDAL_Version — 報告 PostGIS 使用的 GDAL 程式庫版本。
  • PostGIS_Raster_Lib_Build_Date — 報告完整的網格程式庫建置日期。
  • PostGIS_Raster_Lib_Version — 報告完整的網格版本和建置組態資訊。
  • ST_GDALDrivers — 傳回 PostGIS 通過 GDAL 支援的網格格式清單。只有 can_write=True 的格式才能由 ST_AsGDALRaster 使用。
  • ST_Contour — 使用 GDAL 等高線演算法,從提供的網格波段產生一組向量等高線。
  • ST_InterpolateRaster — 使用輸入的一組 3D 點,根據 X 和 Y 值將點定位在網格上,並將點的 Z 值作為表面高程,來內插網格化表面。
  • UpdateRasterSRID — 變更使用者指定的欄位和表格中所有網格的 SRID。
  • ST_CreateOverview — 建立給定網格涵蓋範圍的降低解析度版本。

11.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 網格檔案傳回網格。

11.4. 網格存取器

  • ST_GeoReference — 以 GDAL 或 ESRI 格式傳回地理參考元資料,如常見的 world 檔案中所見。預設值為 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) 在光柵中的列。

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

11.6. 光柵像素存取器和設定器

  • ST_PixelAsPolygon — 傳回邊界為特定列和欄像素的多邊形幾何圖形。
  • ST_PixelAsPolygons — 傳回光柵波段中每個像素的邊界多邊形幾何圖形,以及每個像素的值、X 和 Y 光柵坐標。
  • ST_PixelAsPoint — 傳回像素左上角的點幾何圖形。
  • ST_PixelAsPoints — 傳回光柵波段中每個像素的點幾何圖形,以及每個像素的值、X 和 Y 光柵坐標。點幾何圖形的坐標為像素的左上角。
  • ST_PixelAsCentroid — 傳回像素所代表區域的質心 (點幾何圖形)。
  • ST_PixelAsCentroids — 傳回光柵波段中每個像素的質心 (點幾何圖形),以及每個像素的值、X 和 Y 光柵坐標。點幾何圖形為像素所代表區域的質心。
  • ST_Value — 傳回指定欄 (columnx)、列 (rowy) 像素或特定幾何點的指定波段的值。波段編號從 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 — 傳回一個二維雙精度數組,其中包含以欄 (columnX) 和列 (rowY) 或以與光柵相同的空間參考坐標系統表示的幾何點所指定之給定波段像素周圍的非 NODATA 值。
  • ST_SetValue — 傳回修改後的光柵,該光柵是由於設定指定欄 (columnx)、列 (rowy) 像素中或與特定幾何圖形相交的像素中給定波段的值而產生的。波段編號從 1 開始,如果沒有指定,則預設為 1。
  • ST_SetValues — 傳回修改後的光柵,該光柵是由於設定指定波段的值而產生的。
  • ST_DumpValues — 以二維數組的形式取得指定波段的值。
  • ST_PixelOfValue — 取得值等於搜尋值的像素的欄 (columnx)、列 (rowy) 坐標。

11.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 (英文或美式拼寫)、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。

11.8. 光柵波段編輯器

  • ST_SetBandNoDataValue — 設定指定波段中代表無資料的值。如果沒有指定波段,則預設為波段 1。若要將波段標示為沒有無資料值,請將無資料值設定為 NULL。
  • ST_SetBandIsNoData — 將波段的 isnodata 旗標設定為 TRUE。
  • ST_SetBandPath — 更新資料庫外波段的外部路徑和波段編號
  • ST_SetBandIndex — 更新資料庫外波段的外部波段編號

11.9. 光柵波段統計和分析

  • ST_Count — 傳回光柵或光柵覆蓋範圍的指定波段中的像素數量。如果沒有指定波段,則預設為波段 1。如果將 exclude_nodata_value 設定為 true,則只會計算不等於無資料值的像素。
  • ST_CountAgg — 聚合。傳回一組光柵的指定波段中的像素數量。如果沒有指定波段,則預設為波段 1。如果將 exclude_nodata_value 設定為 true,則只會計算不等於 NODATA 值的像素。
  • ST_Histogram — 傳回一組記錄,摘要說明點陣或點陣覆蓋資料分佈在不同的儲存格範圍內。如果未指定,則會自動計算儲存格數量。
  • ST_Quantile — 在樣本或母體的上下文中,計算點陣或點陣表格覆蓋的百分位數。因此,可以檢查某個值是否位於點陣的 25%、50%、75% 百分位數。
  • ST_SummaryStats — 傳回針對點陣或點陣覆蓋的給定點陣波段,由計數、總和、平均值、標準差、最小值、最大值組成的摘要統計資料。如果未指定波段,則假定為波段 1。
  • ST_SummaryStatsAgg — 聚合。傳回針對一組點陣的給定點陣波段,由計數、總和、平均值、標準差、最小值、最大值組成的摘要統計資料。如果未指定波段,則假定為波段 1。
  • ST_ValueCount — 傳回一組記錄,其中包含像素波段值,以及點陣(或點陣覆蓋)的指定波段中,具有一組給定值的像素數量計數。如果未指定波段,則預設為波段 1。預設情況下,不會計算 nodata 值像素。並且會輸出像素中的所有其他值,而像素波段值會四捨五入為最接近的整數。

11.10. 點陣輸入

  • ST_RastFromWKB — 從「已知二進位」(Well-Known Binary, WKB) 點陣傳回點陣值。
  • ST_RastFromHexWKB — 從「已知二進位」(Well-Known Binary, WKB) 點陣的十六進位表示法傳回點陣值。

11.11. 點陣輸出

  • ST_AsBinary/ST_AsWKB — 傳回點陣的「已知二進位」(Well-Known Binary, WKB) 表示法。
  • ST_AsHexWKB — 傳回點陣的「已知二進位」(Well-Known Binary, WKB) 十六進位表示法。
  • ST_AsGDALRaster — 以指定的 GDAL 點陣格式傳回點陣圖磚。點陣格式是您編譯程式庫所支援的格式之一。使用 ST_GDALDrivers() 取得您的程式庫所支援的格式清單。
  • ST_AsJPEG — 將選定的點陣圖磚波段傳回為單一聯合圖像專家小組 (Joint Photographic Exports Group, JPEG) 影像(位元組陣列)。如果未指定波段,且有 1 個或超過 3 個波段,則僅使用第一個波段。如果只有 3 個波段,則會使用所有 3 個波段並對應至 RGB。
  • ST_AsPNG — 將選定的點陣圖磚波段傳回為單一可攜式網路圖形 (portable network graphics, PNG) 影像(位元組陣列)。如果點陣中有 1 個、3 個或 4 個波段,且未指定任何波段,則會使用所有波段。如果超過 2 個或超過 4 個波段,且未指定任何波段,則僅使用波段 1。波段會對應至 RGB 或 RGBA 空間。
  • ST_AsTIFF — 將選定的點陣波段傳回為單一 TIFF 影像(位元組陣列)。如果未指定波段,或點陣中不存在任何指定的波段,則將嘗試使用所有波段。

11.12. 點陣處理:地圖代數

  • ST_Clip — 傳回由輸入幾何裁剪的點陣。如果未指定波段編號,則會處理所有波段。如果未指定 crop 或為 TRUE,則會裁剪輸出點陣。如果將 touched 設定為 TRUE,則會包含接觸到的像素,否則只有在像素中心位於幾何圖形中時才會包含。
  • ST_ColorMap — 從來源點陣和指定的波段建立最多四個 8BUI 波段(灰階、RGB、RGBA)的新點陣。如果未指定,則假定為波段 1。
  • ST_Grayscale — 從來源點陣和代表紅色、綠色和藍色的指定波段建立新的單一 8BUI 波段點陣
  • ST_Intersection — 傳回點陣或一組幾何圖形-像素值對,表示兩個點陣的共用部分,或是點陣向量化與幾何圖形的幾何交集。
  • ST_MapAlgebra(回呼函數版本) — 回呼函數版本 - 傳回一個單波段點陣,其中包含一個或多個輸入點陣、波段索引和一個使用者指定的回呼函數。
  • ST_MapAlgebra(運算式版本) — 運算式版本 - 傳回一個單波段點陣,其中包含一個或兩個輸入點陣、波段索引和一個或多個使用者指定的 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 個或多個波段組成的單一點陣。

11.13. 內建地圖代數回呼函數

  • ST_Distinct4ma — 點陣處理函數,用於計算鄰域中唯一像素值的數量。
  • ST_InvDistWeight4ma — 點陣處理函數,用於根據像素的鄰域內插像素的值。
  • ST_Max4ma — 點陣處理函數,用於計算鄰域中的最大像素值。
  • ST_Mean4ma — 點陣處理函數,用於計算鄰域中的平均像素值。
  • ST_Min4ma — 點陣處理函數,用於計算鄰域中的最小像素值。
  • ST_MinDist4ma — 點陣處理函數,傳回目標像素與具有值的相鄰像素之間的最小距離(以像素數量表示)。
  • ST_Range4ma — 點陣處理函數,用於計算鄰域中像素值的範圍。
  • ST_StdDev4ma — 點陣處理函數,用於計算鄰域中像素值的標準差。
  • ST_Sum4ma — 點陣處理函數,用於計算鄰域中所有像素值的總和。

11.14. 點陣處理:DEM(高程)

  • ST_Aspect — 傳回高程點陣波段的方位角(預設為度數)。適用於分析地形。
  • ST_HillShade — 使用提供的方位角、高度、亮度及比例輸入,傳回高程點陣波段的假設照明。
  • ST_Roughness — 傳回點陣,其中包含 DEM 的計算「粗糙度」。
  • ST_Slope — 傳回高程點陣波段的坡度(預設為度數)。適用於分析地形。
  • ST_TPI — 傳回點陣,其中包含計算的地形位置索引。
  • ST_TRI — 傳回點陣,其中包含計算的地形粗糙度指數。

11.15. 點陣處理:點陣到幾何圖形

  • Box3D — 傳回點陣外框的封閉方塊 3D 表示法。
  • ST_ConvexHull — 傳回點陣的凸包幾何圖形,包括等於 BandNoDataValue 的像素值。對於規則形狀且未傾斜的點陣,這會產生與 ST_Envelope 相同的結果,因此僅適用於不規則形狀或傾斜的點陣。
  • ST_DumpAsPolygons — 從給定的柵格波段傳回 geomval (geom,val) 列的集合。如果未指定波段編號,則波段編號預設為 1。
  • ST_Envelope — 傳回柵格範圍的 polygon 表示法。
  • ST_MinConvexHull — 傳回排除 NODATA 像素的柵格的凸包幾何。
  • ST_Polygon — 傳回由具有非無資料值之像素值的像素聯合形成的 multipolygon 幾何。如果未指定波段編號,則波段編號預設為 1。

11.16. 柵格運算子

  • && — 如果 A 的邊界框與 B 的邊界框相交,則傳回 TRUE
  • &< — 如果 A 的邊界框在 B 的左側,則傳回 TRUE
  • &> — 如果 A 的邊界框在 B 的右側,則傳回 TRUE
  • = — 如果 A 的邊界框與 B 的邊界框相同,則傳回 TRUE。使用雙精度邊界框。
  • @ — 如果 A 的邊界框包含在 B 的邊界框中,則傳回 TRUE。使用雙精度邊界框。
  • ~= — 如果 A 的邊界框與 B 的邊界框相同,則傳回 TRUE
  • ~ — 如果 A 的邊界框包含 B 的邊界框,則傳回 TRUE。使用雙精度邊界框。

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

11.18. 柵格提示

摘要

本節記錄與 PostGIS 柵格相關的各種陷阱和提示。

11.18.1. 外部資料庫柵格

11.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 是叢集的名稱,例如 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'
                    

11.18.1.2. 最大開啟檔案數

Linux 和 PostgreSQL 允許的最大開啟檔案數通常是保守的(通常每個程序 1024 個開啟檔案),因為假設系統被人類使用者消耗。對於外部資料庫柵格,單一有效查詢很容易超過此限制(例如,一個包含 10 年柵格的資料集,其中每天都有一個柵格,其中包含最低和最高溫度,而我們想知道該資料集中某個像素的絕對最小值和最大值)。

最容易進行的變更如下 PostgreSQL 設定:max_files_per_process。預設值設定為 1000,對於外部資料庫柵格而言太低。一個安全的起始值可以是 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 核心的開啟檔案限制。這有兩個部分

  • 整個系統的最大開啟檔案數

  • 每個程序的最大開啟檔案數

11.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
                    
11.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 中(並假設您使用 PostgreSQL 的 Ubuntu 套件),變更 軟限制硬限制 的最簡單方法是編輯 /etc/init.d/postgresql (SysV) 或 /lib/systemd/system/postgresql*.service (systemd)。

我們先處理 SysV Ubuntu 案例,將 ulimit -H -n 262144ulimit -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)
...

現在處理 systemd Ubuntu 案例。我們將 LimitNOFILE=131072 新增至每個 /lib/systemd/system/postgresql*.service 檔案中的 [Service] 區段。

...
[Service]

LimitNOFILE=131072

...

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

在進行必要的 systemd 變更之後,請務必重新載入 daemon

systemctl daemon-reload