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でストアドを日常的に使っている人はあまりいないかもしれませんが、こうやって使うと便利だよという例としても、紹介いたしました。
追記(2026年2月)
ここではストアドでの記述法を紹介しましたが、7年ほど経ってUDF(MySQL Plugin)に実装するという方法を手に入れました。2019年には思いもしなかった「AIにざっくり書かせる」で十分問題なく解決できる機能が一瞬でできてしまうことに、時代の流れを感じます。
そして7年も経つと、2019年には度分秒を dfb と表現していた人間が、しっかりと dms と表現するようになるくらいには、成長するようです。
GitHubはこちら:
github.com
紹介ブログはこちら:
sakaik.hateblo.jp