LoginSignup
13
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-23

背景

「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"

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

13
10
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10