MariaDB Spatial拡張機能の必須ツール:ST_ENVELOPE関数でジオメトリを操る
ST_ENVELOPE は、次の構文で使用されます。
ST_ENVELOPE(geometry g)
ここで、geometry
は、点、ライン、ポリゴン、マルチジオメトリなどの有効なジオメトリ値です。
ST_ENVELOPE の結果は、常にポリゴン値になります。ポリゴンは、一連の座標で定義される閉じた図形です。
ST_ENVELOPE の例:
SELECT ST_ENVELOPE(ST_GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))'));
このクエリは、次の結果を返します。
GEOMETRYCOLLECTION(POLYGON((0 0, 10 0, 10 10, 0 10, 0 0)))
この結果は、入力ジオメトリを完全に包み込む最小境界矩形を表すポリゴンです。
ST_ENVELOPE の使用例:
- 空間インデックスを作成
- ジオメトリが互いに交差しているかどうかを判断
- ジオメトリのサイズを計算
- ジオメトリの境界を視覚化
ST_ENVELOPE は、MariaDB Spatial拡張機能で最も重要な関数の一つです。これは、ジオメトリデータの分析と操作に不可欠なツールです。
ST_ENVELOPE
は、すべての MariaDB バージョンで利用できます。ST_ENVELOPE
は、SRID を考慮しません。SRID を考慮する場合は、ST_EnvelopeWithSRID
関数を使用する必要があります。ST_ENVELOPE
は、ENVELOPE
とも呼ばれます。
SELECT
g,
ST_AsText(ST_Envelope(g)) AS envelope
FROM geometry_table;
このクエリは、geometry_table
テーブル内のすべてのジオメトリに対して次の結果を返します。
GEOMETRY ENVELOPE
-------------------------------------------------
POLYGON((0 0, 10 0, 10 10, 0 10, 0 0)) POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))
LINESTRING((0 0, 10 0)) LINESTRING((0 0, 10 0))
POINT(5 5) POINT(5 5)
この結果は、各ジオメトリとその境界を示します。境界は、ジオメトリを完全に包み込む最小の四角形として表示されます。
例 2: ジオメトリのサイズを計算
この例では、ST_ENVELOPE
関数を使用してジオメトリのサイズを計算する方法を示します。
SELECT
g,
ST_Envelope(g) AS envelope,
ST_Area(ST_Envelope(g)) AS area
FROM geometry_table;
GEOMETRY ENVELOPE AREA
----------------------------------------------------------------------------------
POLYGON((0 0, 10 0, 10 10, 0 10, 0 0)) POLYGON((0 0, 10 0, 10 10, 0 10, 0 0)) 100
LINESTRING((0 0, 10 0)) LINESTRING((0 0, 10 0)) 10
POINT(5 5) POINT(5 5) 0
この結果は、各ジオメトリとその境界と、境界の面積を示します。
例 3: ジオメトリが互いに交差しているかどうかを判断
この例では、ST_ENVELOPE
関数を使用して、2 つのジオメトリが互いに交差しているかどうかを判断する方法を示します。
SELECT
g1,
g2,
ST_Intersects(ST_Envelope(g1), ST_Envelope(g2)) AS intersects
FROM geometry_table1 g1
JOIN geometry_table2 g2
ON ...;
このクエリは、geometry_table1
テーブルと geometry_table2
テーブルの間のすべての結合に対して次の結果を返します。
G1 G2 INTERSECTS
-------------------------------------------------
POLYGON((0 0, 10 0, 10 10, 0 10, 0 0)) POLYGON((5 5, 15 5, 15 15, 5 15, 5 5)) TRUE
LINESTRING((0 0, 10 0)) LINESTRING((5 5, 15 5)) FALSE
POINT(5 5) POINT(10 10) FALSE
この結果は、各ジオメトリペアとその境界と、境界が交差しているかどうかを示します。
例 4: 空間インデックスを作成
この例では、ST_ENVELOPE
関数を使用して空間インデックスを作成する方法を示します。
CREATE SPATIAL INDEX idx_geometry_envelope ON geometry_table USING SPATIAL ENGINE=GEOSOMETRY;
このクエリは、geometry_table
テーブルに idx_geometry_envelope
という名前の空間インデックスを作成します。このインデックスは、ST_ENVELOPE
関数を使用してジオメトリを検索するクエリのパフォーマンスを向上させるのに役立ちます。
代替方法 1: ST_MinimumBoundingCircle
ST_MinimumBoundingCircle
関数は、ジオメトリを完全に包み込む最小円を返します。この円は、MBR よりもコンパクトな場合があります。
SELECT
g,
ST_AsText(ST_MinimumBoundingCircle(g)) AS circle
FROM geometry_table;
代替方法 2: ST_ConvexHull
ST_ConvexHull
関数は、ジオメトリの凸包を返します。凸包は、すべてのポイントを含む最小の多角形です。MBR は、常に凸包の一部ですが、必ずしも最小の凸包ではありません。
SELECT
g,
ST_AsText(ST_ConvexHull(g)) AS convex_hull
FROM geometry_table;
代替方法 3: カスタム関数
独自の関数を作成して、ジオメトリの MBR を計算することもできます。これは、特定のニーズに合わせた MBR の計算方法が必要な場合に役立ちます。
CREATE FUNCTION ST_MyEnvelope(geometry g)
RETURNS geometry
BEGIN
DECLARE envelope GEOMETRY;
SET envelope = ST_MakePolygon(
ST_MakeLine(ST_PointFromText('POINT(0 0)'), ST_PointFromText('POINT(10 0)')),
ST_MakeLine(ST_PointFromText('POINT(10 0)'), ST_PointFromText('POINT(10 10)')),
ST_MakeLine(ST_PointFromText('POINT(10 10)'), ST_PointFromText('POINT(0 10)')),
ST_MakeLine(ST_PointFromText('POINT(0 10)'), ST_PointFromText('POINT(0 0)'))
);
RETURN ST_Intersection(g, envelope);
END;
- 特定のニーズに合わせた MBR の計算方法が必要な場合は、カスタム関数を作成してください。
- すべてのポイントを含む最小の多角形が必要な場合は、
ST_ConvexHull
を使用してください。 - よりコンパクトな境界が必要な場合は、
ST_MinimumBoundingCircle
を使用してください。 - 最小の境界矩形が必要な場合は、
ST_ENVELOPE
を使用してください。
- これらの代替方法は、すべての MariaDB バージョンで利用できます。
- 上記の代替方法はすべて、MariaDB Spatial拡張機能の一部です。