自作の、Spatial(GIS)関連の関数をMySQLに追加するプラグインの関数をひとつひとつ動作確認しながら紹介するシリーズ。
https://sakaik.hateblo.jp/entry/20260215/mysql_spatial_functions_plugin
STX_LineLocatePoint(line, point)
第2引数のPOINTから最も近い第1引数のLINESTRINGの点を求め、その位置をLINESTRING上の始点から比率で返す。戻値は0.0~1.0の範囲。
動作紹介
- 長さ10のLINESTRING上に、少し離れたPOINTから最短の位置を決定して、割合を返す
mysql> SELECT STX_LineLocatePoint(
-> ST_GeomFromText('LINESTRING(0 3, 10 3)'),
-> ST_GeomFromText('POINT(4 0)')) ratio;
+-------+
| ratio |
+-------+
| 0.4 |
+-------+
1 row in set (0.000 sec)
.
- 節を幾つも持つ(ふつうの)LINESTRINGでももちろん動作する
mysql> SELECT STX_LineLocatePoint(
-> ST_GeomFromText('LINESTRING(0 5, 5 5, 5 10)'),
-> ST_GeomFromText('POINT(7 6 )')) r;
+------+
| r |
+------+
| 0.6 |
+------+
1 row in set (0.000 sec).
- 第1引数がLINESTRINGでない場合はエラー
mysql> SELECT STX_LineLocatePoint(
-> ST_GeomFromText('POLYGON((0 5, 5 5, 5 10, 0 5))'),
-> ST_GeomFromText('POINT(7 6 )')) r;
ERROR 3516 (22S01): LINESTRING value is a geometry of unexpected type POLYGON in stx_linelocatepoint.
- 第2筆数がPOINTでない場合はエラー
mysql> SELECT STX_Linelocatepoint(
-> ST_GeomFromText('LINESTRING(0 3, 10 3)'),
-> ST_GeomFromText('LINESTRING(1 2, 1 4)')) ratio;
ERROR 3516 (22S01): POINT value is a geometry of unexpected type LINESTRING in stx_linelocatepoint.## 使い道の例
ここで割合としてLINESTRING上の点を特定できると、この割合の値を使って STX_LinesSubstring() でLINESTRINGを分割できる。
