携帯キャリアショップをイルミネーション風にプロットしてみた
クリスマスですね。
クリスマスといえばイルミネーション
ということで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
https://code-estrellita.net/shop/shop_loc.html
イルミネーションっぽい。
ボロノイ分割してみる
また以下を参考にボロノイ分割も試してみる。

- 作者: 谷村晋,金明哲
- 出版社/メーカー: 共立出版
- 発売日: 2010/07/25
- メディア: 単行本
- 購入: 1人 クリック: 11回
- この商品を含むブログ (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
(RStudioからhtmlで保存しようとするとエラーになるので画像のみ)
できた!
と思ったらソフトバンクはiタウンページに掲載されていないショップが多いみたい。。。残念
- iタウンページに掲載されている情報はかなり汚いので要注意
- スクレイピングの仕方が悪かったのか約1/3が重複してた
- Have a good Christmas!