2014年7月16日水曜日

RからYahoo!のジオコーディングを利用する方法

ジオコーディングというのは、
 入力: 住所の文字列
 出力: 緯度経度の数値
という処理のことです。YahooやGoogleがAPIを公開しています。

YahooのAPIの仕様は↓下記のページにあります。

YOLP(地図):Yahoo!ジオコーダAPI - Yahoo!デベロッパーネットワーク

このページの説明にしたがって、住所文字列をエンコードしてURLに埋め込んで、ブラウザのアドレス欄に入れれば結果が返ってきます。

でも、こういうのはプログラムから使いたいですよね。で、私が多少なりとも使いなれているRでのやり方を書きとめておきます。

普通に使うときは、一連の処理を関数の形にして、それを呼び出すような書き方をする方がすっきりするのですが、今回は使い方の紹介がメインなので、あえてベタ書きしています。

あと、アプリケーションIDは各人で取得する必要があります。YahooのIDを持っていれば(持っていない場合は作れば)、無料で取得できます。

library(RCurl)
library(RJSONIO)
 
# appidのところは自分で取得したものを入れてください
root <- "http://geo.search.olp.yahooapis.jp/OpenLocalPlatform/V1/geoCoder?appid=xxxxxxxxxx&output=json"
addr <- "東京都墨田区押上1-1-13"
url   <- paste(root, "&query=", addr, sep="")
url.u <- URLencode(iconv(url, "", "UTF-8")) # UTF-8に変換
 
# プロキシへの対処(使っていない場合はgetURL(url.u)とそのまま呼んでOK)
curl <- getCurlHandle()
curlSetOpt(.opts=list(proxy="ZZZZZ:8080"), curl=curl) #プロキシURLは環境に合わせて
doc <- getURL(url.u, curl=curl) # curlの指定を追加
 
x <- fromJSON(doc, simplify = FALSE)
 
lat <- unlist(strsplit(x$Feature[[1]]$Geometry$Coordinates, ","))[2]
lng <- unlist(strsplit(x$Feature[[1]]$Geometry$Coordinates, ","))[1]
location_type     <-   x$Feature[[1]]$Property$AddressType
formatted_address <-   x$Feature[[1]]$Property$Address


RESTについての前提知識があって、前述のリンク先の仕様説明が理解できて、RCurlの使い方を知っていれば、普通にできることなんでしょうけど、私はそうではなかったので多少苦労しました。

私がつまづいたのは、文字コード指定とプロキシ指定です。

私はWindowsを使っていて、YahooのAPIはデフォルトではUTF-8を入力することになっているので、iconvしてやる必要がありました。もしくは、リクエストの「ei」パラメタで文字コード(WindowsならSJIS)を指定する方法でもいいです。

プロキシを使っていなければ、そのまま getURL(url.u)のようにリクエストを投げればOKなのですが、私の環境ではプロキシを使っているので指定する必要がありました。サンプルでlocalhostになっているのは、私の環境ではプロキシ中継ツールを使っているからです。この箇所にご自分の環境に合わせてproxyのURLを指定してやればOKです。

プロキシサーバが認証を必要とする場合は、

curlSetOpt(.opts = list(proxy="XXXXX:YYYYY@ZZZZZ:8080"), curl = curl)

  XXXXX: ID
  YYYYY: パスワード
  ZZZZZ: プロキシURL

のようにプロキシURLの前にIDとパスワードをつければOKです。

fromJSON()関数を使うと、JSON形式のオブジェクトを、リスト形式に変換してくれるようです。正直、JSON形式のことはよく理解していないのですが、リストになってしまえば、私にもアクセス方法が分かりました。

x(JSONからリストに変換されたもの)を表示させてみると、リストがどういう内容を持っているか分かるので、あとは

 x$Feature[[1]]$Geometry$Coordinates

のように、各要素にアクセスすればOKですね。

サンプルに書いている

 addr <- "東京都墨田区押上1-1-13"

は、東京スカイツリーの住所なのですが、これで試してみると、

> (lat <- unlist(strsplit(x$Feature[[1]]$Geometry$Coordinates, ","))[2])
[1] "35.71000629"

> (lng <- unlist(strsplit(x$Feature[[1]]$Geometry$Coordinates, ","))[1])
[1] "139.81070961"

> (location_type     <-   x$Feature[[1]]$Property$AddressType)
[1] "地番・戸番"

> (formatted_address <-   x$Feature[[1]]$Property$Address)
[1] "東京都墨田区押上1丁目1-13"

のような感じで結果が返ってきます。

AddressTypeを見ると情報の粒度が分かります。

 「東京都墨田区押上1-1-13」 → 「地番・戸番」
 「東京都墨田区押上」    → 「町・大字」
 「東京都墨田区」      → 「特別区」

のように値が設定されます。

また、Addressを見ると、どういう住所だと認識して結果を返してきたのかを確認することができます。




0 件のコメント:

コメントを投稿