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

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

## ソースコード

動作確認環境: Ruby 2.6.5

```ruby
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/9fd82eb0-3520-a1db-f403-289b8533a1d1.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/8f2e6a81-aaea-843a-cb9f-c2e1ee6fc9b3.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/0f719fdd-0c5a-c1cb-09f4-d78a9550bff2.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/b2450eba-0ee3-ca4c-87e6-5cd9e74f5781.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/c51a0312-4f3b-ea4b-a54b-f2159d1ee647.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/32a2aff1-3c9e-a07b-8801-4bc33c2530eb.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/33b3def0-92e5-fc87-ea17-0f1cfa3c3fb1.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/5369eaf7-ca02-5120-56f6-b64459053480.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/4670d559-4f46-30ad-2049-809eb8c487c4.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/a71371b4-dde9-1783-aefb-87cf4fec6d09.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/3e3f2e72-44a3-4596-b83c-ab7531465584.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/1d58119d-1efb-ba71-c84a-54a43b26f9a7.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/ebbfd248-2d7b-209d-fc95-ac0569453088.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/1ffc894f-d64e-d3bd-c49a-2c2afd4c771c.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/fcbc36d5-ba5f-9c5d-46be-4d830589aadc.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/67e20c57-82b4-6e9d-7273-fd9577856a54.png)

## 参考資料
- [YOLP\(地図\):2点間距離API \- Yahoo\!デベロッパーネットワーク](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/distance.html)
- [YOLP\(地図\):Yahoo\!スタティックマップAPI \- Yahoo\!デベロッパーネットワーク](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/static.html)
- [日本へそ公園 \- Wikipedia](https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%B8%E3%81%9D%E5%85%AC%E5%9C%92)
- [納沙布岬 \- Wikipedia](https://ja.wikipedia.org/wiki/%E7%B4%8D%E6%B2%99%E5%B8%83%E5%B2%AC)
- [荒崎 \(沖縄県\) \- Wikipedia](https://ja.wikipedia.org/wiki/%E8%8D%92%E5%B4%8E_(%E6%B2%96%E7%B8%84%E7%9C%8C))