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

INPUTしたらOUTPUT!

忘れっぽいんでメモっとく

携帯キャリアショップをイルミネーション風にプロットしてみた

クリスマスですね。 クリスマスといえばイルミネーション
ということでleafletで携帯キャリアショップをイルミネーション風にプロットしてみた。


とりあえずプロット

Japan.Rで学んだleafletを使ってプロットしてみる。データはiタウンページからスクレイピングGeocoding - 住所から緯度経度を検索APIで逆ジオコーディングして用意した。


> shop <- read.csv("shop_clen.csv", header=TRUE)
> pal <- colorFactor(palette = c("orange", "red", "gray"), domain = shop$carrier)
> m <- leaflet(shop) %>%
+   addProviderTiles("CartoDB.DarkMatter") %>%
+   addCircleMarkers(lng=~lng, lat=~lat, popup=~name, weight=3, 
+                    radius=5, color=~pal(carrier), 
+                    fillOpacity = 0.9) %>%
+   addLegend(pal = pal, values = ~carrier, opacity = 1) %>%
+   setView(lng=139.745464, lat=35.658593, zoom=11)
> m


f:id:tak95:20151224203210p:plain

https://code-estrellita.net/shop/shop_loc.html

イルミネーションっぽい。


ボロノイ分割してみる

また以下を参考にボロノイ分割も試してみる。

地理空間データ分析 (Rで学ぶデータサイエンス 7)

地理空間データ分析 (Rで学ぶデータサイエンス 7)


ほぼリンク先下2つのコピーで恐縮だけど実行したコードは以下の通り。

# ボロノイ分割
library(deldir)
v <- deldir(x = shop$lng, y = shop$lat)
tiles <- tile.list(v)

# ポリゴン化
## ポリゴンベクトルの初期化
library(sp)
polys <- vector(mode = "list", length=length(tiles))
for(i in seq(along=polys)) {
  ## ボロノイ点の取得
  voronoi <- cbind(tiles[[i]]$x, tiles[[i]]$y)
  
  ## 閉路化
  voronoi <- rbind(voronoi, voronoi[1, ])
  
  ## ポリゴンに変換
  polys[[i]] <- Polygons(list(Polygon(voronoi)), ID=as.character(i))
}

library(sp)
v.pl <- vector(mode = "list", length=length(v.tl))
for(i in seq(along=v.pl)){
  pcrds <- cbind(v.tl[[i]]$x, v.tl[[i]]$y)
  pcrds <- rbind(pcrds, pcrds[1, ])
  v.pl[[i]] <- Polygons(list(Polygon(pcrds)), ID=as.character(i))
}

tiledf <- lapply(tiles, function(l) {
  data.frame(tile = l$ptNum, lng = l$pt["x"], lat = l$pt["y"])
}) %>% bind_rows()

# 近傍点を返す関数を定義
getNearPoint <- function(x, y){
  tmp <- dplyr::bind_rows(x, y)[, c("lng", "lat")]
  res <- as.matrix(dist(tmp))[-1, 1]
  result <- y[which.min(res), "carrier"]
  return(result)
}

# 近傍点のキャリアを入れる
for(i in seq(1, nrow(tiledf), 1)){
  message(paste0(Sys.time(), " ", i, "/", nrow(tiledf)))
  tiledf$carrier[i] <- getNearPoint(tiledf[i, ], shop[, c("lat", "lng", "carrier")])
}

SP <- SpatialPolygons(polys)
SPDF <- SpatialPolygonsDataFrame(SP,data=as.data.frame(tiledf))

pal <- colorFactor(palette = c("orange", "red", "gray"), domain = shop$carrier)
m <- leaflet(shop) %>%
  addProviderTiles("CartoDB.DarkMatter") %>%
  addPolygons(data=SPDF, fillOpacity = 0.5, color=~pal(carrier))  %>%
  addCircleMarkers(lng=~lng, lat=~lat, popup=~name, weight=3, 
                   radius=5, color=~pal(carrier), 
                   fillOpacity = 0.9) %>%
  addLegend(pal = pal, values = ~carrier, opacity = 1) %>%
  setView(lng=139.745464, lat=35.658593, zoom=12)
m


f:id:tak95:20151224204513p:plain (RStudioからhtmlで保存しようとするとエラーになるので画像のみ)

できた!
と思ったらソフトバンクはiタウンページに掲載されていないショップが多いみたい。。。残念



  • iタウンページに掲載されている情報はかなり汚いので要注意
  • Have a good Christmas!