使用 PostGIS 擴充功能管理空間資料 - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 PostGIS 擴充功能管理空間資料

PostGIS 是 PostgreSQL 的擴充功能,可用於儲存和管理空間資訊。若要進一步了解 PostGIS,請參閱 PostGIS.net

從 10.5 版開始,PostgreSQL 即支援 PostGIS 用於處理 Mapbox向量圖標資料的 libprotobuf 1.3.0 程式庫。

設定 PostGIS 擴充功能需要 rds_superuser 權限。我們建議您建立一使用者 (角色) 來管理 PostGIS 擴充功能及您的空間資料。PostGIS 擴充功能及其相關元件會為 PostgreSQL 新增數千個函數。若這對您的使用案例有意義,請考慮在其自己的結構描述中建立 PostGIS 擴充功能。下列範例會顯示如何在其自己的資料庫中安裝擴充功能,但這並非必要。

步驟 1:建立使用者 (角色) 來管理 PostGIS 擴充功能

首先,以具有 rds_superuser 權限的使用者身分連線至您的 RDS for PostgreSQL 資料庫執行個體。若您在設定執行個體時保留預設名稱,則以 postgres 身分連線:

psql --host=111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password

建立一個單獨的角色 (使用者) 來管理 PostGIS 擴充功能。

postgres=> CREATE ROLE gis_admin LOGIN PASSWORD 'change_me'; CREATE ROLE

授予此角色 rds_superuser 權限,允許角色安裝擴充功能。

postgres=> GRANT rds_superuser TO gis_admin; GRANT

建立用於 PostGIS 成品的資料庫:此為選擇性步驟。或者,您可以在 PostGIS 擴充功能的使用者資料庫中建立結構描述,但這也並非必要。

postgres=> CREATE DATABASE lab_gis; CREATE DATABASE

授予 gis_adminlab_gis 資料庫上的所有權限。

postgres=> GRANT ALL PRIVILEGES ON DATABASE lab_gis TO gis_admin; GRANT

退出工作階段,並以 gis_admin 身分重新連線至您的 RDS for PostgreSQL 資料庫執行個體。

postgres=> psql --host=111122223333.aws-region.rds.amazonaws.com --port=5432 --username=gis_admin --password --dbname=lab_gis Password for user gis_admin:... lab_gis=>

按照後續步驟中的詳細說明,繼續設定擴充功能。

步驟 2:載入 PostGIS 擴充功能

PostGIS 擴充功能包含數個共同運作的相關擴充功能,以提供地理空間的功能。根據您的使用案例,可能不需要在此步驟中建立的所有擴充功能。

使用 CREATE EXTENSION 陳述式載入 PostGIS 擴充。

CREATE EXTENSION postgis; CREATE EXTENSION CREATE EXTENSION postgis_raster; CREATE EXTENSION CREATE EXTENSION fuzzystrmatch; CREATE EXTENSION CREATE EXTENSION postgis_tiger_geocoder; CREATE EXTENSION CREATE EXTENSION postgis_topology; CREATE EXTENSION CREATE EXTENSION address_standardizer_data_us; CREATE EXTENSION

您可以執行下例中顯示的 SQL 查詢來確認結果,其中列出擴充功能及其擁有者。

SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner" FROM pg_catalog.pg_namespace n WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema' ORDER BY 1; List of schemas Name | Owner --------------+----------- public | postgres tiger | rdsadmin tiger_data | rdsadmin topology | rdsadmin (4 rows)

步驟 3:轉移擴充功能的所有權

使用 ALTER SCHEMA 陳述式將結構描述的擁有權移轉至 gis_admin 角色。

ALTER SCHEMA tiger OWNER TO gis_admin; ALTER SCHEMA ALTER SCHEMA tiger_data OWNER TO gis_admin; ALTER SCHEMA ALTER SCHEMA topology OWNER TO gis_admin; ALTER SCHEMA

您可執行下列 SQL 查詢,來確認所有權變更。您也可以使用 \dn 中繼命令和 psql 命令列。

SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner" FROM pg_catalog.pg_namespace n WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema' ORDER BY 1; List of schemas Name | Owner --------------+--------------- public | postgres tiger | gis_admin tiger_data | gis_admin topology | gis_admin (4 rows)

步驟 4:轉移 PostGIS 物件的所有權

使用下列函式將 PostGIS 物件的擁有權移轉至 gis_admin 角色。從 psql 提示字元執行下列陳述式來建立函式。

CREATE FUNCTION exec(text) returns text language plpgsql volatile AS $f$ BEGIN EXECUTE $1; RETURN $1; END; $f$; CREATE FUNCTION

接下來,執行下列查詢來執行 exec 函數,該函數會執行陳述式及變更權限。

SELECT exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' || quote_ident(s.relname) || ' OWNER TO gis_admin;') FROM ( SELECT nspname, relname FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid) WHERE nspname in ('tiger','topology') AND relkind IN ('r','S','v') ORDER BY relkind = 'S') s;

步驟 5:測試擴充功能

為避免需要指定結構描述名稱,請使用下列命令將 tiger 結構描述新增至您的搜尋路徑。

SET search_path=public,tiger; SET

使用下列 SELECT 陳述式來測試 tiger 結構描述。

SELECT address, streetname, streettypeabbrev, zip FROM normalize_address('1 Devonshire Place, Boston, MA 02109') AS na; address | streetname | streettypeabbrev | zip ---------+------------+------------------+------- 1 | Devonshire | Pl | 02109 (1 row)

要進一步了解此擴充功能,請參閱 PostGIS 文件中的 Tiger Geocoder (Tiger 地理編碼器)。

使用下列 SELECT 陳述式來測試存取 topology 結構描述。這樣會呼叫 createtopology 函數,以使用指定的空間參考識別碼 (26986) 和預設公差 (0.5) 註冊新拓撲物件 (my_new_topo)。若要進一步了解,請參閱 PostGIS 文件CreateTopology中的。

SELECT topology.createtopology('my_new_topo',26986,0.5); createtopology ---------------- 1 (1 row)

步驟 6:升級 PostGIS 擴充功能

每個新版本的 PostgreSQL 都支援一個或多個與該版本相容的 PostGIS 擴充功能版本。將 PostgreSQL 引擎升級到新版本並不會自動升級 PostGIS 擴充功能。升級 PostgreSQL 引擎之前,您通常會將 PostGIS 升級到目前 PostgreSQL 版本的最新可用版本。如需詳細資訊,請參閱 PostGIS 擴充功能版本

PostgreSQL 引擎升級之後,接著再次將 PostGIS 擴充功能升級為支援新升級之 PostgreSQL 引擎版本的版本。如需升級 PostgreSQL 資料庫引擎的詳細資訊,請參閱 測試執行生產資料庫叢集升級到新主要版本的程序.

您可以隨時在 Aurora PostgreSQL 資料庫叢集上檢查可用的 PostGIS 擴充功能版本更新。若要這麼做,請執行下列命令。PostGIS 2.5.0 和更新版本可使用此功能。

SELECT postGIS_extensions_upgrade();

如果您的應用程式不支援最新的 PostGIS 版本,您仍然可以安裝主要版本中可用的舊版 PostGIS,如下所示。

CREATE EXTENSION postgis VERSION "2.5.5";

如果您想要從舊版本升級到特定的 PostGIS 版本,也可以使用以下命令。

ALTER EXTENSION postgis UPDATE TO "2.5.5";

視您要從哪個版本升級而定,您可能需要再次執行此函數。第一次執行函數的結果會決定是否需要額外的升級函數。例如,這是從 PostGIS 2 升級到 PostGIS 3 的情況。如需詳細資訊,請參閱 將 PostGIS 2 升級到 PostGIS 3

如果您升級此擴充功能以準備 PostgreSQL 引擎的主要版本升級,您可以繼續執行其他初步工作。如需詳細資訊,請參閱 測試執行生產資料庫叢集升級到新主要版本的程序

PostGIS 擴充功能版本

我們建議您安裝所有擴充功能的版本,例如在Aurora PostgreSQL 版本備註》中的 Aurora PostgreSQL 相容擴充功能版本所列出的 PostGIS。若要取得您的發行版本中有哪些可用版本,請使用下列命令。

SELECT * FROM pg_available_extension_versions WHERE name='postgis';

您也可以在 Aurora PostgreSQL 版本備註的以下各節找到版本資訊:

將 PostGIS 2 升級到 PostGIS 3

從 3.0 版開始,PostGIS 點陣函數現在是一個單獨的擴充功能,postgis_raster。此擴充功能具有自己的安裝和升級路徑。如此一來,可以從核心 postgis 擴充功能移除點陣影像處理所需的數十種函數、資料類型和其他成品。這意味著,如果您的使用案例不需要點陣處理,則不需要安裝 postgis_raster 擴充功能。

在以下升級範例中,第一個升級命令會將點陣函數擷取至 postgis_raster 擴充功能。接著便需要第二個升級命令將 postgres_raster 升級到新版本。

從 PostGIS 2 升級到 PostGIS 3
  1. 識別可用於 PostgreSQL 版本的 PostGIS 預設版本,而其中 PostgreSQL 位於您的 Aurora PostgreSQL 資料庫叢集。若要這麼做,請執行下列查詢。

    SELECT * FROM pg_available_extensions WHERE default_version > installed_version;   name   | default_version | installed_version |                          comment ---------+-----------------+-------------------+------------------------------------------------------------  postgis | 3.1.4           | 2.3.7             | PostGIS geometry and geography spatial types and functions (1 row)
  2. 識別 Aurora PostgreSQL 資料庫叢集的寫入器執行個體上,每個資料庫中安裝的 PostGIS 版本。換句話說,查詢每個使用者資料庫,如下所示。

    SELECT e.extname AS "Name", e.extversion AS "Version", n.nspname AS "Schema", c.description AS "Description" FROM pg_catalog.pg_extension e LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass WHERE e.extname LIKE '%postgis%' ORDER BY 1;   Name   | Version | Schema |                             Description ---------+---------+--------+---------------------------------------------------------------------  postgis | 2.3.7   | public | PostGIS geometry, geography, and raster spatial types and functions (1 row)

    預設版本 (PostGIS 3.1.4) 與安裝的版本 (PostGIS 2.3.7) 之間不符,代表您需要升級 PostGIS 擴充功能。

    ALTER EXTENSION postgis UPDATE; ALTER EXTENSION WARNING: unpackaging raster WARNING: PostGIS Raster functionality has been unpackaged
  3. 執行下列查詢,以確認點陣函數現在位於其自己的套件中。

    SELECT probin, count(*) FROM pg_proc WHERE probin LIKE '%postgis%' GROUP BY probin;           probin          | count --------------------------+-------  $libdir/rtpostgis-2.3    | 107  $libdir/postgis-3        | 487 (2 rows)

    輸出結果顯示版本之間仍然存在差異。PostGIS 函數是第 3 版 (postgis-3),而點陣函數 (rtpostgis) 是第 2 版 (rtpostgis-2.3)。若要完成升級,請再次執行升級命令,如下所示。

    postgres=> SELECT postgis_extensions_upgrade();

    您可以放心忽略警告訊息。再次執行下列查詢以確認升級是否已完成。當 PostGIS 和所有相關的擴充功能均未標記為需要升級時,則升級完成。

    SELECT postgis_full_version();
  4. 使用下列查詢來查看已完成的升級程序和個別套裝的擴充功能,並確認其版本是否相符。

    SELECT e.extname AS "Name", e.extversion AS "Version", n.nspname AS "Schema", c.description AS "Description" FROM pg_catalog.pg_extension e LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass WHERE e.extname LIKE '%postgis%' ORDER BY 1;       Name      | Version | Schema |                             Description ----------------+---------+--------+---------------------------------------------------------------------  postgis        | 3.1.5   | public | PostGIS geometry, geography, and raster spatial types and functions  postgis_raster | 3.1.5   | public | PostGIS raster types and functions (2 rows)

    輸出結果顯示 PostGIS 2 擴充功能已升級到 PostGIS 3,並且 postgis 和現在的個別 postgis_raster 擴充功能則為 3.1.5 版。

升級完成後,如果您不打算使用點陣函數,您可以按以下方式卸除擴充功能。

DROP EXTENSION postgis_raster;