LoginSignup
1
0

More than 3 years have passed since last update.

YOLPの2点間距離APIで緯度1度分・経度1度分の距離を調べる

Last updated at Posted at 2019-10-08

概要

  • 対象の位置に緯度・経度を1度 (または0.1度、0.01度、0.001度) 足したときの距離を Ruby + YOLP API で調べる
  • 距離の計算には YOLP(地図):2点間距離API を使用する
  • 可視化のために YOLP(地図):Yahoo!スタティックマップAPI を使用して地図画像を出力する
  • 対象位置は「日本へそ公園 (兵庫県西脇市上比延町)」「名古屋駅」「納沙布岬 (のさっぷみさき) 離島を除けば日本の本土最東端」「荒崎 (あらさき) 沖縄本島最南端に位置する岬」の4箇所とする

ソースコード

動作確認環境: Ruby 2.6.5

require 'json'
require 'open-uri'

class Measure

  def initialize(appid)
    @appid = appid
  end

  # point: 基準となる位置など
  # cond: 移動量(緯度経度)など
  def output(point, cond)
    target = []
    cond[:list].each_with_index do |info, i|
      # 緯度経度に移動分の緯度経度を足す
      t = {:lat => point[:lat] + info[:lat], :lon => point[:lon] + info[:lon]}
      # 2点間の距離を求める
      t[:dist] = distance(point, t)
      # ピン名をセット
      t[:pin] = info[:pin]
      # 移動量(緯度経度)に応じてどれだけの距離があるか出力
      puts "#{point[:name]}(#{point[:lat]},#{point[:lon]}): 移動量(#{info[:lat]},#{info[:lon]}) => 距離#{t[:dist]}km"
      # 地図上に載せる情報を追加
      target << t
    end
    # 地図画像を出力
    open("distmap_#{point[:name]}_#{cond[:name]}.png", 'wb').write(map(point, target))
  end

  # 2点間の距離を求める
  def distance(p, t)
    # YOLP(地図):2点間距離API - Yahoo!デベロッパーネットワーク
    # https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/distance.html
    c = "#{p[:lon]},#{p[:lat]} #{t[:lon]},#{t[:lat]}" # 経度・緯度の順番
    url = 'https://map.yahooapis.jp/dist/V1/distance?' +
      URI.encode_www_form({
        'appid'       => @appid,
        'coordinates' => c,
        'output'      => 'json',
      })
    json = open(url).read
    # kmで小数点第6位までの値が入っている
    JSON.parse(json)['Feature'][0]['Geometry']['Distance']
  end

  # 地図画像を返す
  # pointのpとtargetのt
  def map(point, target)
    # YOLP(地図):Yahoo!スタティックマップAPI - Yahoo!デベロッパーネットワーク
    # https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/static.html
    # 緯度・経度の順番
    pinp = "#{point[:lat]},#{point[:lon]},#{point[:lat]}\n#{point[:lon]}"
    pint = {}
    target.each do |t|
      # 緯度・経度の順番
      pint["pin#{t[:pin]}"] = "#{t[:lat]},#{t[:lon]},#{t[:lat]}\n#{t[:lon]}\n#{t[:dist]}km"
    end
    url = 'https://map.yahooapis.jp/map/V1/static?' +
      URI.encode_www_form({
        'appid'  => @appid,
        'pinp'   => pinp,
        'width'  => '600',
        'height' => '600',
      }.merge(pint))
    open(url).read
  end
end

# 基準となる場所
points = [
  # 日本へそ公園 (兵庫県西脇市上比延町)
  {:name => 'Heso',    :lat => 35,        :lon => 135},
  # 名古屋駅
  {:name => 'Nagoya',  :lat => 35.170634, :lon => 136.881751},
  # 納沙布岬 (のさっぷみさき) 離島を除けば日本の本土最東端
  {:name => 'Nosappu', :lat => 43.385056, :lon => 145.816278},
  # 荒崎 (あらさき) 沖縄本島最南端に位置する岬
  {:name => 'Arasaki', :lat => 26.075,    :lon => 127.680833},
]

conds = [
  { # 緯度経度に0.001度足す
    :name => '3',
    :list => [
      {:pin => 'n', :lat => 0.001, :lon => 0.000},
      {:pin => 'e', :lat => 0.000, :lon => 0.001},
    ]
  },
  { # 緯度経度に0.01度足す
    :name => '2',
    :list => [
      {:pin => 'n', :lat => 0.01, :lon => 0.00},
      {:pin => 'e', :lat => 0.00, :lon => 0.01},
    ]
  },
  { # 緯度経度に0.1度足す
    :name => '1',
    :list => [
      {:pin => 'n', :lat => 0.1, :lon => 0.0},
      {:pin => 'e', :lat => 0.0, :lon => 0.1},
    ]
  },
  { # 緯度経度に1度足す
    :name => '0',
    :list => [
      {:pin => 'n', :lat => 1, :lon => 0},
      {:pin => 'e', :lat => 0, :lon => 1},
    ]
  },
]

appid = '<YOUR APPLICATION ID>'

m = Measure.new(appid)

points.each do |p|
  conds.each do |cond|
    m.output(p, cond)
  end
end

出力結果

  • 日本では、緯度(南北方向の移動)の1度分はおおよそ110kmほどの距離になる
  • 日本では、経度(東西方向の移動)の1度分はおおよそ90kmほどの距離になる
  • 北海道は高緯度のため、経度方向の距離が小さくなる
  • 沖縄は低緯度のため、経度方向の距離が大きくなる
Heso(35,135): 移動量(0.001,0.0) => 距離0.11094km
Heso(35,135): 移動量(0.0,0.001) => 距離0.091288km
Heso(35,135): 移動量(0.01,0.0) => 距離1.109405km
Heso(35,135): 移動量(0.0,0.01) => 距離0.912882km
Heso(35,135): 移動量(0.1,0.0) => 距離11.094135km
Heso(35,135): 移動量(0.0,0.1) => 距離9.128817km
Heso(35,135): 移動量(1,0) => 距離110.949629km
Heso(35,135): 移動量(0,1) => 距離91.287788km
Nagoya(35.170634,136.881751): 移動量(0.001,0.0) => 距離0.110944km
Nagoya(35.170634,136.881751): 移動量(0.0,0.001) => 距離0.091098km
Nagoya(35.170634,136.881751): 移動量(0.01,0.0) => 距離1.109437km
Nagoya(35.170634,136.881751): 移動量(0.0,0.01) => 距離0.910983km
Nagoya(35.170634,136.881751): 移動量(0.1,0.0) => 距離11.094448km
Nagoya(35.170634,136.881751): 移動量(0.0,0.1) => 距離9.109825km
Nagoya(35.170634,136.881751): 移動量(1,0) => 距離110.952776km
Nagoya(35.170634,136.881751): 移動量(0,1) => 距離91.097874km
Nosappu(43.385056,145.816278): 移動量(0.001,0.0) => 距離0.1111km
Nosappu(43.385056,145.816278): 移動量(0.0,0.001) => 距離0.08103km
Nosappu(43.385056,145.816278): 移動量(0.01,0.0) => 距離1.111002km
Nosappu(43.385056,145.816278): 移動量(0.0,0.01) => 距離0.810299km
Nosappu(43.385056,145.816278): 移動量(0.1,0.0) => 距離11.110106km
Nosappu(43.385056,145.816278): 移動量(0.0,0.1) => 距離8.102994km
Nosappu(43.385056,145.816278): 移動量(1,0) => 距離111.109843km
Nosappu(43.385056,145.816278): 移動量(0,1) => 距離81.029456km
Arasaki(26.075,127.680833): 移動量(0.001,0.0) => 距離0.110789km
Arasaki(26.075,127.680833): 移動量(0.0,0.001) => 距離0.100054km
Arasaki(26.075,127.680833): 移動量(0.01,0.0) => 距離1.107891km
Arasaki(26.075,127.680833): 移動量(0.0,0.01) => 距離1.000541km
Arasaki(26.075,127.680833): 移動量(0.1,0.0) => 距離11.078981km
Arasaki(26.075,127.680833): 移動量(0.0,0.1) => 距離10.005405km
Arasaki(26.075,127.680833): 移動量(1,0) => 距離110.796788km
Arasaki(26.075,127.680833): 移動量(0,1) => 距離100.053811km

出力結果 (地図画像)

日本へそ公園 (兵庫県西脇市上比延町)

  • 緯度35度
  • 経度135度

移動量1度
Heso(35,135): 移動量(1,0) => 距離110.949629km
Heso(35,135): 移動量(0,1) => 距離91.287788km
distmap_Heso_0.png

移動量0.1度
Heso(35,135): 移動量(0.1,0.0) => 距離11.094135km
Heso(35,135): 移動量(0.0,0.1) => 距離9.128817km
distmap_Heso_1.png

移動量0.01度
Heso(35,135): 移動量(0.01,0.0) => 距離1.109405km
Heso(35,135): 移動量(0.0,0.01) => 距離0.912882km
distmap_Heso_2.png

移動量0.001度
Heso(35,135): 移動量(0.001,0.0) => 距離0.11094km
Heso(35,135): 移動量(0.0,0.001) => 距離0.091288km
distmap_Heso_3.png

名古屋駅

  • 緯度35.170634度
  • 経度136.881751度

移動量1度
Nagoya(35.170634,136.881751): 移動量(1,0) => 距離110.952776km
Nagoya(35.170634,136.881751): 移動量(0,1) => 距離91.097874km
distmap_Nagoya_0.png

移動量0.1度
Nagoya(35.170634,136.881751): 移動量(0.1,0.0) => 距離11.094448km
Nagoya(35.170634,136.881751): 移動量(0.0,0.1) => 距離9.109825km
distmap_Nagoya_1.png

移動量0.01度
Nagoya(35.170634,136.881751): 移動量(0.01,0.0) => 距離1.109437km
Nagoya(35.170634,136.881751): 移動量(0.0,0.01) => 距離0.910983km
distmap_Nagoya_2.png

移動量0.001度
Nagoya(35.170634,136.881751): 移動量(0.001,0.0) => 距離0.110944km
Nagoya(35.170634,136.881751): 移動量(0.0,0.001) => 距離0.091098km
distmap_Nagoya_3.png

納沙布岬 (のさっぷみさき) 離島を除けば日本の本土最東端

  • 緯度43.385056度
  • 経度145.816278度

移動量1度
Nosappu(43.385056,145.816278): 移動量(1,0) => 距離111.109843km
Nosappu(43.385056,145.816278): 移動量(0,1) => 距離81.029456km
distmap_Nosappu_0.png

移動量0.1度
Nosappu(43.385056,145.816278): 移動量(0.1,0.0) => 距離11.110106km
Nosappu(43.385056,145.816278): 移動量(0.0,0.1) => 距離8.102994km
distmap_Nosappu_1.png

移動量0.01度
Nosappu(43.385056,145.816278): 移動量(0.01,0.0) => 距離1.111002km
Nosappu(43.385056,145.816278): 移動量(0.0,0.01) => 距離0.810299km
distmap_Nosappu_2.png

移動量0.001度
Nosappu(43.385056,145.816278): 移動量(0.001,0.0) => 距離0.1111km
Nosappu(43.385056,145.816278): 移動量(0.0,0.001) => 距離0.08103km
distmap_Nosappu_3.png

荒崎 (あらさき) 沖縄本島最南端に位置する岬

  • 緯度26.075度
  • 経度127.680833度

移動量1度
Arasaki(26.075,127.680833): 移動量(1,0) => 距離110.796788km
Arasaki(26.075,127.680833): 移動量(0,1) => 距離100.053811km
distmap_Arasaki_0.png

移動量0.1度
Arasaki(26.075,127.680833): 移動量(0.1,0.0) => 距離11.078981km
Arasaki(26.075,127.680833): 移動量(0.0,0.1) => 距離10.005405km
distmap_Arasaki_1.png

移動量0.01度
Arasaki(26.075,127.680833): 移動量(0.01,0.0) => 距離1.107891km
Arasaki(26.075,127.680833): 移動量(0.0,0.01) => 距離1.000541km
distmap_Arasaki_2.png

移動量0.001度
Arasaki(26.075,127.680833): 移動量(0.001,0.0) => 距離0.110789km
Arasaki(26.075,127.680833): 移動量(0.0,0.001) => 距離0.100054km
distmap_Arasaki_3.png

参考資料

1
0
0

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
1
0