1 目的

OpenStreetMap(OSM)のデータにアクセスし,商店街と商店街の店舗を地図上に可視化.

  • 商業施設(商店)(shop)とアメニティ施設(amenity)を地図上に可視化.
  • 商業施設やアメニティ施設のを計算.
  • 道路を色付けして商店街を可視化.

ライブラリ:tidyverseosmdatamapview

library(tidyverse)
library(osmdata)
library(mapview)

2 笹山商店街

2.1 OSMのデータ取得

  • osmdata:OSMデータにアクセスするためのRパッケージ.
    • OSMデータを取得するには範囲を指定しないと何も始まらない.ここでは,商店街のような狭い範囲を前提とする.1

緯度経度の探し方

  • OpenStreetMapの検索ボックスに住所等のキーワードを打ち込み,該当箇所を表示.
    • 「拡大」・「縮小」ボタンなどで範囲を決定.
    • 画面左上方向にある「エクスポート」をクリックすると,緯度経度が表示される.これをコピーまたはメモ.


  • opq():調べた緯度経度を用いて範囲を指定し,指定範囲のデータにアクセス.bbox()はバウンディングボックスのこと.
    • add_osm_feature():注目する地物を指定.今回は店舗shopを指定(JA:Key:shop.その他の選択肢の詳細はJA:Map Features.).
    • osmdata_sf():sfオブジェクトに変換
      • ポイント(osm_points),ライン(osm_lines),ポリゴン(osm_polygons)の3つのリスト形式データで構成.

2.2 笹山商店街の商業施設

sasayama_shop <-
  opq(bbox=c(139.56470,35.48814,139.56824,35.48617)) %>%
  add_osm_feature(key="shop") %>%
  osmdata_sf()
  • ダウンロードしたデータは3つのリスト形式データで構成されているため,必要な情報のみ抽出.
    • 3つのリスト形式のうち,ポイントデータを利用.
    • sasayama_shop[["osm_points"]]:リスト内の特定の要素を抽出する方法.
sasayama_shop2 <-
  sasayama_shop[["osm_points"]] 

笹山商店街の商業施設の可視化

  • 背景としてOpenStreetMapのみ使用.
mapview(sasayama_shop2,
        map.types=c("OpenStreetMap"))

店舗数の計算

  • count():今回の場合はポイントの合計を返す.
    • 14店舗だとわかる.
    • なお,店舗数は反映されているOpenStreetMapに基づくため,最新ではない可能性があることに注意.
sasayama_shop2 %>%
  count()
n geometry
14 MULTIPOINT ((139.5681 35.48…

2.3 笹山商店街のアメニティ施設

  • 上の地図(場合によっては+(Zoom in)をクリックして大きさを調整)を見ると,レストラン(🍴)やバー(カクテルグラスのマーク)にポイントが付いてないことがわかる.
    • これはこれらが商業施設(shop)ではなくアメニティ施設(amenity)と登録されているため.
    • 改めて,OSMデータにアクセス.
    • ここでは,amenityをすべて表示するのではなく,restaurantbarだけ抽出.
sasayama_restaurant <-
  opq(bbox=c(139.56470,35.48814,139.56824,35.48617)) %>%
  add_osm_features(features=list (
        "amenity"="restaurant",
        "amenity"="bar")) %>% 
  osmdata_sf()

商業+アメニティ施設の可視化

  • 最も簡易な方法
    • sasayama_restaurantのポイントデータのみ利用.
    • sasayama_shopsasayama_restaurantのシェープファイルを合併し,mapview()で表示.
#データ合併 
sasayama_shopstreet <-
  c(sasayama_shop, sasayama_restaurant)

#ポイントデータのみ利用
sasayama_shopstreet <-
  sasayama_shopstreet[["osm_points"]] 

#可視化
mapview(sasayama_shopstreet,
        map.types=c("OpenStreetMap"))
  • 今度はレストランとバーにもポイントが付いてることを確認.

店舗数の計算

  • 17店舗に増加.
sasayama_shopstreet %>%
  count()
n geometry
17 MULTIPOINT ((139.5681 35.48…

2.4 視覚的要素の活用

  • 商品を分類するコードを活用して,商品ごとに色付け.
    • やっかいな点は,keyがshopamenityで異なる点.そこで,先とは異なった形式でファイルを合併.
    • sasayama_shop2のシェープファイルから必要な列(変数)のみを選択(select()).
sasayama_shop2 <-
  sasayama_shop2 %>% 
  select(osm_id, name, shop)

#最初の6行
sasayama_shop2 %>% 
  head()
osm_id name shop geometry
6066191287 6066191287 笹山中央マート mall POINT (139.567 35.48712)
6066191288 6066191288 イチノセ電子サービス electronics POINT (139.566 35.48717)
6066191291 6066191291 萩原鮮魚 seafood POINT (139.566 35.48706)
6066191292 6066191292 石原青果 greengrocer POINT (139.5659 35.48714)
6066191295 6066191295 あぢゃぢゃまんま deli POINT (139.5658 35.48708)
6066191297 6066191297 ユウ hairdresser POINT (139.5658 35.48696)
  • 識別番号(osm_id),店舗名(name),商品種別(shop)のほか,geometryとしてポイント(POINT())が収録されたファイルになっている.


  • アメニティ施設のシェープファイルも同様の作業を行う.
sasayama_restaurant2 <-
  sasayama_restaurant[["osm_points"]]  %>% 
  select(osm_id, name, amenity)

#最初の6行
sasayama_restaurant2 %>% 
  head()
osm_id name amenity geometry
6066191289 6066191289 長寿庵 restaurant POINT (139.5661 35.48712)
6066191296 6066191296 英鮨 restaurant POINT (139.5657 35.48702)
6066191298 6066191298 パブスナック ベル bar POINT (139.5656 35.48692)
  • 列(変数)名を揃えるため,amenityshopに変更し,ファイルをsasayama_restaurant2の下に結合(rbind()).
    • rbind():列名,列の数が揃う必要あり.
#列名の変更
sasayama_restaurant2 <-
  sasayama_restaurant2 %>% 
  rename(shop=amenity)

#データ結合
sasayama_shopstreet2 <- 
  rbind(sasayama_shop2, sasayama_restaurant2)

可視化

  • zcol:色付けする列(変数)を指定.
#ここでは好みで,デフォルトとは異なる色付け.
#viridisのmako(G)カラーを利用.
#デフォルトの場合,library(scales)およびcol.regionは省いてよい.

library(scales)

mapview(sasayama_shopstreet2, 
        zcol="shop",
        col.region=viridis_pal(option="G"),
        map.types = c("OpenStreetMap"))

2.5 商店街の可視化

  • 冒頭で述べたように,シェープファイルはポイント(osm_points),ライン(osm_lines),ポリゴン(osm_polygons)の3つのリスト形式データで構成.
    • ラインには商店街が道路として登録されている.
    • add_osm_feature()highwayにアクセス.
    • 名前のない(NA欠損値)道路も多いため,これは省く.
sasayama_highway <-
  opq(bbox=c(139.56470,35.48814,139.56824,35.48617)) %>%
  add_osm_feature(key="highway") %>%
  osmdata_sf()

sasayama_highway <-
  sasayama_highway[["osm_lines"]]%>% 
  select(osm_id, name, highway)

#欠損値削除
sasayama_highway %>% 
  filter(!is.na(name)) ->
  sasayama_highway

#データの最初の6行
sasayama_highway %>% 
  head( )
osm_id name highway geometry
170471658 170471658 笹山商店街 unclassified LINESTRING (139.564 35.4878…
620264354 620264354 笹山アーケード商店街 footway LINESTRING (139.5656 35.486…
  • 今回の指定範囲内には道路名があるのは笹山商店街に関わる2本のみ.

商店街の可視化

  • color:線の色付け指定.デフォルの色付けを使用しないとき.
  • lwd:線の太さを指定.
mapview(sasayama_highway, 
        zcol="name",
        color=c("#357BA2FF", "#0B0405FF"),
        lwd=3,
        map.types = c("OpenStreetMap"))

2.6 笹山商店街と店舗の可視化

  • 折角なので,商店街と店舗の位置を可視化.
    • 背景はCartoDB.Positronを利用.
mapview(sasayama_highway, 
        zcol="name",
        color=c("#357BA2FF", 
                "#0B0405FF"),
        lwd=3,
        map.types=c("CartoDB.Positron"))+
  mapview(sasayama_shopstreet2, 
        zcol="shop",
        col.region=viridis_pal(option="G"))

3 六角橋商店街

3.1 商業施設とアメニティ施設の可視化

  • 神奈川大学関係者が最も利用する東急東横線の白楽駅周辺の六角橋商店街を可視化.
    • 六角橋商店街の周辺を含む.
    • ショップやアメニティの種類が笹山商店街より多いと思われるため,ここでは施設の位置だけを可視し,数を計算.
#六角橋商店街商業施設
rokkakubashi_shop <-
  opq(bbox=c(139.62333,35.49012,139.63031,35.48609)) %>%
  add_osm_feature(key="shop") %>%
  osmdata_sf()

#六角橋商店街アメニティ施設
rokkakubashi_amenity <-
  opq(bbox=c(139.62333,35.49012,139.63031,35.48609)) %>%
  add_osm_feature(key="amenity") %>%
  osmdata_sf()

#ファイル合併
rokkakubashi_streetshop <- 
  c(rokkakubashi_shop, rokkakubashi_amenity)
#ポイントのみ利用
rokkakubashi_streetshop <-
  rokkakubashi_streetshop[["osm_points"]]
#欠損値削除
rokkakubashi_streetshop %>% 
  filter(!is.na(name)) ->
  rokkakubashi_streetshop
#可視化
mapview(rokkakubashi_streetshop)
#店舗数の計算 
rokkakubashi_streetshop %>%
  count()
n geometry
153 MULTIPOINT ((139.6266 35.48…
  • 六角橋商店街周辺も含む店舗数になっていることに注意.

3.2 六角橋商店街の周辺道路

rokkakubashi_highway <-
  opq(bbox=c(139.62333,35.49012,139.63031,35.48609)) %>%
  add_osm_feature(key="highway") %>%
  osmdata_sf()

rokkakubashi_highway <-
  rokkakubashi_highway[["osm_lines"]]%>% 
  select(osm_id, name, highway)

#欠損値削除
rokkakubashi_highway %>% 
  filter(!is.na(name)) ->
  rokkakubashi_highway

#可視化
mapview(rokkakubashi_highway, 
        zcol="name",
        color=viridis_pal(option="G"),
        lwd=2,
        map.types = c("CartoDB.Positron"))

3.3 コンビニ,スーパー,モールの可視化

  • 六角橋商店街周辺のコンビニ,スーパー,モールのみを地図上に表現してみる.
    • filter():列(内の要素)を抽出.
      • 今回はshop列のコンビニ(convenience)とスーパー(supermarket)とショッピングモール(mall)を抽出.
rokkakubashi_streetshop <-
  rokkakubashi_streetshop %>% 
  filter(shop %in% c("convenience", "supermarket", "mall"))
  • col.regions: ポイントの色付け.デフォルトの色を使用しないとき.
  • burst:凡例を分けるオプション.デフォルトはFALSE
mapview(rokkakubashi_streetshop, 
        zcol="shop", 
        burst=TRUE,
        col.regions = c("#60CEACFF", 
                        "#395D9CFF", 
                        "#0B0405FF"),
        map.types = c("OpenStreetMap"))

  1. 横浜市全体の店舗の位置を調べるときのような広い範囲の場合は,getbb()を指定.使い方はgetbb("yokohama jp")のように具体的に地名と国名を入力.ただし,範囲が広いと情報取得に時間がかかり,場合によってはエラーになる.その場合は,もう一度Knitを試みる.↩︎