Help us understand the problem. What is going on with this article?

Rubyを使って住所から緯度経度を求めてみよう!

More than 5 years have passed since last update.

はじめに

今考えているアプリで住所から緯度経度を求める必要があり、ちょうど 再就職のために Rubyの勉強をしているので試してみました。
geocodingをするなら Google Maps API を直ぐに思い付きましたが、下記の様な制限があり、利用制限が比較的緩い Yahoo!ジオコーダAPI を使ってみます。

Google Geocoding API - 利用制限

Google Geocoding API 使用時のクエリ制限として、1 日あたりの位置情報リクエストが 2,500 回に制限されています(Google Maps API for Business をご利用の場合は、1 日あたり 100,000 件までリクエストを実行できます)。

ちなみにジオコーディングとは

ジオコーディング(英語: geocoding)は、各種情報に対して、関連する地理座標(典型的には緯度・経度)を付加すること、およびこれに関する技術やソフトウェアをいう。付加された地理座標のことをジオコードと称する。

準備

  1. Yahoo!ジオコーダAPI を使う場合に Yahoo! JAPAN ID が必要なため持っていない人はここで作成して下さい。
  2. Yahoo!ジオコーダAPI を使う場合は、事前に アプリケーションID を発行する必要があります。 アプリケーションID の発行についてはここを参照して下さい。

APIの概要

1.住所から緯度経度を求める Yahoo!ジオコーダAPI についてはここを参照して下さい
2.緯度経度から住所を求める Yahoo!リバースジオコーダAPI についてはここを参照して下さい

さてコーディング

Google Maps API との比較もしてみましょう。

geocoder_test.rb
require 'net/http'
require 'json'

BASE_URL_GOOGLE_MAP = "http://maps.google.com/maps/api/geocode/json"
BASE_URL_YOLP_GEOCODER = "http://geo.search.olp.yahooapis.jp/OpenLocalPlatform/V1/geoCoder"
BASE_URL_YOLP_REVERSE_GEOCODER = "http://reverse.search.olp.yahooapis.jp/OpenLocalPlatform/V1/reverseGeoCoder"
APP_ID_YAHOO = "取得したアプリケーションIDを記述する"

# Google Map API
def geocode_google_map(address)

  puts "Geocode by Google Map API"

  address = URI.encode(address)
  hash = Hash.new
  reqUrl = "#{BASE_URL_GOOGLE_MAP}?address=#{address}&sensor=false&language=ja"
  response = Net::HTTP.get_response(URI.parse(reqUrl))

  # レスポンスコードのチェック
  # 詳細は http://magazine.rubyist.net/?0013-BundledLibraries
  case response
  # 200 OK
  when Net::HTTPSuccess then
    data = JSON.parse(response.body)
    hash['lat'] = data['results'][0]['geometry']['location']['lat']
    hash['lng'] = data['results'][0]['geometry']['location']['lng']
  # それ以外
  else
    hash['lat'] = 0.00
    hash['lng'] = 0.00
  end

  return hash

end

# Yahoo!ジオコーダAPI
def geocode_yolp(address)

  puts "Geocode by Yahoo!ジオコーダAPI"

  address = URI.encode(address)
  hash = Hash.new

  # 出力形式にJSONを指定する
  reqUrl = "#{BASE_URL_YOLP_GEOCODER}?appid=#{APP_ID_YAHOO}&query=#{address}&output=json"
  response = Net::HTTP.get_response(URI.parse(reqUrl))

  # レスポンスコードのチェック
  # 詳細は http://magazine.rubyist.net/?0013-BundledLibraries
  case response
  # 200 OK
  when Net::HTTPSuccess then
    data = JSON.parse(response.body)
    #p status # for DEBUG
    # YOLPでの座標情報は緯度経度に分かれていない(カンマ区切りの)ため分解する
    coordinates = data['Feature'][0]['Geometry']['Coordinates'].split(/,\s?/)
    hash['lat'] = coordinates[1].to_f # 緯度
    hash['lng'] = coordinates[0].to_f # 経度
  # それ以外
  else
    hash['lat'] = 0.00
    hash['lng'] = 0.00
  end

  return hash

end

# Yahoo!リバースジオコーダAPI
def reverse_geocode_yolp(coordinates)

  puts "Reverse Geocode by Yahoo!リバースジオコーダAPI"

  lat = coordinates['lat'].to_s
  lng = coordinates['lng'].to_s

  # 出力形式にJSONを指定する
  reqUrl = "#{BASE_URL_YOLP_REVERSE_GEOCODER}?appid=#{APP_ID_YAHOO}&lat=#{lat}&lon=#{lng}&output=json"

  #p reqUrl # for DEBUG
  response = Net::HTTP.get_response(URI.parse(reqUrl))

  # レスポンスコードのチェック
  # 詳細は http://magazine.rubyist.net/?0013-BundledLibraries
  case response
  # 200 OK
  when Net::HTTPSuccess then
    data = JSON.parse(response.body)
    #p status # for DEBUG
    address = data['Feature'][0]['Property']['Address']
  # それ以外
  else
    address = "住所が取得出来ません"
  end

end

puts "========================================================="
p geocode_google_map("東京都港区芝公園4‐2‐8")
puts "========================================================="
coordinates = geocode_yolp("東京都港区芝公園4‐2‐8")
p coordinates
p reverse_geocode_yolp(coordinates)
puts "========================================================="

実行結果

$ ruby geocoder_test.rb
=========================================================
Geocode by Google Map API
{"lat"=>35.6587039, "lng"=>139.7454081}
=========================================================
Geocode by Yahoo!ジオコーダAPI
{"lat"=>35.65870316, "lng"=>139.74540779}
Reverse Geocode by Yahoo!リバースジオコーダAPI
"東京都港区芝公園4丁目2-8"
=========================================================
$

まとめ

「Yahoo! Open Local Platform」の ジオコーダAPIリバースジオコーダAPI の紹介でした。

takataka5845
Software Engineer. 今まで通信制御、業務系、Web系、カーナビ、SIPのソフトウェア開発を経験(並べてみるとC/C++系が多いな...)して、直近ではスタートアップ系企業でcocos2d-xを使ったスマフォ向けゲームアプリやってました。 知的探求者。夫。読書家。意外と小心者で悩み多き日々を過ごす。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした