使用 PostGIS 扩展管理空间数据
PostGIS 是一个 PostgreSQL 扩展,用于存储和管理空间信息。要了解有关 PostGIS 的更多信息,请参阅 PostGIS.net
从版本 10.5 开始,PostgreSQL 支持 PostGIS 用于处理地图框矢量平铺数据的 libprotobuf 1.3.0 库。
使用 PostGIS 扩展之前,您需要执行一些设置。以下列表显示需要执行的操作。本节稍后将详细介绍每个步骤。
主题
步骤 1:使用用于创建数据库实例的用户名连接到数据库实例
首先,使用用于创建数据库实例的用户名连接到数据库实例。将自动为该名称分配 rds_superuser 角色。您需要 rds_superuser 角色执行剩余的步骤。
以下示例使用 SELECT 向您展示当前用户。在这种情况下,当前用户应该是您在创建数据库实例时选择的用户名。
SELECT CURRENT_USER;current_user ------------- myawsuser (1 row)
步骤 2:加载 PostGIS 扩展
使用 CREATE EXTENSION 语句加载 PostGIS 扩展。
CREATE EXTENSION postgis;CREATE EXTENSIONCREATE EXTENSION fuzzystrmatch;CREATE EXTENSIONCREATE EXTENSION postgis_tiger_geocoder;CREATE EXTENSIONCREATE EXTENSION postgis_topology;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 | myawsuser tiger | rdsadmin tiger_data | rdsadmin topology | rdsadmin (4 rows)
如果您使用 psql 命令行,您可以通过运行 \dn 元命令获取相同的信息。
有些使用案例不需要额外的扩展程序。
步骤 3:将扩展的所有权移交给 rds_superuser 角色
使用 ALTER SCHEMA 语句将架构的所有权移交给 rds_superuser 角色。
ALTER SCHEMA tiger OWNER TO rds_superuser;ALTER SCHEMAALTER SCHEMA tiger_data OWNER TO rds_superuser;ALTER SCHEMAALTER SCHEMA topology OWNER TO rds_superuser;ALTER SCHEMA
如果要确认所有权更改,您可以运行以下 SQL 查询。或者,您也可以从 psql 命令行使用 \dn 元命令。
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 | myawsuser tiger | rds_superuser tiger_data | rds_superuser topology | rds_superuser (4 rows)
步骤 4:将对象的所有权移交给 rds_superuser 角色
使用以下函数将 PostGIS 对象的所有权移交给 rds_superuser 角色。从 psql 提示符处运行以下语句以创建此函数。
CREATE FUNCTION exec(text) returns text language plpgsql volatile AS $f$ BEGIN EXECUTE $1; RETURN $1; END; $f$;
接下来,运行以下查询以运行 exec 函数,该函数进而将运行语句并更改权限。
SELECT exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' || quote_ident(s.relname) || ' OWNER TO rds_superuser;') 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;
使用以下 SELECT 语句测试 tiger。
SELECT na.address, na.streetname, na.streettypeabbrev, na.zip FROM normalize_address('1 Devonshire Place, Boston, MA 02109') AS na;address | streetname | streettypeabbrev | zip ---------+------------+------------------+------- 1 | Devonshire | Pl | 02109 (1 row)
使用以下 SELECT 语句测试 topology。
SELECT topology.createtopology('my_new_topo',26986,0.5);createtopology ---------------- 1 (1 row)
步骤 6:更新 PostGIS 扩展
PostgreSQL 次要版本 13.4、12.8、11.13 和 10.18 支持 GIS 扩展的 3.1.4 版本。这种支持使得升级到 PostgreSQL 的后续主要版本变得更加容易。
如果安装了较早版本的 PostGIS,请使用以下命令将扩展从旧版本升级到 3.1.4。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 扩展版本
您可以使用以下命令列出您发行版本中可用的 PostGIS 扩展版本。
SELECT * from pg_available_extension_versions where name='postgis';
您还可以在以下内容中找到版本信息: