背景
「GPSで取得した緯度・経度情報から、2点間の距離を割り出したい……」
こんなこと考えたことありませんか?
2点間の距離を計算するための計算式は、検索すれば色々と出てくるのですが、
正直、それを1から実装するのは骨が折れるものです。もっと簡単にできないものでしょうか?
色々調べてみたところ、測量に関する様々なAPIが国土地理院から提供されていることがわかりました。
http://vldb.gsi.go.jp/sokuchi/surveycalc/main.html
引用:提供されているAPI
①緯度・経度と地心直交座標の相互換算
②距離と方位角の計算
③距離と方向角の計算
④平面直角座標への換算
⑤緯度・経度への換算
⑥世界測地系座標変換(TKY2JGD)
⑦PatchJGD
⑧PatchJGD(標高版)
⑨SemiDynaEXE
⑩ジオイド高
今回は、「2地点の緯度経度情報」から「2点間の距離」を割り出したいので、②距離と方位角の計算を使ってみました。
API説明:
http://vldb.gsi.go.jp/sokuchi/surveycalc/api_help.html
書いてみた
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"
単位はメートルで返ってきます。以上です!