PostGISによる地理空間インデックス
PostGIS拡張を追加し、geometry/geographyを保存して、GiSTインデックスで空間関係を検索します。
「PostGISによる地理空間インデックス」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
PostGISとは
オープンソースDBで最も強力な地理空間拡張です。geometry/geography型、数百の空間関数、そして高速な空間クエリを可能にするGiST/SP-GiSTインデックスを追加します。
PostGISを有効にする
contrib拡張として提供されています。
CREATE EXTENSION postgis;
SELECT PostGIS_Version();GEOMETRYとGEOGRAPHY
- GEOMETRY — 平面上のデータ。高速で、単位は座標系に依存します(通常はメートルまたは度)
- GEOGRAPHY — 球面上の地球を扱います。処理は遅くなりますが、単位は常にメートルです
地域をまたぐデータで「地球上の距離」を求める場合はGEOGRAPHYを、投影座標系(地域GISや高速な処理)にはGEOMETRYを選びます。
ポイントを保存する
緯度・経度をGEOGRAPHYのポイントとして保存する一般的な方法です。
CREATE TABLE places (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
location GEOGRAPHY(POINT, 4326)
);
INSERT INTO places (name, location)
VALUES ('Berlin', ST_GeogFromText('SRID=4326;POINT(13.405 52.520)'));SRID
「Spatial Reference ID」は座標系を定義します。WGS84(ID 4326)はGPSの緯度・経度で標準的に使われます。
GiST空間インデックス
GiSTを使ってジオメトリ列にインデックスを作成します。
CREATE INDEX places_location_idx ON places USING GIST (location);
-- Now spatial filters are fast.最近傍検索:<->
インデックスと<->KNN演算子を使うと、最近傍の結果をミリ秒単位で取得できます。
SELECT name, ST_Distance(location, ST_GeogFromText('SRID=4326;POINT(13.4 52.5)')) AS m
FROM places
ORDER BY location <-> ST_GeogFromText('SRID=4326;POINT(13.4 52.5)')
LIMIT 10;距離内を検索する
ある地点から2km以内の場所を検索します。
SELECT name FROM places
WHERE ST_DWithin(
location,
ST_GeogFromText('SRID=4326;POINT(13.4 52.5)'),
2000 -- meters
);ポリゴンと面積
ポリゴン(市区町村の境界や配送エリアなど)を保存して検索します。
CREATE TABLE zones (
id BIGSERIAL PRIMARY KEY,
name TEXT,
area GEOGRAPHY(POLYGON, 4326)
);
-- Find places inside a zone:
SELECT p.name FROM places p
JOIN zones z ON ST_Within(p.location::GEOMETRY, z.area::GEOMETRY)
WHERE z.name = 'Mitte';交差、包含、内包
ST_Intersects、ST_Contains、ST_Within、ST_Touches、ST_Disjoint、ST_Equalsなど、豊富な空間述語を利用できます。
GeoJSONを読み込む
GeoJSONをPostGISに直接インポートします。
INSERT INTO zones (name, area)
SELECT 'Mitte', ST_GeogFromGeoJSON('{"type":"Polygon","coordinates":[...]}');ベクタタイルの生成
PostGIS 3.0以降では、ST_AsMVTを使ってMapboxベクタタイルを直接生成できます。DBから地図UIをそのまま動かせます。
まとめ
PostGISによって、Postgresを本格的なGISエンジンとして利用できます。
- 投影座標系にはGEOMETRY、地球上の距離にはGEOGRAPHY
- 空間フィルターとKNNにはGiSTインデックス
- ST_DWithin、ST_Distance、ST_Within
- SRID 4326 = WGS84の緯度・経度
クイックチェック
ユーザーの位置をGEOGRAPHY(POINT)として保存しています。「5km以内を検索する」クエリを高速化するインデックスの種類はどれですか?
よくある質問
「PostGISによる地理空間インデックス」レッスンは無料ですか?
はい。「PostGISによる地理空間インデックス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「PostGISによる地理空間インデックス」で何を学びますか?
PostGIS拡張を追加し、geometry/geographyを保存して、GiSTインデックスで空間関係を検索します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「PostGISによる地理空間インデックス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ファジーマッチングのためのトライグラム検索(pg_trgm)
- tsvectorとGINによる全文検索
- PostGISによる地理空間インデックス
- pgvectorによるベクトル検索