勝手にやっている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 なども判定可能。
