Nominatim APIをRから利用する

OSMが提供するAPIの一種であるNominatimをRから利用する方法とラッパーパッケージを紹介します。

Shinya Uryu

3 minute read

この記事はOpenStreetMap Advent Calendar 2016の21日目です。あまりOMSについての知識がないですが、空いていたので書かせていただきました。

Open Street Map (OSM)のAPIの中にNominatimというものがあります。このAPIはOSMが所有する豊富な地理空間データの検索や、座標をリクエストに含めて実行する逆ジオコーディングツールとして利用できます。例えば、「東京タワー」の情報はhttp://nominatim.openstreetmap.org/search?q=東京タワー&format=jsonにリクエストを送ることでJSON形式で得られます。

RからこのAPIを利用するには{httr}{crul}を使って以下のようなコードを実行します。

library(magrittr)
library(crul)

x <- crul::HttpClient$new(url = "http://nominatim.openstreetmap.org/search?")
jsonlite::fromJSON(x$get(query = list(format = "json", q = "東京タワー", countrycodes = "jp"))$parse())

Nominatimを利用する機会があったので、このままラッパーパッケージ化しようと思いましたが、すでにパッケージを作っている方がいましたので、今回はそちらのパッケージを紹介することにします。注意点として、このパッケージを利用する際は事前にOSM API Key (Mapquestで作成)を用意しておく必要がありますので、適宜取得しておきましょう。

パッケージはCRANには登録されていませんので、GitHubから開発版をインストールします。

# GitHub上のパッケージをインストールしてきます
# install.packages("githubinstall")
library(githubinstall)
gh_install_packages("nominatim")

{nominatim}パッケージではNominatimが提供する以下のサービスをR関数として利用可能です。いくつかの関数を試してみましょう。

  • address_lookup()
  • osm_geocode()
  • osm_search()
  • osm_search_spatial()
  • reverse_geocode_coords()
  • reverse_geocode_osm()
  • bb_lookup()
library(nominatim)

検索

地名あるいは住所をパラメータに含めます。次のコードは、先に{crul}でリクエストしたものと同様です。

# 日本語はエンコードしておく必要があります
osm_search(urltools::url_encode("東京タワー"), country_codes = "jp", accept_language = "ja;q=1.0")
##     place_id
## 1 2619450075
##                                                                                licence
## 1 Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright
##   osm_type  osm_id         lat           lon
## 1 relation 4247312 35.65858645 139.745440058
##                                                   display_name   class
## 1 東京タワー, 祝田通り, 港区, 東京都, 関東地方, 105-0001, 日本 tourism
##         type    importance
## 1 attraction 0.57891275564
##                                                                                                                     icon
## 1 http://ip-10-116-140-74.mq-us-west-2.ec2.aolcloud.net:8000/nominatim/v1/images/mapicons/poi_point_of_interest.p.20.png
##    bbox_left   bbox_top bbox_right bbox_bottom
## 1 35.6580427 35.6591227 139.744746 139.7461594
# osm_search("tokyo tower", country_codes = "jp", accept_language = "ja;q=1.0")
osm_geocode(urltools::url_encode("東京タワー"))

逆ジオコーディング

座標を与えて実行します。OSMで「東京タワー」を調べた際に得られる緯度経度を引数に指定しましょう。当然ながらOSMで表示される東京タワーの住所が返ってきます。

reverse_geocode_coords(lat = 35.65858, lon = 139.74545)
##     place_id
## 1 2619450075
##                                                                                licence
## 1 Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright
##   osm_type  osm_id         lat           lon
## 1 relation 4247312 35.65858645 139.745440058
##                                                      display_name
## 1 Tokyo Tower, Iwaida Dori, Minato, Tokyo, Kanto, 105-0001, Japan
##    attraction        road   city state_district region postcode country
## 1 Tokyo Tower Iwaida Dori Minato          Tokyo  Kanto 105-0001   Japan
##   country_code
## 1           jp

ただ、いくつか逆ジオコーディングを試してみましたが、精度はそこまでよくないかもしれないという印象です。何か良い逆ジオコーディングがあれば教えて欲しいです。

  •   Category
  • geo
comments powered by Disqus