読者です 読者をやめる 読者になる 読者になる

次元の海で溺れる

Rとデータ解析と統計手法たちとわたし

【ggmapで遊んだ話】札幌駅周辺のスープカレー屋マップ

札幌は夏が終わってしまいましたね。

近頃は恥ずかしいコードをばんばん公開して
マサカリを投げて頂くことに喜びを感じて生きています。

さて。

小ネタが続いていて、なんか分析っぽいことをしよーと思いつつ
前処理修行が終わらないので、今週も小ネタになります。

議題「札幌ごはんどころマップを作ってみたい」

ラーメンが良かったけどとりあえず件数少なめなスープカレーでためす

ググったらもう大手サイトさんでマップが存在していた!

・・まあRで同じ見た目のものが作れるかやってみよう

理想は、WEBスクレイピングで抜いてきた住所から座標を取得→マップ作り→食べ歩きルートも書けたら楽しいね!(私が)

って感じです。


方針

①座標から描画する方法をやってみる
②住所から描画する方法をやってみる
③ルートから書いてみる

「札幌駅 スープカレー」とかでテキトーにググったら
6件~10件くらいのお店しかヒットしないので、それを題材に。

パート1:座標から描画してみる

ソースを見たら、Googlemapの描画のとこから直接座標ゲット出来そうだったので、
{rvest}で引っ張ってこようとしたところ、Xpath指定のレベルが足りずに悲惨なことに。。

#6店分の座標を抜きたい

>library(rvest)
> html <- read_html("http://tabelog.com/hokkaido/A0101/A010101/rstLst/RC120501/")
> access <- html %>%
+ html_nodes(xpath = '//div[@class="js-panel js-panel-map list-panel-map"]/p/a/img[@data-original]') %>%
+ print(access)
{xml_nodeset (6)}
[1] <img alt="螂・闃晏膚蠎\x97\x85\x8d 蜑オ謌仙ッコ - 蝨ー蝗ウ" class="js-lazy" data-original="http://maps.google.com/maps/api/staticmap?client=gme-kakakucominc&amp;channel=tabelog.com&amp;sensor=false&amp;hl=ja&amp;center=43.066721045467624,141.35447237801213&amp;markers=color:red%7C43.066721045467624,141.35447237801213&amp;zoom=15&amp;size=545x130&amp;signature=zWO-s9C_IaI_hjbb-3AqnuKpIMY=" height="130" src="" width="545" />
[2] <img alt="繝斐き繝ウ繝\x86繧」 譛ュ蟷碁ァ\x85蜑榊コ\x97 - 蝨ー蝗ウ" class="js-lazy" data-original="http://maps.google.com/maps/api/staticmap?client=gme-kakakucominc&amp;channel=tabelog.com&amp;sensor=false&amp;hl=ja&amp;center=43.06401328397733,141.3547266482323&amp;markers=color:red%7C43.06401328397733,141.3547266482323&amp;zoom=15&amp;size=545x130&amp;signature=rNOqCsmfF8xTBoBsq2sVLmzax2w=" height="130" src="" width="545" />
・
・
・


店名。。文字化けた。。。。

(Googlemapの描画のソースから座標を取ってきて、Rでggmapを描画するという本末転倒なことをしていますが
暇な人だと思って頂ければ幸いです。)

"center="で指定されているところが座標部分になります。
本当はXpath指定時点でここを直接抜けたら前処理が楽なんだろうけど・・・レベル上げたい。

見やすくするとこんな感じに。

> curry_map
    code_y   code_x
1 43.06401 141.3547
2 43.06757 141.3462
3 43.06761 141.3525
4 43.06672 141.3545
5 43.06827 141.3524
6 43.06596 141.3502


お店の位置の座標データフレームが出来たので、描画を開始。
まずは「札幌駅周辺」がお題なので、札幌駅を中心に据えた地図を作ります。

geocode("住所",source="google")...住所から座標を取得
revgeocode(c(×××,△△△))...座標から住所を取得

get_googlemap()の引数zoom,size,scale周りをいろいろ変えながら模索しました。
デフォルト状態だと他の市町村まで入るくらい引きの地図になります。

> sapporo_center <- geocode("Sapporo Station", source = "google") #札幌駅の位置を取得
> sapporo_center
       lon      lat
1 141.3508 43.06862

> sapporo_map <- ggmap::get_googlemap(center = c(lon =sapporo_center[1,1] , lat = sapporo_center[1,2]),
+                                     zoom = 16, size = c(640, 640), scale = 2,
+                                     maptype = "roadmap",color = "color")
Map from URL : http://maps.googleapis.com/maps/api/staticmap?center=43.068625,141.350801&zoom=16&size=640x640&scale=2&maptype=roadmap&sensor=false
> ggmap::ggmap(sapporo_map) #描画

f:id:WAFkw:20150830160515p:plain


うん。

とりあえずカレーマップを作ります。
カレー屋さんの場所に点を打つ。ただそれだけ。

> ggmap(sapporo_map)+
+   geom_point(data=curry_map,aes(x=code_x,y=code_y),color="red",size=7)

f:id:WAFkw:20150830160832p:plain


なんかダサいけどできた!!

パート2:住所から描画したい

「でも座標データフレーム最初から用意すんのなんてめんどくさくね?」

ということで考えてみます

> revgeocode(c(141.3547,43.06401))
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?latlng=43.06401,141.3547&sensor=false
[1] "1 Chome-8 Kita 2 Jōnishi, Chūō-ku, Sapporo-shi, Hokkaidō 060-0002, Japan"

この戻り値みたいな感じに正規化された住所を渡せば座標ゲット出来そう

住所→ローマ字→正規化

の納得いく処理が書けなかったので割愛しますが。。

> geocode("1 Chome-8 Kita 2 Jōnishi, Chūō-ku, Sapporo-shi", source = "google")
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=1%20Chome-8%20Kita%202%20J%c5%8dnishi,%20Ch%c5%ab%c5%8d-ku,%20Sapporo-shi&sensor=false
       lon      lat
1 141.3547 43.06399

住所を渡して、座標ゲットして、、をうまいこと繰り返して、さっきのCurry_mapみたいな座標データフレームを作れればよいのかなと。

食べ歩きルートみたいなのを書いてみたい

さっきの座標データ(Curry_map)をマーカーで書いてみた

#マーカー用にデータ整形
> Curry_p = data.frame(
+                       lon <- c(141.3547, 141.3462, 141.3525, 141.3545,141.3524,141.3502),
+                       lat <- c(43.06401, 43.06757, 43.06761, 43.06672,43.06827,43.06596))

#引数markerを与えて描画
> sapporo_map <- ggmap::get_googlemap(center = c(lon =sapporo_center[1,1] , lat = sapporo_center[1,2]),
+                           zoom = 16, size = c(640, 640), scale = 2,
+                           maptype = "roadmap",color = "color",markers=Curry_p)
Map from URL : http://maps.googleapis.com/maps/api/staticmap?center=43.068625,141.350801&zoom=16&size=640x640&scale=2&maptype=roadmap&markers=43.06401,141.3547%7c43.06757,141.3462%7c43.06761,141.3525%7c43.06672,141.3545%7c43.06827,141.3524%7c43.06596,141.3502&sensor=false
> ggmap::ggmap(sapporo_map)

f:id:WAFkw:20150830162536p:plain

さっきの赤丸よりはダサくない!!Googlemap感!!!

さらにmarker引数と同じような感じで、path引数を与えるとルートも書けるっぽい

> ggmap::ggmap(sapporo_map)
> sapporo_map <- ggmap::get_googlemap(center = c(lon =sapporo_center[1,1] , lat = sapporo_center[1,2]),
+                           zoom = 16, size = c(640, 640), scale = 2,
+                           maptype = "roadmap",color = "color",markers=Curry_p,path=Curry_p)
Map from URL : http://maps.googleapis.com/maps/api/staticmap?center=43.068625,141.350801&zoom=16&size=640x640&scale=2&maptype=roadmap&markers=43.06401,141.3547%7c43.06757,141.3462%7c43.06761,141.3525%7c43.06672,141.3545%7c43.06827,141.3524%7c43.06596,141.3502&path=43.06401,141.3547%7c43.06757,141.3462%7c43.06761,141.3525%7c43.06672,141.3545%7c43.06827,141.3524%7c43.06596,141.3502&sensor=false
> ggmap::ggmap(sapporo_map)

f:id:WAFkw:20150830162759p:plain


・・・・うん。。。

それっぽいものは書けた。(ルートに納得はいかないけど。)

なんか循環セールスマン問題みたいだなあ


欲張らずに2点の間のルートだとroute()使ってからのgeom_path()で書けそうだけど、いまいちうまくいかなかった

#食べ歩きルート
from<-"6 Chome-1 Kita 6 Jōnishi, Chūō-ku, Sapporo-shi"
to<-"2 Chome Kita 5 Jōnishi, Chūō-ku, Sapporo-shi"
route <- route(from, to, structure = 'route')
ggmap(sapporo_map) +
  geom_path(
  aes(x=lon,y=lat), colour = 'red', size = 2,
  data = route, lineend = 'round')

f:id:WAFkw:20150830163733p:plain

書けてはいるけど。。。求めた座標がざっくりしすぎているからなのか、微妙。。。



私による私のための食べ歩きルート構築への道はまだまだ遠そう。