MariaDB SQLで空間解析をレベルアップ!NumInteriorRings関数で内部リングを自在に操る


構文

SELECT NumInteriorRings(poly);

引数

  • poly: ポリゴンを表す GEOMETRY 型の値

戻り値

  • 内部リングの数を示す整数

以下の例では、ポリゴン ((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)) を定義し、その内部リング数を計算しています。

SET @poly = 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))';
SELECT NumInteriorRings(GeomFromText(@poly));

この例の結果は以下のようになります。

+---------------------------------------+
| NumInteriorRings(GeomFromText(@poly)) |
+---------------------------------------+
| 1                                       |
+---------------------------------------+
  • 内部リングの個々の形状を抽出するには、ST_InteriorRingN 関数を使用できます。
  • このような場合、NumInteriorRings 関数は 1 を返します。
  • しかし、MariaDBを含む一部のシステムでは、ポリゴンに 複数の外部リング を定義することができます。
  • OpenGIS 標準では、ポリゴンは 1 つの外部リング0 個以上の内部リング を持つことが規定されています。
  • ポリゴン間の関係を解析する
  • ポリゴンの形状を可視化する
  • ポリゴンの複雑さを分析する


例 1: 内部リング数を表示する

この例では、ポリゴンデータから内部リング数を抽出し、それぞれ表示します。

SELECT p.id, p.geom, NumInteriorRings(p.geom) AS num_interior_rings
FROM polygons AS p;

例 2: 特定の内部リングを抽出する

この例では、ポリゴン pid=12 番目の内部リング を抽出します。

SELECT ST_AsText(ST_InteriorRingN(p.geom, 2))
FROM polygons AS p
WHERE p.id = 1;

例 3: 内部リングを持つポリゴンをカウントする

この例では、内部リングを持つポリゴンの数をカウントします。

SELECT COUNT(*)
FROM polygons AS p
WHERE NumInteriorRings(p.geom) > 0;

例 4: 内部リングの面積を計算する

この例では、各内部リングの面積を計算します。

SELECT p.id, p.geom,
       ST_Area(ST_InteriorRingN(p.geom, i)) AS area_interior_ring_i
FROM polygons AS p
CROSS JOIN (
  SELECT 1 + n AS i
  FROM (SELECT COUNT(*) AS n FROM polygons AS p WHERE p.id = 1) AS subq
) AS i_nums
WHERE p.id = 1;


代替方法の例

  • ST_GeometryType 関数: ポリゴンの形状タイプを判定し、内部リングが存在するかどうかを確認します。
SELECT ST_GeometryType(p.geom) AS geom_type,
       CASE WHEN geom_type = 'POLYGON' THEN NumInteriorRings(p.geom) ELSE 0 END AS num_interior_rings
FROM polygons AS p;
  • ST_NPoints 関数: ポリゴンの頂点数をカウントし、内部リングが存在するかどうかを推測します。
SELECT p.id, p.geom,
       CASE WHEN ST_NPoints(p.geom) > 4 THEN NumInteriorRings(p.geom) ELSE 0 END AS num_interior_rings
FROM polygons AS p;
  • ST_ExteriorRing 関数: 外部リングと内部リングを個別に抽出することで、内部リング数を計算します。
SELECT p.id, p.geom,
       COUNT(*) - 1 AS num_interior_rings
FROM polygons AS p,
     (SELECT ST_ExteriorRing(p.geom) AS geom FROM polygons AS p) AS ext_rings
GROUP BY p.id, ext_rings.geom;

各代替方法の長所と短所

方法長所短所
ST_GeometryType 関数シンプル内部リングが複雑な場合、誤判定の可能性がある
ST_NPoints 関数高速内部リングが複数の場合、誤判定の可能性がある
ST_ExteriorRing 関数確実処理が複雑

最適な代替方法は、状況やデータセットによって異なります。

NumInteriorRings 関数 が不適切な場合は、上記の代替方法を検討することをお勧めします。

  • 特定のニーズに合わせたカスタム関数を作成することもできます。
  • 空間解析ライブラリ (例: GeoPandas) を使用して、NumInteriorRings 関数の機能を拡張することもできます。