GIS入門:PostgreSQLで描く多角形 - ポリゴンデータ型の基礎から応用まで


このガイドでは、PostgreSQLにおけるポリゴンデータ型、その使用方法、および関連する関数について詳しく説明します。

ポリゴンデータ型とは?

ポリゴンデータ型は、平面上の閉じた図形を表すために使用されます。複数の線で接続された3つ以上の座標点で定義されます。ポリゴンは、土地の境界線、建物、湖など、さまざまな形状を表現するために使用できます。

PostgreSQLには、ポリゴンデータ型を格納するための 2 つの主要なデータ型があります。

  • polygonZ
    閉じたポリゴンと Z 座標値を表します。Z 座標値は、ポリゴンの高さを表すために使用できます。
  • polygon
    閉じたポリゴンを表します。

ポリゴンデータ型の構文

ポリゴンデータ型は、次の構文のいずれかでリテラルとして指定できます。

polygon((x0, y0), (x1, y1), ..., (xn, yn))

この構文では、(x0, y0)(x1, y1) ... (xn, yn) は、ポリゴンの境界を構成する線分の端点座標を表す座標点のペアです。最後の座標点は最初の座標点と接続されている必要があり、ポリゴンが閉じていることを示します。

ポリゴンデータ型の操作

PostgreSQLには、ポリゴンデータ型を作成、操作、分析するためのさまざまな関数があります。以下に、よく使用される関数の例をいくつか示します。

  • ST_Difference
    2 つのポリゴンの差を計算します。
  • ST_Union
    2 つのポリゴンを結合します。
  • ST_Intersects
    2 つのポリゴンが交差しているかどうかを判断します。
  • ST_IsValid
    ポリゴンが有効かどうかを確認します。
  • ST_Perimeter
    ポリゴンの周長を計算します。
  • ST_Area
    ポリゴンの面積を計算します。
  • ST_AsText
    ポリゴンデータ型を文字列表現に変換します。
  • ST_GeomFromText
    文字列表現からポリゴンデータ型を作成します。

ポリゴンデータ型の例

次の例では、polygon データ型を使用して、長方形と三角形のポリゴンを作成する方法を示します。

-- 長方形を作成
CREATE TABLE my_table (
  id serial PRIMARY KEY,
  shape polygon
);

INSERT INTO my_table (shape)
VALUES (
  ST_GeomFromText('POLYGON((0, 0), (5, 0), (5, 3), (0, 3), (0, 0))')
);

-- 三角形を作成
INSERT INTO my_table (shape)
VALUES (
  ST_GeomFromText('POLYGON((0, 0), (5, 4), (2.5, 8), (0, 0))')
);

この例では、my_table という名前のテーブルを作成し、idshape という 2 つの列があります。id 列はプライマリ キーであり、shape 列は polygon データ型です。

最初の INSERT ステートメントは、座標点 (0, 0)(5, 0)(5, 3)(0, 3) で定義される長方形を作成します。2 番目の INSERT ステートメントは、座標点 (0, 0)(5, 4)(2.5, 8) で定義される三角形を作成します。

ポリゴンデータ型は、PostgreSQL で空間データを処理するための強力なツールです。さまざまな形状を表現し、それらの形状に対してさまざまな操作を実行するために使用できます。

このガイドで説明した概念と関数を理解することで、PostgreSQL で空間データを効果的に活用することができます。



矩形と三角形の作成

この例では、polygon データ型を使用して長方形と三角形を作成する方法を示します。

-- 長方形を作成
CREATE TABLE my_table (
  id serial PRIMARY KEY,
  shape polygon
);

INSERT INTO my_table (shape)
VALUES (
  ST_GeomFromText('POLYGON((0, 0), (5, 0), (5, 3), (0, 3), (0, 0))')
);

-- 三角形を作成
INSERT INTO my_table (shape)
VALUES (
  ST_GeomFromText('POLYGON((0, 0), (5, 4), (2.5, 8), (0, 0))')
);

ポリゴンデータ型の面積と周長の計算

この例では、ST_AreaST_Perimeter 関数を使用して、ポリゴンデータ型の面積と周長を計算する方法を示します。

-- 長方形の面積と周長を計算
SELECT
  ST_Area(shape) AS area,
  ST_Perimeter(shape) AS perimeter
FROM my_table
WHERE id = 1;

-- 三角形の面積と周長を計算
SELECT
  ST_Area(shape) AS area,
  ST_Perimeter(shape) AS perimeter
FROM my_table
WHERE id = 2;

2つのポリゴンの交差判定

この例では、ST_Intersects 関数を使用して、2つのポリゴンが交差しているかどうかを判断する方法を示します。

-- 2つのポリゴンが交差しているかどうかを確認
SELECT
  ST_AsText(ST_Intersects(shape1, shape2)) AS intersection
FROM my_table AS t1
JOIN my_table AS t2
ON t1.id != t2.id;

この例では、my_table テーブル内のすべてのポリゴンペアに対して、ST_Intersects 関数を使用して、2つのポリゴンが交差しているかどうかを判断します。結果として、交差するポリゴンペアのペアが表示されます。

2つのポリゴンの結合

この例では、ST_Union 関数を使用して、2つのポリゴンを結合する方法を示します。

-- 2つのポリゴンを結合
SELECT
  ST_AsText(ST_Union(shape1, shape2)) AS unioned_shape
FROM my_table AS t1
JOIN my_table AS t2
ON t1.id != t2.id;

この例では、my_table テーブル内のすべてのポリゴンペアに対して、ST_Union 関数を使用して、2つのポリゴンを結合します。結果として、結合されたポリゴンペアが表示されます。

この例では、ST_Difference 関数を使用して、2つのポリゴンの差を計算する方法を示します。

-- 2つのポリゴンの差を計算
SELECT
  ST_AsText(ST_Difference(shape1, shape2)) AS difference_shape
FROM my_table AS t1
JOIN my_table AS t2
ON t1.id != t2.id;


GeoJSON

  • 欠点:
    • PostgreSQL のネイティブデータ型ではないため、パフォーマンスが犠牲になる可能性がある
    • 複雑な幾何形状を表現するのに適していない場合がある
  • 利点:
    • 軽量で読みやすい形式
    • 多くのライブラリやツールでサポートされている
    • 空間データのWebサービスとのやり取りに適している
  • GeoJSON は、空間データをエンコードするための JavaScript オブジェクト表記法です。

Well-known Text (WKT)

  • 欠点:
    • GeoJSON ほど読みやすくはない
    • 複雑な幾何形状を表現するのに冗長になる可能性がある
  • 利点:
    • シンプルで広く使われているフォーマット
    • PostgreSQL のネイティブデータ型である polygon と互換性がある
  • WKT は、空間データをテキスト形式で表すための標準です。

カスタムデータ型

  • 欠点:
    • 開発と保守に時間がかかる
    • PostgreSQL の他のデータ型との互換性が制限される可能性がある
  • 利点:
    • アプリケーションに特化したデータ構造を定義できる
    • パフォーマンスとメモリ使用量を最適化できる
  • 特定のニーズに合わせて、独自の空間データ型を作成できます。

Rasters

  • 欠点:
    • ベクターデータほど詳細な表現には向かない
    • ストレージ容量が多くなる可能性がある
  • 利点:
    • 標高データや土地被覆データなどの連続的な表面を表現するのに適している
    • ベクターデータよりも処理が速い場合がある
  • ラスターデータは、グリッド形式で空間データを表現します。
  • PostgreSQL は、linestringmultilinestringpointgeometry など、他の多くの空間データ型をサポートしています。

どの代替方法が最適かは、個々の要件によって異なります。以下の要素を考慮する必要があります。

  • データを共有する必要があるかどうか
  • 使用するライブラリやツール
  • データ処理のパフォーマンス要件
  • データの表現に必要な精度