ショコラ
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 行)