OpenStreetMapの使い方

最近、OSSのマップサービス「OpenStreetMap」が賑わいを見せています。
OpenStreetMapには、ジオコーディングやルート検索などの各種APIが提供されています。
今回は、OpenStreetMapのジオコーディングAPIを利用する方法をrubyのサンプルプログラムを使って説明します。

目標

  • OpenStreetMapのAPIを利用してジオコーディングを行う
  • Rubyを使う

 ジオコーディングとは

「ジオコーディング」とは、住所や地名などから緯度経度を求めることです。
ジオコーディングについてさらに詳しい情報は、こちらで確認できます。

 OpenStreetMapとは

「OpenStreetMap」とは、簡単にいうとフリーで利用することができるGoogleマップのようなものです。
こちらのページから、提供されているAPIなどの詳細を確認できます。

利用するエンドポイント

ジオコーディングに用いるAPIエンドポイントは以下のとおりです。

http://nominatim.openstreetmap.org/search?
http://nominatim.openstreetmap.org/search/?

プログラムの流れ

以下、OpenStreetMapのAPIを利用して、ジオコーディングを行うRubyのプログラムの流れです。

  1. ジオコーディング対象となる住所/地名を指定(例として、東京タワーを指定)
  2. OpenStreetMapのジオコーディングAPIへアクセスし、結果を取得
  3. 取得した結果を出力
    上記の流れを、サンプルプログラムで説明します。

サンプルプログラム

下記のgeoCodingOSM.rb.rbは、上記の流れに沿って記述したプログラムです。

require "httparty"

## 1. ジオコーディング対象となる住所、地名を指定
venue = "東京タワー"

## 2. OpenStreetMapのジオコーディングAPIへアクセスし、結果を取得
endpointUrl = "http://nominatim.openstreetmap.org/search/#{venue}?format=xml&polygon=0&addressdetails=1"
response =  HTTParty.get(URI.encode(endpointUrl))
puts endpointUrl

## 3. 取得した結果を出力
lat = response["searchresults"]["place"][0]["lat"]
lon = response["searchresults"]["place"][0]["lon"]

puts "緯度:#{lat},経度:#{lon}"

プログラムの実行

geoCodingOSM.rbを実行することで、東京タワーの緯度経度を取得することができます。
以下、プログラムの実行例です。

$ ruby geoCodingOSM.rb

実行結果

実行結果は、次のようになります。

緯度:35.65858645,経度:139.745440057962

Googleで以下のように検索してみると、上記の緯度経度は、東京タワーのものであることを確認できます。

https://www.google.co.jp/search?q=35.65858645%2C139.745440057962

まとめ

以上、OpenStreetMapのAPIとrubyを利用して、ジオコーディングを簡単することができました。