この日記は RDBMS GIS アドベントカレンダー2018の12日目向けに書きました。
ST_DISTANCE()
spatial関数で2点間の距離を返す関数がST_DISTANCE()だというのは知っている。
ところが、公式ドキュメントからは実際に登録されているテーブルの値を使う方法が書いてないので、実際にはどういう風に活用すべきかがイメージしにくかった。
('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の値はここではそれぞれ「東京都千代田区内幸町二丁目」と「東京都千代田区内幸町一丁目」を指している。
ちなみに、データについては先日の記事で作ったやつを活用している。
結果はこうなった
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か。
GoogleMapで二点間のルートを確認してみると道なりに歩いて約500mと出たので、まあそんなもんだろう、と。
もっといい方法あるかもしれないけど
SUBQUERY側のテーブルのインデックスさえ調整すればいいから、今はそれなりに満足している。