こころがホッコリー

ただイカしたRubyistになりたい人生だった。

緯度経度を入力値に、2地点間の距離計測をしてくれるAPI(国土地理院提供)をRubyで叩いてみた

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"

単位はメートルで返ってきます。以上です!