自作の、Spatial(GIS)関連の関数をMySQLに追加するプラグインの関数をひとつひとつ動作確認しながら紹介するシリーズ。
STX_LineSubstring(line, start, end)
LINESTRINGを指定した割合の場所でちょん切って返す関数です。
(0,0)-(0,100) のLINESTRINGを、0.3~0.75 の範囲で切り出すと (0,30)-(0,75) のLINESTRINGが返ってくる、といった動作をします。2点によるLINESTRINGのみでなく3点以上のLINESTRINGでも動作します。
第2、第3引数に与えるのは 0.0-1.0の範囲の割合で、第2引数のほうが小さい必要があります。
実行例
- (0 0)から (50 0)で直角に折れて(50 50)に至るLINESTRINGを 25%~75%の範囲となるよう抜き出し
mysql> SELECT ST_AsText(STX_LineSubstring(
-> ST_GeomFromText('LINESTRING(0 0, 50 0, 50 50)'), 0.25, 0.75)) g;
+-----------------------------+
| g |
+-----------------------------+
| LINESTRING(25 0,50 0,50 25) |
+-----------------------------+
1 row in set (0.000 sec)
- 同じLINESTRINGを、切る位置も少し変えて抜き出し。折れ曲がる位置より前の部分が完全になくなることが分かる
mysql> SELECT ST_AsText(STX_LineSubstring(
-> ST_GeomFromText('LINESTRING(0 0, 50 0, 50 50)'), 0.6, 0.75)) g;
+-------------------------+
| g |
+-------------------------+
| LINESTRING(50 10,50 25) |
+-------------------------+
1 row in set (0.000 sec)
- 終端位置を1よりも大きな値を指定した場合でも、線分が延びるわけではない。あくまでも与えられたLINESTRING内の抜き出し処理となる
mysql> SELECT ST_AsText(STX_LineSubstring(
-> ST_GeomFromText('LINESTRING(0 0, 10 0)'), 0.0, 1.2)) g;
+----------------------+
| g |
+----------------------+
| LINESTRING(0 0,10 0) |
+----------------------+
1 row in set (0.000 sec)
- もちろん地理座標系でも正しく動作
mysql> SELECT ST_AsText(STX_LineSubstring(
-> ST_GeomFromText('LINESTRING(35.6812 139.7671, 35.6580 139.7016, 35.6896 139.7005, 35.7295 139.7109)', 6668),
-> 0.2, 0.85)) g;
+-----------------------------------------------------------------------------------------------------------------------+
| g |
+-----------------------------------------------------------------------------------------------------------------------+
| LINESTRING(35.67079406748978 139.7377211819216,35.658 139.7016,35.6896 139.7005,35.71032795942056 139.70590277639033) |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
- 青線がもとのLINESTRING。赤線がSTX_LineSubstringで部分を切り出したもの
