以下列出的函式是 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);
本節列出專為支援網格功能而建立的 PostgreSQL 資料類型。
exclude_nodata_value
設定為 false,則會將所有包含 nodata
像素的像素都視為相交並傳回值。如果未傳入 exclude_nodata_value
,則會從光柵的元數據讀取。NODATA
值。NODATA
值。crop
或為 TRUE,則會裁剪輸出點陣。如果將 touched
設定為 TRUE,則會包含接觸到的像素,否則只有在像素中心位於幾何圖形中時才會包含。本節記錄與 PostGIS 柵格相關的各種陷阱和提示。
當 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'
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 核心的開啟檔案限制。這有兩個部分
整個系統的最大開啟檔案數
每個程序的最大開啟檔案數
您可以使用以下範例檢查整個系統的目前最大開啟檔案數
$ 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
我們需要增加 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 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)
...
現在處理 systemd Ubuntu 案例。我們將 LimitNOFILE=131072 新增至每個 /lib/systemd/system/postgresql*.service 檔案中的 [Service] 區段。
...
[Service]
LimitNOFILE=131072
...
[Install]
WantedBy=multi-user.target
...
在進行必要的 systemd 變更之後,請務必重新載入 daemon
systemctl daemon-reload