以下の内容はhttps://sakaik.hateblo.jp/entry/20260219/STX_CoveredBy_Covers_funcより取得しました。


MySQL GIS拡張関数: STX_CoveredBy(), STX_Covers()

 勝手にやっているMySQLにGIS(Spatial)関数を増やそうプロジェクト)の関数をひとつひとつ(デバッグしながら)試していくシリーズ。その4。2つの関数を紹介します。

STX_CoveredBy(), STX_Covers()

 2つの空間データの包含関係を判定する関数です。
STX_CoveredBy(g1, g2) は、g1がg2に含まれることを判定(含まれる時 True=1)
STX_Covers(g1, g2) はその逆で、g1がg2を含む(g2がg1に含まれる)ことを判定する関数です。

動作紹介

  • POLYGONに包含されるPOIN。g1が大きな四角、g2が中に含まれる点。包含されるという結果を得ています。
mysql> SET @g1=ST_GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))');
mysql> SET @g2=ST_GeomFromText('POINT(5 5)');

mysql> SELECT STX_CoveredBy(@g2, @g1);
+-------------------------+
| STX_CoveredBy(@g2, @g1) |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.000 sec)

mysql> SELECT STX_Covers(@g2, @g1);
+----------------------+
| STX_Covers(@g2, @g1) |
+----------------------+
|                 NULL |
+----------------------+
1 row in set (0.000 sec)

mysql> SELECT STX_Covers(@g1, @g2);
+----------------------+
| STX_Covers(@g1, @g2) |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.000 sec)
  • POLYGONに含まれない点。先ほどの四角はそのままで、その外にある点との評価。含まれない(=0)を得ています
mysql> SET @g2=ST_GeomFromText('POINT(15 5)');

mysql> SELECT STX_CoveredBy(@g2, @g1);
+-------------------------+
| STX_CoveredBy(@g2, @g1) |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.000 sec)
  • LINESTRINGにPOINTが含まれる判定。線上にある点は「含まれる」と判定
mysql> SET @g1=ST_GeomFromText('LINESTRING(0 0, 10 0)');
mysql> SET @g2=ST_GeomFromText('POINT(3 0)');

mysql> SELECT STX_CoveredBy(@g2, @g1);
+-------------------------+
| STX_CoveredBy(@g2, @g1) |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.000 sec)

mysql> SELECT STX_Covers(@g1, @g2);
+----------------------+
| STX_Covers(@g1, @g2) |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.000 sec)

mysql> SELECT STX_Covers(@g2, @g1);
+----------------------+
| STX_Covers(@g2, @g1) |
+----------------------+
|                 NULL |
+----------------------+
1 row in set (0.000 sec)
  • 線の上に乗っていない点は当然「含まれない」
mysql> SET @g2=ST_GeomFromText('POINT(3 1)');

mysql> SELECT STX_CoveredBy(@g2, @g1);
+-------------------------+
| STX_CoveredBy(@g2, @g1) |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.000 sec)
  • LINESTRINGとLINESTRINGの比較。線上にカバーされている状態が判定されている
mysql> SET @g1=ST_GeomFromText('LINESTRING(0 0, 10 0)');
mysql> SET @g2=ST_GeomFromText('LINESTRING(2 0, 4 0)');

mysql> SELECT STX_CoveredBy(@g2, @g1);
+-------------------------+
| STX_CoveredBy(@g2, @g1) |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.000 sec)

mysql> SELECT STX_Covers(@g1, @g2);
+----------------------+
| STX_Covers(@g1, @g2) |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.000 sec)
  • 線が一部かぶっているが、はみ出している場合は「カバーされていない」と判定
mysql> SET @g2=ST_GeomFromText('LINESTRING(8 0, 11 0)');

mysql> SELECT STX_CoveredBy(@g2, @g1);
+-------------------------+
| STX_CoveredBy(@g2, @g1) |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.000 sec)
  • 端点を共有している場合でも、完全に乗っているなら(はみ出していないなら)「カバーされている」
mysql> SET @g2=ST_GeomFromText('LINESTRING(8 0, 10 0)');

mysql> SELECT STX_CoveredBy(@g2, @g1);
+-------------------------+
| STX_CoveredBy(@g2, @g1) |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.000 sec)

 ここではすべて紹介しませんが、POLYGON in POLYGON や LINESTRING in POLYGON なども判定可能。




以上の内容はhttps://sakaik.hateblo.jp/entry/20260219/STX_CoveredBy_Covers_funcより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14