PostgreSQL postgisを有効にするには?

ショコラ
ショコラ

PostgreSQL postgisを有効にするには?

postgis が有効になっているドッカーイメージを使えばいいかな?

もっさん先輩
もっさん先輩

シチュエーション

PostgreSQLコンテナ で postgis を有効にしようとしたところ、エラーになってしまった。postgis を有効にするにはどうしたらよいだろうか?

postgres=# CREATE EXTENSION postgis;
postgres=# CREATE EXTENSION IF NOT EXISTS postgis;
ERROR:  機能拡張の制御ファイル"/usr/share/postgresql/14/extension/postgis.control"をオープンできませんでした: そのようなファイルやディレクトリはありません

PostgreSQLコンテナ にソースからインストールしようと思いましたが、Postgis が有効になっている↓のドッカーイメージを使うのが良いかなと思いました。

FROM postgis/postgis:14-master

postgis の使い方

カラムの定義には geography型 を使います。

lonlat geography

geography型 には GISTインデックス を使用する。

CREATE INDEX landmark_lonlat_idx ON landmark USING GIST(lonlat);

緯度経度から geography型 に変換する方法

SELECT ST_GeographyFromText('SRID=4326;POINT({経度} {緯度})');
postgres=# SELECT ST_GeographyFromText('SRID=4326;POINT(139.7649361 35.6812405)');
                st_geographyfromtext
----------------------------------------------------
 0101000020E6100000F4A0455B7A786140F81A82E332D74140
(1 行)

↑x と y ではなく1つの値になります。

ある地点から近い順に取得する方法。

SELECT * FROM landmark ORDER BY lonlat <-> ? limit 10;

?には geography の値を文字列で与えられました。

SELECT * FROM landmark ORDER BY lonlat <-> '0101000020E6100000F4A0455B7A786140F81A82E332D74140' limit 10;

2点間の距離を調べるには「<->」を使います。近い順に取得したときもこの記号でしたね。単位はメートルです。

SELECT '0101000020E6100000F4A0455B7A786140F81A82E332D74140'::geography <-> '0101000020E6100000A9F17794AF78614
0E413B2F336CF4140'::geography;
postgres=# SELECT '0101000020E6100000F4A0455B7A786140F81A82E332D74140'::geography <-> '0101000020E6100000A9F17794AF78614
0E413B2F336CF4140'::geography;
     ?column?
-------------------
 6960.703225202711
(1 行)
Scroll to Top