Google Geocoding APIとGoogle Static MAP APIを使って指定した住所(文字列)を地図上に表示をさせる

@mikado_hito(若おっさん)の資料

に触発されて、住所(複数)を地図表示をさせるコードを書いてみたって話。Rやパッケージのバージョン依存性が結構あって、上記スライドのコードのままでは動かなかったので適当に変更&今後を考えてある程度関数化しておいた。
使用したパッケージは

  • RCurl(1.95-1.1)
  • rjson(0.2.10)
  • RgoogleMaps(1.2.0.2)

の3つで、これはあらかじめinstall.packages関数でインストールしておく。以下、適当に関数化した部分のコード

library(RCurl)
library(rjson)
library(RgoogleMaps)
#住所を文字列で入力すると位置情報をjson形式で返却する関数
GetLocationInformation <-function(address)
{
  #URL用にエンコーディング
  address <- RCurl::curlEscape(iconv(address,"CP932","UTF-8"))
  #URL(API)生成
  url <- paste("http://maps.googleapis.com/maps/api/geocode/json?address=",
               address,"&sensor=false&region=JP&language=ja",sep="")
  RCurl::getURL(url)
}
#住所(文字列ベクトル)を緯度・経度へ
GetLatitudeAndLongitude <- function(addresses)
{
  #各住所をgoogle APIで位置情報(json)へ
  jsons <- sapply(addresses,GetLocationInformation)
  #googleAPIで取得した位置情報(json)から経度・緯度情報を抽出
  ExtractLatitudeAndLongitude <- function(json)
  {
    latitude  <- rjson::fromJSON(json)$results[[1]]$geometry$location$lat
    longitude <- rjson::fromJSON(json)$results[[1]]$geometry$location$lng
    c(lat=latitude,lon=longitude)
  }
  t(sapply(jsons,ExtractLatitudeAndLongitude))
}
#緯度経度情報をマーカー文字列へ
LocationToMarkers <- function(location)
{
  latitude.and.longitude <- apply(location,1,function(x)paste(x,collapse=","))
  markers <- sapply(latitude.and.longitude,function(x)paste("&markers=color:blue|",x,sep=""))
  paste(markers,collapse="")
}
#緯度経度情報をパス情報へ
LocationToPath <- function(location)
{
  latitude.and.longitude <- apply(location,1,function(x)paste(x,collapse=","))
  paste("&path=color:0x0000ff|",paste(latitude.and.longitude,collapse="|"),sep="")
}

これを使って

を地図上でマーキングし、2点を結ぶには以下のように書けばOK。ここでは2つでやっているが、もちろん3つ以上住所があっても良い*1

#表示したい住所を文字列ベクトルとして設定
addresses <- c("東京都台東区元浅草3丁目1-1","東京都千代田区丸の内1丁目9−1")
#緯度経度情報へ変換
location  <- GetLatitudeAndLongitude(addresses)
#地図の倍率の設定
zoom <- min(MaxZoom(range(location[,"lat"]), range(location[,"lon"])));
#地図生成
map <- GetMap(center=colMeans(location),
              markers=LocationToMarkers(location),
              path=LocationToPath(location),
              maptype="roadmap",
              zoom=zoom,
              destfile="example_map.png")

結果は

私のマシンのOSがwindoesなので、URL用に住所文字列をエンコーディングするときに

RCurl::curlEscape(iconv(address,"CP932","UTF-8"))

としているが、これは使用しているOS・環境に合わせて変えないとだめなはず。
追記(2012/10/31)〜


だそうなので、"CP932"と書いている箇所を削ってしまえば良いかもしれない。

*1:数字は半角数字の方がよさげ。国会議事堂の住所を全角で指定したら