5 ジオコーディング
5.1 概要
ジオコーディング(geocoding)とは,住所を地理的座標(すなわち緯度と経度)に変換することです。
R
のみでジオコーディングを行うことは難しいので,
ここでは,外部のサーピスやアプリを使ってジオコーディングを行ういくつかの方法を解説します。
その結果をR
に読み込み,GISデータとして分析に使用することを想定しています。
本章で紹介する外部サービスは,
- Google Earth Pro
- Yahoo!ジオコーダAPI
- CSVアドレスマッチングサービス(東京大学)
の3つです。
5.2 データ
佐賀県内のスターバックス店舗の住所一覧を,公式ウェブサイトから作成しました。CSVファイルをこちらからダウンロードすることもできます。
shop | address |
---|---|
佐賀南バイパス店 | 佐賀県佐賀市本庄町袋306-6 |
佐賀大学通り店 | 佐賀県佐賀市与賀町70-1 |
鳥栖プレミアム・アウトレット店 | 佐賀県鳥栖市弥生が丘8-1 |
TSUTAYA鳥栖店 | 佐賀県鳥栖市本鳥栖町537-1 |
鳥栖蔵上町店 | 佐賀県鳥栖市蔵上町662-5 |
基山パーキングエリア(上り線)店 | 佐賀県三養基郡基山町小倉2097-1 |
蔦屋書店武雄市図書館店 | 佐賀県武雄市武雄町武雄5304-1 |
佐賀武雄店 | 佐賀県武雄市武雄町昭和277 |
金立サービスエリア(下り線)店 | 佐賀県佐賀市金立町金立1197-57 |
ゆめタウン佐賀店 | 佐賀県佐賀市兵庫北5-14-1 |
5.3 Google Earth Pro
こちらから,Google Earth Pro をダウンロード,インストールしてください。
Google Earth を起動しまし,「ファイル」→「インポート…」から,starbucks_saga.csv
を読み込みます。
「ファイルのインポート ウィザード」ウィンドウが開きますので,指示に従って,入力ファイルの情報を設定します。
設定が完了すると,データ読み込まれ,画面左の「場所」パネルにstarbucks_saga
と表示され,地図上にスターバックス店舗の位置がプロットされると思います。
次に,このstarbucks_saga
を右クリックし,「名前を付けて場所を保存」を選択します。
そして,ファイルを「Kml」形式で保存します。
ここではstarbucks_saga.kml
という名前で,data
フォルダに保存しておきましょう。
ここからは,R
での作業です。
作成したKmlファイルを,st_read
関数で読み込みます。
<- st_read("data/starbucks_saga.kml") starbucks_ge
## Reading layer `starbucks_saga' from data source
## `/Users/kazukitamura/github/giswithr/data/starbucks_saga.kml'
## using driver `KML'
## Simple feature collection with 10 features and 2 fields
## Geometry type: POINT
## Dimension: XYZ
## Bounding box: xmin: 130.0229 ymin: 33.1888 xmax: 130.5296 ymax: 33.4408
## z_range: zmin: 0 zmax: 0
## Geodetic CRS: WGS 84
head(starbucks_ge, 3)
## Simple feature collection with 3 features and 2 fields
## Geometry type: POINT
## Dimension: XYZ
## Bounding box: xmin: 130.2921 ymin: 33.23883 xmax: 130.5114 ymax: 33.40581
## z_range: zmin: 0 zmax: 0
## Geodetic CRS: WGS 84
## Name Description geometry
## 1 佐賀南バイパス店 POINT Z (130.2989 33.23883 0)
## 2 佐賀大学通り店 POINT Z (130.2921 33.24846 0)
## 3 鳥栖プレミアム・アウトレット店 POINT Z (130.5114 33.40581 0)
geometry
が3次元になっていますので,気になるようでしたら,st_zm
関数でZ次元を落としておいても良いと思います。
<- st_zm(starbucks_ge)
starbucks_ge head(starbucks_ge, 3)
## Simple feature collection with 3 features and 2 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 130.2921 ymin: 33.23883 xmax: 130.5114 ymax: 33.40581
## Geodetic CRS: WGS 84
## Name Description geometry
## 1 佐賀南バイパス店 POINT (130.2989 33.23883)
## 2 佐賀大学通り店 POINT (130.2921 33.24846)
## 3 鳥栖プレミアム・アウトレット店 POINT (130.5114 33.40581)
5.4 Yahoo!ジオコーダAPI
Yahoo Japanが提供しているAPIを使ってジオコーディングを行います。 Yahoo! JAPAN IDを持っていない人は取得してください。
Yahoo Japanにログインし,こちらからアプリケーションを登録し、アプリケーションIDを発行してください(アプリケーションの種類は「クライアントサイド」にしてください)。
アプリケーションIDの管理には,keyring
パッケージが便利です。
Windowsなら資格情報マネージャー,macosならKeychainを利用してIDやパスワードを管理することができます。
key_set
関数を実行すると,パスワード入力欄が表示されますので,先ほど取得したアプリケーションIDを入力します。
library(keyring)
# key_set("yahoo_api")
まず,starbucks_saga.csv
を読み込みましょう。
<- read_csv("data/starbucks_saga.csv") starbucks
##
## ─ Column specification ────────────────────────────
## cols(
## shop = col_character(),
## address = col_character()
## )
R
からwebAPIを操作するには,httr
パッケージが便利です。
geocoidng
という関数を定義しました。
library(httr)
<- function(address){
geocoding <- GET(url = "https://map.yahooapis.jp/geocode/V1/geoCoder?",
tmp query = list(
appid = keyring::key_get("yahoo_api"),
query = address,
output = "json"
)# APIの結果を受け取る
) <- content(tmp)
tmp <- tmp$Feature[[1]]$Geometry$Coordinates # 緯度軽度の部分を抜き出す
tmp <- str_split_fixed(tmp, ",", 2)
tmp <- as_tibble(tmp)
tmp <- type_convert(tmp)
tmp <- set_names(tmp, c("lon", "lat"))
tmp return(tmp)
}
定義した関数を使って,ジオコーディングを行い,緯度軽度のデータを追加します。
<- map_df(starbucks$address, geocoding) lonlat
## Warning: The `x` argument of `as_tibble.matrix()` must have unique column names if `.name_repair` is omitted as of tibble 2.0.0.
## Using compatibility `.name_repair`.
<- bind_cols(starbucks, lonlat) starbucks_ya
さらに,これをSimple Featureに変換します。
<- st_as_sf(starbucks_ya, coords = c("lon", "lat"), crs = 6668)
starbucks_ya head(starbucks_ya, 3)
## Simple feature collection with 3 features and 2 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 130.2921 ymin: 33.23876 xmax: 130.5116 ymax: 33.40649
## Geodetic CRS: JGD2011
## # A tibble: 3 x 3
## shop address geometry
## <chr> <chr> <POINT [°]>
## 1 佐賀南バイパス店 佐賀県佐賀市本庄町袋306-6 (130.2989 33.23876)
## 2 佐賀大学通り店 佐賀県佐賀市与賀町70-1 (130.2921 33.2483)
## 3 鳥栖プレミアム・アウトレット店 佐賀県鳥栖市弥生が丘8-1 (130.5116 33.40649)
5.5 CSVアドレスマッチングサービス
これは,東京大学空間情報科学研究センターが提供するwebサービスで, 住所を含むcsvファイルに,緯度経度を追加して返してくれます (詳しくはこちら)。
こちらのページにアクセスし,必要な情報を入力します。
帰ってきたファイルを,starbucks_geocoding.csv
と名前を変えて,data
フォルダに置きましょう。
このファイルをR
で読み込み,あとは先ほどと同様にSimple Feature変換すれば作業終了です。
<- read_csv("data/starbucks_geocoding.csv") starbucks_ut
##
## ─ Column specification ────────────────────────────
## cols(
## shop = col_character(),
## address = col_character(),
## LocName = col_character(),
## fX = col_double(),
## fY = col_double(),
## iConf = col_double(),
## iLvl = col_double()
## )
<- st_as_sf(starbucks_ut, coords = c("fX", "fY"), crs = 6668)
starbucks_ut head(starbucks_ut, 3)
## Simple feature collection with 3 features and 5 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 130.2882 ymin: 33.2249 xmax: 130.5118 ymax: 33.40625
## Geodetic CRS: JGD2011
## # A tibble: 3 x 6
## shop address LocName iConf iLvl geometry
## <chr> <chr> <chr> <dbl> <dbl> <POINT [°]>
## 1 佐賀南バイパ… 佐賀県佐賀… 佐賀県/佐賀市/… 5 5 (130.2882 33.2249)
## 2 佐賀大学通り… 佐賀県佐賀… 佐賀県/佐賀市/… 5 5 (130.2923 33.24775)
## 3 鳥栖プレミア… 佐賀県鳥栖… 佐賀県/鳥栖市/… 5 7 (130.5118 33.40625)
5.6 結果の図示
3通りの方法でジオコーディングした結果を全て地図に落としてみましょう。 概ね同じ位置にプロットされますが,店舗によっては利用するサービスによってジオコーディングされた座標がかなり異なるようです。 これまでの経験上,CSVアドレスマッチングサービスの精度は,他の2つと比較するとやや劣るように感じます。
ggplot() + geom_sf(data = map2, fill = "white") +
geom_sf(data = starbucks_ge, color = "green") +
geom_sf(data = starbucks_ya, color = "red") +
geom_sf(data = starbucks_ut, color = "blue")