MySQL GIS拡張関数: STX_Relate()

自作の、Spatial(GIS)関連の関数をMySQLに追加するプラグインの関数をひとつひとつ動作確認しながら紹介するシリーズ。

STX_Relate(g1, g2)

 DE-9IM 関係行列を返す。
2つの値について、以下の表のような相互の関係を求め、II IB IE BI BB BE EI EB EE の順となる9バイトの文字列にして返す。

              g2の内部(I)   g2の境界(B)   g2の外部(E)
              ──────────────────────────────────────
g1の内部(I) │     II     │     IB     │     IE
g1の境界(B) │     BI     │     BB     │     BE
g1の外部(E) │     EI     │     EB     │     EE

実行例

  • Polygonと点の関係
mysql> SELECT STX_Relate(
    ->   ST_GeomFromText('POINT(1 1)'),
    ->   ST_GeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))')) de9;
+-----------+
| de9       |
+-----------+
| 0FFFFF212 |
+-----------+
1 row in set (0.000 sec)
           Poly Poly Poly
            内  交差  外
Point 内    0    F    F 
Point 交差  F    F    F 
Point 外    2    1    2

ー PointはPolygonとあらゆる視点で交差していない(2行目がすべてF)

  • Polygonの内側にPoint(の内側=Pointそのもの)がある(0次元=点で)(1行目の1つめ)
  • 1行目それ以外は点と面は関与しあわない(F)
  • 点の外側部分は面の中にある(2次元で関与)(3行目1)
  • 点の外側部分は面の境界線と関与(境界線なので1次元で関与)(3行目2)
  • 点の外側部分は面の外側部分と面で関与(3行目3)

なので ならべて0FFFFF212となる。

.

  • g1とg2が逆の場合は、結果行列もタテヨコが逆になる。
mysql> SELECT STX_Relate(
    ->   ST_GeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))'),ST_GeomFromText('POINT(1 1)')) de9;
+-----------+
| de9       |
+-----------+
| 0F2FF1FF2 |
+-----------+
1 row in set (0.000 sec)
  • ポリゴンどうしが一部重なる
mysql> SELECT STX_Relate(
    ->   ST_GeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))'),
    ->   ST_GeomFromText('POLYGON((1 1, 3 1, 3 3, 1 3, 1 1))') ) de9;
+-----------+
| de9       |
+-----------+
| 212101212 |
+-----------+
1 row in set (0.000 sec)

  • まったく重ならない2つのポリゴン
mysql> SELECT STX_Relate(
    ->   ST_GeomFromText('POLYGON((10 10, 12 10, 12 12, 10 12, 10 10))'),
    ->   ST_GeomFromText('POLYGON((1 1, 3 1, 3 3, 1 3, 1 1))') ) de9;
+-----------+
| de9       |
+-----------+
| FF2FF1212 |
+-----------+
1 row in set (0.000 sec)
  • ポリゴンが辺を共有して隣接(接触のみ、重なりなし)
mysql> SELECT STX_Relate(
    ->   ST_GeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'),
    ->   ST_GeomFromText('POLYGON((1 0, 2 0, 2 1, 1 1, 1 0))')
    -> ) de9;
+-----------+
| de9       |
+-----------+
| FF2F11212 |
+-----------+
1 row in set (0.000 sec)