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

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 --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

セッションを終了し、RDS for PostgreSQL DB インスタンスに 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: 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 クエリを実行して、所有権の変更を確認できます。または、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 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」を参照してください。

次の topology ステートメントを使用して SELECT スキーマへのアクセスをテストします。これにより、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 の新しいリリースでは、それぞれのリリースと互換性のある 1 つまたは複数のバージョンの PostGIS 拡張機能をサポートしています。PostgreSQL エンジンを新しいバージョンにアップグレードしても、PostGIS 拡張機能は自動的にアップグレードされません。PostgreSQL エンジンをアップグレードする前に、通常 PostGIS を現在の PostgreSQL バージョンで使用可能な最新バージョンにアップグレードします。詳細については、「PostGIS 拡張バージョン」を参照してください。

PostgreSQL エンジンのアップグレード後、PostGIS 拡張機能を再度アップグレードして、新しくアップグレードした PostgreSQL エンジンバージョンでサポートされているバージョンにアップグレードします。PostgreSQL のアップグレードの詳細については、「本番稼働用の DB クラスターの新しいメジャーバージョンへのアップグレードをテストする 」を参照してください。

Aurora PostgreSQL DB クラスター では、利用可能な 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 エンジンのメジャーアップグレードの準備のためにこの拡張機能をアップグレードした場合は、他の準備作業を継続できます。詳細については、「本番稼働用の DB クラスターの新しいメジャーバージョンへのアップグレードをテストする」を参照してください。

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 を新しいバージョンにアップグレードするには 2 つ目のアップグレードコマンドが必要です。

PostGIS 2 から PostGIS 3 にアップグレードするには
  1. お使いの Aurora PostgreSQL DB クラスターの PostgreSQL バージョンで利用可能な PostGIS のデフォルトバージョンを確認します。確認するために、以下のクエリを実行します。

    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 DB クラスターのライターインスタンス、の各データベースにインストールされている 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;