MySQL GIS拡張関数: STX_Project()

MySQLにSpatial(GIS)関数をいっぱい追加したくて、Pluginを作っています。
sakaik.hateblo.jp

テストを兼ねて一つ一つ関数を紹介しています。

STX_Project(point, dist, azimuth)

 与えられた点を、指定された方向に、指定された距離だけ移動した点を返す。地理座標系の場合は地球の丸さを考慮して計算する。
方向は、北をゼロとした時計回りにラジアンで指定する。
LINESTRING や POLYGONでは動作しない(NULL)。

動作紹介

  • 霞ヶ関付近から真北(0度)に1000m移動した点
mysql> SET @g=ST_GeomFromText('POINT(35.6762 139.7503)', 4326);
mysql> SELECT ST_AsText(@g) p1, ST_AsText(STX_Project(@g, 1000.0, 0.0)) p2;
+-------------------------+----------------------------------------------+
| p1                      | p2                                           |
+-------------------------+----------------------------------------------+
| POINT(35.6762 139.7503) | POINT(35.685212817707345 139.75030000000004) |
+-------------------------+----------------------------------------------+
1 row in set (0.000 sec)

青がProject前のp1、赤がProject後のp2です。

  • 北東(右上45度)に500m移動した例
mysql> SET @g=ST_GeomFromText('POINT(35.6762 139.7503)', 4326);
mysql> SELECT ST_AsText(@g) p1, ST_AsText(STX_Project(@g, 1000.0, PI()/4)) p2;
+-------------------------+---------------------------------------------+
| p1                      | p2                                          |
+-------------------------+---------------------------------------------+
| POINT(35.6762 139.7503) | POINT(35.68257277254631 139.75811129521304) |
+-------------------------+---------------------------------------------+
1 row in set (0.000 sec)

補足説明

 POINTしか使えないし、こんな関数どんな時に使うのだろうとAIさんと会話して教えてもらいました。

  • Wi-Fiの電波の届く範囲や、レーダーの照射範囲などをシミュレーションする場合など、中心点から角度を5度ずつ変化させながら対象となる点を得る

- 基地局から北東30度〜60度の範囲に広がるポリゴンを作るためのPOINT特定など

  • 移動体の位置推定

- 「今この座標にいて、時速5kmで北西に15分進んだらどこにいるか?」

  • 定義どおりに正確な「境界線」を作るとき

- 法律や規約で「海岸線から垂直に12海里離れた点」のように、基準点からの距離と方位で場所が定義されている場合に利用

いずれも、他の移動系関数(ST_Translateなど)と違い、地球の丸さを考慮した計算をしてくれるので、特に距離が長い場合に効果を発揮するそうです。