空間データ型
SQLで扱うポイント、ライン、ポリゴンを学びます
「空間データ型」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
空間データとは
空間データは、現実世界の位置、形状、領域を表します。単なる数値や文字列とは異なり、空間値は地図上の点、道路区間、国境などの幾何学的な意味を持ちます。
PostGISは、強力な空間データ型と関数を追加するPostgreSQL拡張機能であり、データベースを本格的な地理情報システム(GIS)に変えます。
-- Enable the PostGIS extension
CREATE EXTENSION IF NOT EXISTS postgis;GEOMETRY型
PostGISの中核となる空間型はgeometryです。平面(ユークリッド)座標空間に形状を格納します。列の作成時に、POINT、LINESTRING、POLYGONなどのサブタイプを制約として指定できます。
サブタイプとともにSRID(Spatial Reference ID)を指定すると、データが使用する座標系をPostGISに伝えられます。
CREATE TABLE locations (
id SERIAL PRIMARY KEY,
name TEXT,
geom geometry(POINT, 4326)
);POINTの挿入
POINTは、X(経度)座標とY(緯度)座標で表される単一の位置です。ST_GeomFromText関数は、Well-Known Text(WKT)文字列をgeometry値に変換します。
SRID 4326は、世界中のGPS機器で使用されているWGS 84座標系です。
INSERT INTO locations (name, geom)
VALUES
('Eiffel Tower', ST_GeomFromText('POINT(2.2945 48.8584)', 4326)),
('Big Ben', ST_GeomFromText('POINT(-0.1246 51.5007)', 4326)),
('Colosseum', ST_GeomFromText('POINT(12.4922 41.8902)', 4326));
SELECT name, ST_AsText(geom) AS wkt FROM locations;LINESTRING型
LINESTRINGは、直線のセグメントで接続された2つ以上の点の順序付きシーケンスです。道路、河川、その他の線状の地物を表すのに適しています。
WKT内の数値の各ペアが1つの頂点(経度 緯度)です。PostGISはパス全体を1つのgeometry値として格納します。
CREATE TABLE roads (
id SERIAL PRIMARY KEY,
name TEXT,
path geometry(LINESTRING, 4326)
);
INSERT INTO roads (name, path)
VALUES (
'High Street',
ST_GeomFromText(
'LINESTRING(-0.125 51.500, -0.120 51.502, -0.115 51.505)',
4326
)
);
SELECT name, ST_Length(path) AS length_degrees FROM roads;POLYGON型
POLYGONは、閉じた領域を定義します。外周境界はリングです。リングは、最初と最後の点が同一である閉じたLINESTRINGです。ポリゴンには内側のリング(穴)を含めることもでき、公園内の湖のような領域を表現できます。
すべてのリングを閉じる必要があります。開始座標を末尾で繰り返してください。
CREATE TABLE zones (
id SERIAL PRIMARY KEY,
name TEXT,
area geometry(POLYGON, 4326)
);
INSERT INTO zones (name, area)
VALUES (
'Central Park Approx',
ST_GeomFromText(
'POLYGON((-73.9817 40.7681, -73.9580 40.7681,
-73.9580 40.7964, -73.9817 40.7964,
-73.9817 40.7681))',
4326
)
);
SELECT name, ST_Area(area) AS area_sq_deg FROM zones;GEOGRAPHYとGEOMETRY
PostGISには、空間型が2つの系統あります。geometryは平面のデカルト座標系を使用し、geographyは地球を曲面の回転楕円体としてモデル化します。
広い範囲で現実世界の距離をメートル単位で正確に求める必要がある場合は、geographyを使用してください。ローカルな投影座標系で作業する場合や、最大限のパフォーマンスが必要な場合は、geometryを使用してください。
CREATE TABLE cities (
id SERIAL PRIMARY KEY,
name TEXT,
geog geography(POINT, 4326)
);
INSERT INTO cities (name, geog) VALUES
('New York', ST_GeogFromText('POINT(-74.0060 40.7128)')),
('London', ST_GeogFromText('POINT(-0.1278 51.5074)'));
-- Distance in metres using geography
SELECT
a.name AS from_city,
b.name AS to_city,
ROUND(ST_Distance(a.geog, b.geog)::NUMERIC) AS distance_m
FROM cities a, cities b
WHERE a.name = 'New York' AND b.name = 'London';Well-Known Text(WKT)とWKB
空間データは、2つの標準形式でシリアライズできます。Well-Known Text(WKT)は人間が読み取れる形式です:POINT(2.29 48.86)。Well-Known Binary(WKB)は、内部処理やデータ転送に使用されるコンパクトなバイナリ表現です。
PostGISには、内部ストレージとこれらの形式を相互変換するST_AsTextおよびST_AsBinaryが用意されています。
SELECT
name,
ST_AsText(geom) AS wkt,
ST_AsEWKT(geom) AS ewkt,
encode(ST_AsBinary(geom), 'hex') AS wkb_hex
FROM locations
LIMIT 2;MULTIPOINT、MULTILINESTRING、MULTIPOLYGON
PostGISは、同じ種類の複数の形状を1つの値にまとめるマルチジオメトリ型にも対応しています。これは、群島をMULTIPOLYGONとしてモデル化する場合のように、1つの現実世界の地物が分離した複数の部分で構成されるときに便利です。
標準的な空間関数はすべて、マルチジオメトリに対しても同じ方法で動作します。
SELECT ST_AsText(
ST_GeomFromText(
'MULTIPOLYGON(
((0 0, 4 0, 4 4, 0 4, 0 0)),
((10 10, 14 10, 14 14, 10 14, 10 10))
)'
)
) AS multi_poly;
SELECT ST_NumGeometries(
ST_GeomFromText(
'MULTIPOLYGON(
((0 0, 4 0, 4 4, 0 4, 0 0)),
((10 10, 14 10, 14 14, 10 14, 10 10))
)'
)
) AS part_count;GEOMETRYCOLLECTION
GEOMETRYCOLLECTIONは最も汎用的な空間型です。点、線、ポリゴンを混在させて1つの値に格納できます。この柔軟性は、同じ列に異なるgeometry型が格納される可能性のある異種のデータセットで役立ちます。
ST_GeometryNを使用すると、個々のメンバーを取り出せます。
SELECT ST_AsText(
ST_GeomFromText(
'GEOMETRYCOLLECTION(
POINT(1 1),
LINESTRING(0 0, 1 1, 2 2),
POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))
)'
)
) AS collection;
SELECT ST_AsText(
ST_GeometryN(
ST_GeomFromText(
'GEOMETRYCOLLECTION(POINT(1 1), LINESTRING(0 0, 1 1))'
),
1
)
) AS first_member;GISTによる空間インデックス
包含関係や近接性を調べる空間クエリでは、すべての行のgeometryを比較する必要があり、数百万個の形状をスキャンする可能性があります。GISTインデックスは、geometryのバウンディングボックスにインデックスを作成することで、これを大幅に高速化します。これにより、条件に一致する可能性がまったくない行をPostgreSQLがスキップできます。
頻繁にクエリするgeometry列またはgeography列には、必ずGISTインデックスを作成してください。
-- Create a GIST index on a geometry column
CREATE INDEX idx_locations_geom
ON locations
USING GIST (geom);
-- PostgreSQL will now use the index for spatial operators
EXPLAIN ANALYZE
SELECT name
FROM locations
WHERE ST_DWithin(
geom,
ST_GeomFromText('POINT(2.3 48.9)', 4326),
1.0
);Geometryのプロパティを読み取る
PostGISには、任意のgeometryからプロパティを取り出すアクセサ関数が用意されています。ST_XとST_Yは点の座標を返し、ST_SRIDは空間参照IDを返し、ST_GeometryTypeはサブタイプ名を返します。
これらは、空間データの調査と検証に不可欠です。
SELECT
name,
ST_X(geom) AS longitude,
ST_Y(geom) AS latitude,
ST_SRID(geom) AS srid,
ST_GeometryType(geom) AS geom_type,
ST_IsValid(geom) AS is_valid
FROM locations;クイックチェック
PostGISの空間データ型についての理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、PostGISが提供する中核的な空間データ型について学びました。POINT、LINESTRING、POLYGONが3つの基本的なgeometryサブタイプであり、マルチジオメトリのバリエーション(MULTIPOINT、MULTILINESTRING、MULTIPOLYGON)と、あらゆる型を格納できるGEOMETRYCOLLECTIONによって、より複雑な形状にも対応できることを学びました。
平面のgeometry型と回転楕円体のgeography型の違い、およびその使い分けについても確認しました。Well-Known Text(WKT)を使うと、空間値を人間が読み取れる文字列として読み書きできます。また、GISTインデックスによって、大規模な環境でも空間クエリを高速に保てます。ST_X、ST_SRID、ST_GeometryTypeなどのアクセサ関数を使うと、SQLから任意のgeometry値を直接調査できます。
よくある質問
「空間データ型」レッスンは無料ですか?
はい。「空間データ型」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「空間データ型」で何を学びますか?
SQLで扱うポイント、ライン、ポリゴンを学びます ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「空間データ型」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。