自作の、Spatial(GIS)関連の関数をMySQLに追加するプラグインの関数をひとつひとつ動作確認しながら紹介するシリーズ。
https://sakaik.hateblo.jp/entry/20260215/mysql_spatial_functions_plugin
STX_RemoveRepeatedPoints(geom [, tol])
連続する重複頂点を除去する関数。
動作紹介
- 点が重複するLINESTRINGから重複部分を除去
mysql> SET @g=ST_GeomFromText('LINESTRING(0 0, 0 0, 1 1, 1 1, 2 2)');
mysql> SELECT ST_AsText(STX_Removerepeatedpoints(@g));
+-----------------------------------------+
| ST_AsText(STX_Removerepeatedpoints(@g)) |
+-----------------------------------------+
| LINESTRING(0 0,1 1,2 2) |
+-----------------------------------------+
1 row in set (0.000 sec)
- 第2引数を与えると、その距離の範囲内にある近傍点も「重複」と見做される
mysql> SET @g=ST_GeomFromText('LINESTRING(0 0, 0.1 0, 1 0, 1.05 0, 2 0)');
mysql> SELECT ST_AsText(STX_Removerepeatedpoints(@g, 0.2));
+----------------------------------------------+
| ST_AsText(STX_Removerepeatedpoints(@g, 0.2)) |
+----------------------------------------------+
| LINESTRING(0 0,1 0,2 0) |
+----------------------------------------------+
1 row in set (0.000 sec)
- 近い点が続く場合は、前から順に集約(重複除去)しながら、指定距離から離れたものを生かす動作の模様
mysql> SET @g=ST_GeomFromText('LINESTRING(0 0, 0.1 0, 0.2 0, 0.2 0.1, 2 0)');
mysql> SELECT ST_AsText(STX_Removerepeatedpoints(@g, 0.2));
+----------------------------------------------+
| ST_AsText(STX_Removerepeatedpoints(@g, 0.2)) |
+----------------------------------------------+
| LINESTRING(0 0,0.2 0.1,2 0) |
+----------------------------------------------+
1 row in set (0.000 sec)
- MULTIPOINTでも重複除去してくれる(MULTIPOINTには順序がないので、間に他のものを挟んでも除去してくれる)
mysql> SET @g=ST_GeomFromText('MULTIPOINT ((1 1), (2 2), (3 3), (2 2))');
mysql> SELECT ST_AsText(STX_Removerepeatedpoints(@g));
+-----------------------------------------+
| ST_AsText(STX_Removerepeatedpoints(@g)) |
+-----------------------------------------+
| MULTIPOINT((1 1),(2 2),(3 3)) |
+-----------------------------------------+
1 row in set (0.000 sec)
開発秘話
当初、GEOMETRY COLLECTIONに対して重複の除去が行われなかったため、修正した。
- MULTIPOINTに対して重複除去が行われなかった例(バグ動作。現在は修正済み)
mysql> SET @g=ST_GeomFromText('MULTIPOINT ((1 1), (2 2), (3 3), (2 2))');
mysql> SELECT ST_AsText(STX_Removerepeatedpoints(@g));
+-----------------------------------------+
| ST_AsText(STX_Removerepeatedpoints(@g)) |
+-----------------------------------------+
| MULTIPOINT((1 1),(2 2),(3 3),(2 2)) |
+-----------------------------------------+
- 修正後
mysql> SET @g=ST_GeomFromText('MULTIPOINT ((1 1), (2 2), (3 3), (2 2))');
mysql> SELECT ST_AsText(STX_Removerepeatedpoints(@g));
+-----------------------------------------+
| ST_AsText(STX_Removerepeatedpoints(@g)) |
+-----------------------------------------+
| MULTIPOINT((1 1),(2 2),(3 3)) |
+-----------------------------------------+
1 row in set (0.000 sec)