MySQL Spatial Functions Plugin、関数を動作確認して紹介するシリーズ。度分秒を変換する関数が欲しかったので追加しました。
STX_dms2deg(d, m, s)
度、分、秒の数字を与えて、小数点の度の数値へ変換する機能です。GISツールどこにもそんな機能はない(と思う)のですが、私が頻繁に使うので、関数として追加することにしました。
STX_deg2dms_deg/_min/_sec (d)
小数点表示の「度」の数値を度分秒に変換する関数です。3つの値を同時に返すことはできないので、それぞれの値を返す3つの関数にしました。度、分は整数、秒は(必要であれば)小数付きで返ります。
動作紹介
- 度分秒を与える(分と秒がゼロのときは度の値が返ってくることの確認)
mysql> SELECT STX_dms2deg(135,0,0); +----------------------+ | STX_dms2deg(135,0,0) | +----------------------+ | 135 | +----------------------+ 1 row in set (0.001 sec)
- 度分秒を与える(秒がゼロのとき。30分なので0.5度と正しい値が加わっている)
mysql> SELECT STX_dms2deg(135,30,0); +-----------------------+ | STX_dms2deg(135,30,0) | +-----------------------+ | 135.5 | +-----------------------+ 1 row in set (0.000 sec)
- 度分秒を与える(すべての値)
mysql> SELECT STX_dms2deg(135,30,30); +------------------------+ | STX_dms2deg(135,30,30) | +------------------------+ | 135.50833333333333 | +------------------------+ 1 row in set (0.000 sec)
- 度分秒を与える(秒に小数点があってもOK)
mysql> SELECT STX_dms2deg(135,30,10.1234); +-----------------------------+ | STX_dms2deg(135,30,10.1234) | +-----------------------------+ | 135.50281205555555 | +-----------------------------+
- 度分を与える(もともと度分で持っている値(Garmin eTexのような)は度分だけを与えて実行もできる)
mysql> SELECT STX_dms2deg(135,30.1234); +--------------------------+ | STX_dms2deg(135,30.1234) | +--------------------------+ | 135.50205666666668 | +--------------------------+ 1 row in set (0.000 sec)
- 上の例は秒にゼロを与えても構わない(引数自体を省略しても構わない)。値が同じであることの確認。
mysql> SELECT STX_dms2deg(135,30.1234,0); +----------------------------+ | STX_dms2deg(135,30.1234,0) | +----------------------------+ | 135.50205666666668 | +----------------------------+ 1 row in set (0.000 sec)
- 単なる計算なので、分や秒が60未満である必要はまったくない。120分=2度 として正しく計算される
mysql> SELECT STX_dms2deg(135,120,0); +------------------------+ | STX_dms2deg(135,120,0) | +------------------------+ | 137 | +------------------------+ 1 row in set (0.000 sec)
- 逆の変換。135.5度が 135度30分になることを確認
mysql> SELECT STX_deg2dms_deg(135.5), STX_deg2dms_min(135.5), STX_deg2dms_sec(135.5); +------------------------+------------------------+------------------------+ | STX_deg2dms_deg(135.5) | STX_deg2dms_min(135.5) | STX_deg2dms_sec(135.5) | +------------------------+------------------------+------------------------+ | 135 | 30 | 0 | +------------------------+------------------------+------------------------+ 1 row in set (0.000 sec)
- 上のほうで実施したものの逆変換。135度30分10.1234秒だが計算誤差が発生している
mysql> SET @d=135.50281205555555; mysql> SELECT STX_deg2dms_deg(@d), STX_deg2dms_min(@d), STX_deg2dms_sec(@d); +---------------------+---------------------+---------------------+ | STX_deg2dms_deg(@d) | STX_deg2dms_min(@d) | STX_deg2dms_sec(@d) | +---------------------+---------------------+---------------------+ | 135 | 30 | 10.123399999986304 | +---------------------+---------------------+---------------------+ 1 row in set (0.000 sec)
.
