「GPSで取得した緯度・経度情報から、2点間の距離を割り出したい……」 こんなこと考えたことありませんか?
2点間の距離を計算するための計算式は、検索すれば色々と出てくるのですが、
正直、それを1から実装するのは骨が折れるものです。もっと簡単にできないものでしょうか?
色々調べてみたところ、測量に関する様々なAPIが国土地理院から提供されていることがわかりました。
測量計算サイト トップページ
引用:提供されているAPI
①緯度・経度と地心直交座標の相互換算
②距離と方位角の計算
③距離と方向角の計算
④平面直角座標への換算
⑤緯度・経度への換算
⑥世界測地系座標変換(TKY2JGD)
⑦PatchJGD
⑧PatchJGD(標高版)
⑨SemiDynaEXE
⑩ジオイド高
今回は、「2地点の緯度経度情報」から「2点間の距離」を割り出したいので、②距離と方位角の計算を使ってみました。 API説明:測量計算プログラム API使用法
書いてみた
Rubyで以下のようなコードを書きました。 レスポンスは、xmlも選択できるのですが、今回はjsonを採用しています。 新宿駅と、渋谷駅の座標を入力値に実験してみましょう。
require 'json' require 'open-uri' DISTANCE_API = "http://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/bl2st_calc.pl?" def distance(lat1, lng1, lat2, lng2) req_params = { outputType: "json", # 出力タイプ ellipsoid: "bessel", # 楕円体 latitude1: lat1, # 出発点緯度 longitude1: lng1, # 出発点経度 latitude2: lat2, # 到着点緯度 longitude2: lng2 # 到着点経度 } req_param = req_params.map { |k, v| "#{k}=#{v}" }.join("&") result = JSON.parse(open(DISTANCE_API + req_param).read) result["OutputData"]["geoLength"] end p distance(35.689166, 139.704444, 35.654444, 139.706666)
結果
$ ruby dist.rb "3857.347"
単位はメートルで返ってきます。以上です!