Google Geocoding APIとGoogle Static MAP APIを使って指定した住所(文字列)を地図上に表示をさせる
に触発されて、住所(複数)を地図表示をさせるコードを書いてみたって話。Rやパッケージのバージョン依存性が結構あって、上記スライドのコードのままでは動かなかったので適当に変更&今後を考えてある程度関数化しておいた。
使用したパッケージは
だそうなので、"CP932"と書いている箇所を削ってしまえば良いかもしれない。
使用したパッケージは
- 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®ion=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)〜
@teramonagi @mikado_hito R で iconv を使う時は from を省略すると (空文字列にすると) 環境依存のロケールになるので from は省略した方が非環境依存のコードになるという噂が。
— kos59125さん (@kos59125) 10月 29, 2012
だそうなので、"CP932"と書いている箇所を削ってしまえば良いかもしれない。
*1:数字は半角数字の方がよさげ。国会議事堂の住所を全角で指定したら