本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Post GIS 擴充功能管理空間資料
Post GIS 是 Postgre 的擴展,SQL用於存儲和管理空間信息。若要進一步了解貼文GIS,請參閱發佈 GIS .net
從版本 10.5 開始,Postgre SQL 支持由郵政GIS用於處理地圖框向量圖塊數據的 libprotobuf 1.3.0 庫。
設定 Post GIS 擴充功能需要rds_superuser
權限。我們建議您建立使用者 (角色) 來管理 Post GIS 擴充功能和空間資料。郵政GIS擴展及其相關組件添加成千上萬的功能,以 Postgre SQL。如果這對您的使用案例有意義,請考慮在其自己的結構描述中建立 Post GIS 擴充功能。下列範例會顯示如何在其自己的資料庫中安裝擴充功能,但這並非必要。
主題
步驟 1:建立使用者 (角色) 以管理 Post GIS 擴充功能
首先,以具有rds_superuser
權限的使用者身分連線到您的 RDS Postgre SQL 資料庫執行個體。若您在設定執行個體時保留預設名稱,則以 postgres
身分連線:
psql --host=
111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres --password
建立個別角色 (使用者) 來管理 Post GIS 擴充功能。
postgres=>
CREATE ROLE
gis_admin
LOGIN PASSWORD 'change_me
';CREATE ROLE
授予此角色 rds_superuser
權限,允許角色安裝擴充功能。
postgres=>
GRANT rds_superuser TO
gis_admin
;GRANT
建立用於 Post GIS 成品的資料庫。此為選擇性步驟。或者,您可以在 Post GIS 擴展的用戶數據庫中創建模式,但這也不是必需的。
postgres=>
CREATE DATABASE
lab_gis
;CREATE DATABASE
授予 gis_admin
在 lab_gis
資料庫上的所有權限。
postgres=>
GRANT ALL PRIVILEGES ON DATABASE lab_gis TO gis_admin;
GRANT
結束工作階段並重新連線至 Postgre SQL 資料庫執行個體的RDS身gis_admin
分。
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:載入貼文GIS擴充功能
Post GIS 擴充功能包含數個共同運作以提供地理空間功能的相關擴充功能。根據您的使用案例,可能不需要在此步驟中建立的所有擴充功能。
使用CREATE EXTENSION
陳述式載入 Post GIS 擴充功能。
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:轉移擴充功能的所有權
使用ALTERSCHEMA陳述式將結構描述的擁有權轉移至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:轉移 Post GIS 物件的所有權
使用下列函數將 Post GIS 物件的擁有權轉移至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
使用下列陳tiger
述式測試結構描SELECT述。
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)
要了解有關此擴展的更多信息,請參閱帖子文GIS檔中的 Tiger Geocoder
使用下列 SELECT
陳述式來測試存取 topology
結構描述。這樣會呼叫 createtopology
函數,以使用指定的空間參考識別碼 (26986) 和預設公差 (0.5) 註冊新拓撲物件 (my_new_topo)。若要進一步了解,請參閱 Post GIS 文件CreateTopology
SELECT topology.createtopology('my_new_topo',26986,0.5);
createtopology ---------------- 1 (1 row)
步驟 6:升級貼文GIS擴充功能
每個新版 Postgre 都SQL支援一個或多個與該版本相容的 Post GIS 延伸功能版本。將 Postgre SQL 引擎升級到新版本並不會自動升級 Post GIS 擴充功能。在升級 Postgre SQL 引擎之前,您通常會將 Post 升級GIS到當前 Postgre SQL 版本的最新可用版本。如需詳細資訊,請參閱 後GIS延伸功能版本。
Postgre SQL 引擎升級之後,您接著再次將 Post GIS 延伸功能升級為支援新升級的 Postgre SQL 引擎版本的版本。 如何執行主要版本升級。
您可以隨時查看適用於 Postgre 資料庫執行個體的 上是否有可RDS用的後GISSQL延伸功能版本更新。若要這麼做,請執行下列命令。此功能適用於 GIS 2.5.0 及更高版本。
SELECT postGIS_extensions_upgrade();
如果您的應用程序不支持最新的 Post GIS 版本,則可以安裝主要版本中提供GIS的舊版 Post,如下所示。
CREATE EXTENSION postgis VERSION "2.5.5";
如果要從舊版本升級到特定的 Post GIS 版本,也可以使用以下命令。
ALTER EXTENSION postgis UPDATE TO "2.5.5";
視您要從哪個版本升級而定,您可能需要再次執行此函數。第一次執行函數的結果會決定是否需要額外的升級函數。例如,這是從帖子 GIS 2 升級到帖子 GIS 3 的情況。如需詳細資訊,請參閱將帖子 GIS 2 升級到帖子 GIS 3。
如果您升級此擴充功能以準備 Postgre SQL 引擎的主要版本升級,您可以繼續執行其他初步工作。如需詳細資訊,請參閱如何執行主要版本升級。
後GIS延伸功能版本
我們建議您安裝所有擴充功能的版本,例如 Post GIS 版本。SQLAmazon Postgre SQL Amazon RDS 的擴展版本,用RDS於 Postgre SQL 發行說明。若要取得您的發行版本中有哪些可用版本,請使用下列命令。
SELECT * FROM pg_available_extension_versions WHERE name='postgis';
您可以在RDS適用於 Postgre SQL 發行說明的 Amazon 的以下各節中找到版本資訊:
將帖子 GIS 2 升級到帖子 GIS 3
從 3.0 版開始,Post GIS 光柵功能現在是一個單獨的擴展,postgis_raster
。此擴充功能具有自己的安裝和升級路徑。如此一來,可以從核心 postgis
擴充功能移除點陣影像處理所需的數十種函數、資料類型和其他成品。這意味著,如果您的使用案例不需要點陣處理,則不需要安裝 postgis_raster
擴充功能。
在以下升級範例中,第一個升級命令會將點陣函數擷取至 postgis_raster
擴充功能。接著便需要第二個升級命令將 postgis_raster
升級到新版本。
若要從貼文 GIS 2 升級至貼文 GIS 3
識別 A 叢集上的 Postgre SQL 版本可用的預設貼GIS文版本。RDS對於後置SQL數據庫實例。若要這麼做,請執行下列查詢。
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)
識別 st 版本。 你RDS的SQL數據庫實例。換句話說,查詢每個使用者資料庫,如下所示。
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)
默認版本(發布 GIS 3.1.4)和安裝的版本(發布 GIS 2.3.7)之間的不匹配意味著您需要升級 Post 擴展。GIS
ALTER EXTENSION postgis UPDATE;
ALTER EXTENSION WARNING: unpackaging raster WARNING: PostGIS Raster functionality has been unpackaged
執行下列查詢,以確認點陣函數現在位於其自己的套件中。
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)
輸出結果顯示版本之間仍然存在差異。帖子GIS功能是版本 3(後置 -3),而光柵函數(rtpostgis)是版本 2(rtpostgis-2.3)。若要完成升級,請再次執行升級命令,如下所示。
postgres=>
SELECT postgis_extensions_upgrade();您可以放心忽略警告訊息。再次執行下列查詢以確認升級是否已完成。當 Post GIS 和所有相關的擴充功能未標示為需要升級時,升級即完成。
SELECT postgis_full_version();
使用下列查詢來查看已完成的升級程序和個別套裝的擴充功能,並確認其版本是否相符。
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)
輸出顯示 Post GIS 2 擴展已升級到 Post GIS 3,並且現在單獨的
postgis_raster
擴展都postgis
是版本 3.1.5。
升級完成後,如果您不打算使用點陣函數,您可以按以下方式卸除擴充功能。
DROP EXTENSION postgis_raster;