概要
- 対象の位置に緯度・経度を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
移動量0.1度
Heso(35,135): 移動量(0.1,0.0) => 距離11.094135km
Heso(35,135): 移動量(0.0,0.1) => 距離9.128817km
移動量0.01度
Heso(35,135): 移動量(0.01,0.0) => 距離1.109405km
Heso(35,135): 移動量(0.0,0.01) => 距離0.912882km
移動量0.001度
Heso(35,135): 移動量(0.001,0.0) => 距離0.11094km
Heso(35,135): 移動量(0.0,0.001) => 距離0.091288km
名古屋駅
- 緯度35.170634度
- 経度136.881751度
移動量1度
Nagoya(35.170634,136.881751): 移動量(1,0) => 距離110.952776km
Nagoya(35.170634,136.881751): 移動量(0,1) => 距離91.097874km
移動量0.1度
Nagoya(35.170634,136.881751): 移動量(0.1,0.0) => 距離11.094448km
Nagoya(35.170634,136.881751): 移動量(0.0,0.1) => 距離9.109825km
移動量0.01度
Nagoya(35.170634,136.881751): 移動量(0.01,0.0) => 距離1.109437km
Nagoya(35.170634,136.881751): 移動量(0.0,0.01) => 距離0.910983km
移動量0.001度
Nagoya(35.170634,136.881751): 移動量(0.001,0.0) => 距離0.110944km
Nagoya(35.170634,136.881751): 移動量(0.0,0.001) => 距離0.091098km
納沙布岬 (のさっぷみさき) 離島を除けば日本の本土最東端
- 緯度43.385056度
- 経度145.816278度
移動量1度
Nosappu(43.385056,145.816278): 移動量(1,0) => 距離111.109843km
Nosappu(43.385056,145.816278): 移動量(0,1) => 距離81.029456km
移動量0.1度
Nosappu(43.385056,145.816278): 移動量(0.1,0.0) => 距離11.110106km
Nosappu(43.385056,145.816278): 移動量(0.0,0.1) => 距離8.102994km
移動量0.01度
Nosappu(43.385056,145.816278): 移動量(0.01,0.0) => 距離1.111002km
Nosappu(43.385056,145.816278): 移動量(0.0,0.01) => 距離0.810299km
移動量0.001度
Nosappu(43.385056,145.816278): 移動量(0.001,0.0) => 距離0.1111km
Nosappu(43.385056,145.816278): 移動量(0.0,0.001) => 距離0.08103km
荒崎 (あらさき) 沖縄本島最南端に位置する岬
- 緯度26.075度
- 経度127.680833度
移動量1度
Arasaki(26.075,127.680833): 移動量(1,0) => 距離110.796788km
Arasaki(26.075,127.680833): 移動量(0,1) => 距離100.053811km
移動量0.1度
Arasaki(26.075,127.680833): 移動量(0.1,0.0) => 距離11.078981km
Arasaki(26.075,127.680833): 移動量(0.0,0.1) => 距離10.005405km
移動量0.01度
Arasaki(26.075,127.680833): 移動量(0.01,0.0) => 距離1.107891km
Arasaki(26.075,127.680833): 移動量(0.0,0.01) => 距離1.000541km
移動量0.001度
Arasaki(26.075,127.680833): 移動量(0.001,0.0) => 距離0.110789km
Arasaki(26.075,127.680833): 移動量(0.0,0.001) => 距離0.100054km