PostGIS 拡張機能を使用した空間データの管理 - Amazon Relational Database Service

PostGIS 拡張機能を使用した空間データの管理

PostGIS は PostgreSQL のエクステンションであり、空間情報の保存と管理に使用します。PostGIS の詳細については、「Postgis.net」を参照してください。

バージョン 10.5 以降の PostgreSQL では、PostGIS がマップボックスのベクトルタイルデータを操作するために使用する libprotobuf 1.3.0 ライブラリがサポートされています。

PostGIS 拡張機能のセットアップには、rds_superuser 権限が必要です。PostGIS 拡張機能と空間データを管理するためのユーザ (ロール) を作成することをお勧めします。PostGIS 拡張機能とその関連コンポーネントは PostgreSQL に数千もの関数を追加します。ユースケースに適している場合は、PostGIS エクステンションを独自のスキーマで作成することを検討してください。次の例は、拡張機能を別個のデータベースにインストールする方法を示していますが、これは必須ではありません。

ステップ 1: PostGIS 拡張機能を管理するユーザー (ロール) を作成する

まず、rds_superuser 権限があるユーザーとして RDS for PostgreSQL DB インスタンスに接続します。インスタンスの設定時にデフォルトの名前を保持している場合は、次のように postgres として接続します。

psql=> 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 アーティファクトに使用するデータベースを作成します。

postgres=> CREATE DATABASE lab_gis; CREATE DATABASE

gis_adminlab_gis データベース上のすべての特権を付与します。

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

セッションを終了し、RDS for PostgreSQL DB インスタンスに gis_admin として再接続します。

postgres=> --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 エクステンションを読み込む

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 | 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 クエリを実行して、所有権の変更を確認できます。または、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 | postgres tiger | gis_admin tiger_data | gis_admin topology | gis_admin (4 rows)

ステップ 4: PostGIS オブジェクトの所有権を移転する

次の関数を使用して、gis_admin ロールに PostGIS オブジェクトの所有権を移転します。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 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 の異なるバージョンでは、異なるバージョンの PostGIS 拡張機能がサポートされます。次のコマンドを実行すると、アップグレードが使用可能かどうかを確認できます。この関数は、PostGIS 2.5.0 以降のバージョンで使用できます。

SELECT PostGIS_Extensions_Upgrade();

アップグレード前のバージョンによっては、この関数を 2 回実行する必要があります。初期に関数を実行した結果によって、追加のアップグレード関数が必要かどうかが決まります。

アプリケーションで最新の PostGIS バージョンがサポートされていない場合でも、次のように、メジャーバージョンで使用できる古いバージョンの PostGIS を作成できます。

CREATE EXTENSION postgis VERSION "2.5.5"

古いバージョンから特定の PostGIS バージョンにアップグレードする場合は、次のコマンドも使用できます。

ALTER EXTENSION postgis UPDATE TO "2.5.5"

PostGIS 拡張バージョン

次のコマンドを使用して、リリースで利用可能なバージョンを一覧表示できます。

SELECT * FROM pg_available_extension_versions WHERE name='postgis';

バージョン情報は、Amazon RDS for PostgreSQL リリースノートの次のセクションでも確認できます。