MySQL: ストアドで度分秒変換

GIS関係のデータを探していると、緯度経度を表す数値として、度で表されているものと、度分秒で表されているものがあります。MySQLで扱えるのは、度(「35.65810012度」のような数字)です。度分秒(「35度39分29.172秒」のような表現)で公開されているデータを度単位に直すのが意外と面倒くさいので、こんなストアドを試しに作ってみました。

delimiter //
CREATE FUNCTION dfb2deg(d float, f float, b float)
                RETURNS float DETERMINISTIC
  RETURN d+f/60+b/60/60
//
delimiter ;

こうやって使います。

mysql> SELECT dfb2deg(139, 44, 28.8869);
+---------------------------+
| dfb2deg(139, 44, 28.8869) |
+---------------------------+
|        139.74136352539062 |
+---------------------------+

 ちょっとした手作業の中で、度分秒を少数単位に変換したい場合は、上のような使い方で得た数字をコピーするなどして使えば良いですし、もう変換しながら処理に供したいような場合は以下のように、一旦変数に入れて ST_GeomFromText() かける方法がありそうです。(この例自体は、一旦内部バイナリに変換したものを、そのままテキストに戻しているだけなので意味はありませんが、利用法の例として)
 なおこの緯度経度があらわすのは、日本経緯度原点の十字の交点です。

mysql> set @lon=dfb2deg(139, 44, 28.8869);
mysql> set @lat=dfb2deg( 35, 39, 29.1572);
mysql> set @mypointwkt=CONCAT("POINT(",@lat," ", @lon, ")")

mysql> SELECT ST_AsText(ST_GeomFromText(@mypointwkt));                                                                         
+---------------------------------------------+
| ST_AsText(ST_GeomFromText(@mypointwkt))     |
+---------------------------------------------+
| POINT(35.65810012817383 139.74136352539062) |
+---------------------------------------------+


 MySQLでストアドを日常的に使っている人はあまりいないかもしれませんが、こうやって使うと便利だよという例としても、紹介いたしました。