使用 PostGIS 扩展管理空间数据 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用 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 EXTENSION CREATE EXTENSION fuzzystrmatch; CREATE EXTENSION CREATE EXTENSION postgis_tiger_geocoder; CREATE EXTENSION CREATE 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 SCHEMA ALTER SCHEMA tiger_data OWNER TO rds_superuser; ALTER SCHEMA ALTER 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';

您还可以在以下内容中找到版本信息: