自作の、Spatial(GIS)関連の関数をMySQLに追加するプラグインの関数をひとつひとつ動作確認しながら紹介するシリーズ。
STX_ShortestLine(g1, g2)
2つのジオメトリ間の最短線分を返します。つまり、2つの点から構成される LINESTRING型を返します。
動作紹介
- POINTとLINESTRINGの最短距離。この例ではLINESTRING側の端点が、POINTに一番近い
mysql> SELECT ST_AsText(STX_Shortestline(
-> ST_GeomFromText('POINT(0 0)'),
-> ST_GeomFromText('LINESTRING(1 1, 2 2)'))) g;
+---------------------+
| g |
+---------------------+
| LINESTRING(0 0,1 1) |
+---------------------+
1 row in set (0.000 sec).
- POINTとLINESTRINGの最短距離。この例では、LINESTRING上にある(端点でない)場所がPOINTに最も近くなるが、正しく最短線分が返される。
mysql> SELECT ST_AsText(STX_Shortestline(
-> ST_GeomFromText('POINT(1 0)'),
-> ST_GeomFromText('LINESTRING(-1 1, 2 1)'))) g;
+---------------------+
| g |
+---------------------+
| LINESTRING(1 0,1 1) |
+---------------------+
1 row in set (0.000 sec)
.
- PostGISのマニュアルに掲載されている実行例との一致確認。POINTとLINESTRING。
mysql> SELECT ST_AsText(STX_ShortestLine(
-> ST_GeomFromText('POINT (160 40)'),
-> ST_GeomFromText('LINESTRING (10 30, 50 50, 30 110, 70 90, 180 140, 130 190)')
-> )) As sline;
+----------------------------------------------------------+
| sline |
+----------------------------------------------------------+
| LINESTRING(160 40,125.75342465753425 115.34246575342466) |
+----------------------------------------------------------+
1 row in set (0.000 sec)→PostGISマニュアルの結果と一致: LINESTRING(160 40,125.75342465753425 115.34246575342466)
.
- PostGISマニュアルの実行例をもうひとつ。POLYGONとPOLYGON(ST_Bufferで生成したもの)の最短線分
mysql> SELECT ST_AsText( STX_ShortestLine(
-> ST_GeomFromText('POLYGON ((190 150, 20 10, 160 70, 190 150))'),
-> ST_Buffer(ST_GeomFromText('POINT(80 160)'), 30)
-> ) ) AS llinewkt;
+-----------------------------------------------------------------------------------------+
| llinewkt |
+-----------------------------------------------------------------------------------------+
| LINESTRING(131.59149149528952 101.89887534906195,101.21320343559643 138.78679656440357) |
+-----------------------------------------------------------------------------------------+
1 row in set (0.000 sec)→PostGIS結果LINESTRING(131.59149149528952 101.89887534906197,101.21320343559644 138.78679656440357)末端桁の微妙な差異があるがほぼ一致。
