0Pricing
SQL Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ファジーマッチングのためのトライグラム検索(pg_trgm)
  2. tsvectorとGINによる全文検索
  3. PostGISによる地理空間インデックス
  4. pgvectorによるベクトル検索
← SQL Academyに戻る