MySQL にSpatial(GIS)関数を大量に追加する(ひとり)プロジェクト、MySQL Spatial Functions Plugin。実装した関数を、ひとつひとつ動作確認しながら紹介していきます。今回は方位角。
STX_Azimuth(p1, p2)
点1から点2への方位角をラジアンで返します。方位角は、上(または北)を 0 とし、右回りに数えます。
ラジアンなので、真右が Pi/2(=90度)、真下がPi(=180度)、真左が 3* Pi/2 (=270度) です。2つの点が同じ時は 0 を返します(PostGISではnullとなるそうですが)。
動作紹介
- 原点と、そこから右にひとつ移動した点との方位角は90度。真右なのだからそうなりますね(度に変換するために 180/Pi を乗じています)
mysql> SELECT STX_Azimuth( ST_GeomFromText('POINT(0 0)'), ST_GeomFromText('POINT(1 0)')) / PI()*180 az;
+------+
| az |
+------+
| 90 |
+------+
1 row in set (0.000 sec)
- (5 5)から(10 10)は斜め右上、45度となります
mysql> SELECT STX_Azimuth( ST_GeomFromText('POINT(5 5)'), ST_GeomFromText('POINT(10 10)')) / PI()*180 az;
+------+
| az |
+------+
| 45 |
+------+
1 row in set (0.000 sec)
- ぐるりと半分(180度)を少し回った例。(10 10)から左・下の位置となる(5 -5)への方位角
mysql> SELECT STX_Azimuth( ST_GeomFromText('POINT(10 10)'), ST_GeomFromText('POINT(5 -5)')) / PI()*180 az;
+--------------------+
| az |
+--------------------+
| 198.43494882292202 |
+--------------------+
1 row in set (0.000 sec)
- (150 100)の点から、わずか左(149,)、結構上(,200)の点へは、ほぼ一周まわった359.4度
mysql> SELECT STX_Azimuth( ST_GeomFromText('POINT(150 100)'), ST_GeomFromText('POINT(149 200)')) / PI()*180 az;
+--------------------+
| az |
+--------------------+
| 359.42706130231653 |
+--------------------+
1 row in set (0.000 sec)
- 2つの点が同じ場合は(NULLではなく) 0 を返します。
mysql> SELECT STX_Azimuth( ST_GeomFromText('POINT(10 10)'), ST_GeomFromText('POINT(10 10)')) / PI()*180 az;
+------+
| az |
+------+
| 0 |
+------+
1 row in set (0.000 sec)
- 平面座標だけでなく勿論地理座標にも対応しています。同緯度で少し東に移動した点への方位角。90度でないのは「追加情報」で解説します
mysql> SELECT STX_Azimuth( ST_GeomFromText('POINT(35 139)', 4326), ST_GeomFromText('POINT(35 140)', 4326)) / PI()*180 az;
+-------------------+
| az |
+-------------------+
| 89.71320687467116 |
+-------------------+
1 row in set (0.000 sec)
追加情報
SRID=4326を指定した際に真東(と思われる点)への方位角が90度よりも少し小さくなりました。これは直感に反する人も多いでしょう(私もそうです。だって真東なんだから90度じゃん!と)。
これ、「緯線」というものがいかにクセモノかを表しています。経線というのは北極と南極を結ぶものです。この形に切ろうと思うと球体をくるくる回しながら切ることになり、その結果の例としてはミカンの房ひとつひとつになるようなイメージです。すべての房が球の中心を通ります。一方の緯線は謂わばタマネギの輪切り。タマネギをまな板の上に置いたまま回転させずに包丁を平行移動しながらザクザク切っていく、これが緯線です。中心を通っていないので「球との関係」という観点で見ると若干我が道を行っているような切り方です(中心を通らないという観点で)。
この違いは、おそらく昔からみんな見聞きしている「ニューヨークに行くのに、わざわざ高緯度のほうを遠回りして行ってる」という形で現れます。実際にその「遠回り」は、地球の中心を通る面で切った経路なので最短距離になるのですが、緯線という線があるせいで感覚的に錯覚を起こしてしまうのです。この話は以前、包含関係を調査しているときにもこの日記で紹介しました。
今回のAzimuthでも、この話と同じ事が起きています。ある地点から「真東にある(と思った)点」への最短経路(方向)は、北半球の場合すこし真東よりも北側を向きます。日本からニューヨークまでならばスタートの方角はかなり北に向くでしょうし、もっと近くであればそれよりは緩くなるでしょう。STX_Azimuth関数を使って確認してみましょう。先ほどは 東経139度から140度への方位角として、89.7132度を得ていました。もっと近くの、139度から139.001度への例を示します。
mysql> SELECT STX_Azimuth( ST_GeomFromText('POINT(35 139)', 4326), ST_GeomFromText('POINT(35 139.001)', 4326)) / PI()*180 az;
+-------------------+
| az |
+-------------------+
| 89.99971321166849 |
+-------------------+
1 row in set (0.000 sec)89.9997度になりました。かなり90度に近くなりますね。このように「同じ緯度」であっても距離によって方位角が変化する。地球って面白いですね。
