41から始めました

文字通り41歳から始めたブログです。DB(MySQL)を使ってお仕事してるので、DB周りの話を中心に最近始めたこととかをTwitterのノリで書いています。なお、本サイトにおいて示されている見解は私個人の見解であり、所属団体や組織を代表するものではありません。

テーブルに登録されている2点間の距離が知りたい ( ST_DISTANCE)

この日記は RDBMS GIS アドベントカレンダー2018の12日目向けに書きました。

ST_DISTANCE()

spatial関数で2点間の距離を返す関数がST_DISTANCE()だというのは知っている。

ST_DISTANCE()

ところが、公式ドキュメントからは実際に登録されているテーブルの値を使う方法が書いてないので、実際にはどういう風に活用すべきかがイメージしにくかった。

f:id:next4us-ti:20181212140148p:plain ('metre'とか'foot'とかは8.0.14から使えるらしいけど、今はドキュメントが先走ってるので注意)

一回アプリケーション噛まさないといけないの?

んなばかな!

答え(他にもあると思うけど)

SUBQUERY化すればいい。

select ST_Distance((select lonlat_point from spacialtest.towns where towns_id = 1),(select lonlat_point from spacialtest.towns where towns_id = 2));

towns_idが1と2の値はここではそれぞれ「東京都千代田区内幸町二丁目」と「東京都千代田区内幸町一丁目」を指している。

f:id:next4us-ti:20181212140639p:plain

ちなみに、データについては先日の記事で作ったやつを活用している。

結果はこうなった

mysql> select ST_Distance((select lonlat_point from spacialtest.towns where towns_id = 1),(select lonlat_point from spacialtest.towns where towns_id = 2));
+----------------------------------------------------------------------------------------------------------------------------------------------+
| ST_Distance((select lonlat_point from spacialtest.towns where towns_id = 1),(select lonlat_point from spacialtest.towns where towns_id = 2)) |
+----------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                                                                           356.45633448247673 |
+----------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

約356mか。

f:id:next4us-ti:20181212141103p:plain

GoogleMapで二点間のルートを確認してみると道なりに歩いて約500mと出たので、まあそんなもんだろう、と。

もっといい方法あるかもしれないけど

SUBQUERY側のテーブルのインデックスさえ調整すればいいから、今はそれなりに満足している。