生成AIでジオコーディング

R
geocoding
map
作者

Kazuki Tamura

公開

2024年5月23日

住所などの情報に、緯度・経度を付与することをジオコーディングといいます。空間的な分析をしたいデータに、あらかじめ座標データがあればいいのですが、ない場合にはジオコーディングが必要になります。

民間企業が提供する有料サービス(主に法人向け)を除けば、日本の住所に対応したジオコーディングサービスはあまりなかったと思います。東京大学のCSVアドレスマッチングサービスくらいしかなかったんじゃないかと思います。

最近は、空間データ充実してきたこともあり、あまりジオコーディングする場面に出くわさなかったのですが、先日、Rのtidygeocoderパッケージを使ってみたところ、とても便利だなと感じました。

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(sf)
Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
library(mapview)
library(tidygeocoder)

arcgis <- 
  read_csv('https://gist.github.com/kzktmr/e381b5e7d542687dcf07317c66351288/raw/f0a6c8f7c183cf9a00f837cc2a7ad953757ee119/Starbucks_saga.csv') |> 
  geocode(address, method = 'arcgis') |> 
  st_as_sf(coords = c('long', 'lat'), crs = 4326)
Rows: 11 Columns: 2
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): shop, address

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Passing 11 addresses to the ArcGIS single address geocoder

Query completed in: 6.4 seconds
mapview(arcgis)

こういう技術はどんどん新しいものが出てくるな、と思ったの同時に、生成AIにお願いしたらジオコーディングやってくれるのだろうか?と思いついたので、やってみました。

ChatGPTとcluadeに、住所のリストを渡して、「ジオコーディングした結果をGeoJSONにして」とお願いしてみたところ、やってくれました。おぉ、まじか、すごい!と思いつつ、結果をテキストファイルに保存して、地図にしてみました。

chatgpt <- st_read('~/Documents/R/Geocoding/chatgpt.geojson') |> 
  mutate(label = 'chatgpt')
Reading layer `chatgpt' from data source 
  `/Users/kazukitamura/Documents/R/Geocoding/chatgpt.geojson' 
  using driver `GeoJSON'
Simple feature collection with 11 features and 1 field
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 129.9668 ymin: 33.01329 xmax: 130.5187 ymax: 33.51171
Geodetic CRS:  WGS 84
claude <- st_read('~/Documents/R/Geocoding/claude.geojson') |> 
  mutate(label = 'claude')
Reading layer `claude' from data source 
  `/Users/kazukitamura/Documents/R/Geocoding/claude.geojson' 
  using driver `GeoJSON'
Simple feature collection with 11 features and 1 field
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 129.7866 ymin: 33.20197 xmax: 130.5589 ymax: 33.47938
Geodetic CRS:  WGS 84
mapview(arcgis, col.regions = "blue", label = "shop") +
  mapview(chatgpt, col.regions = "red", label = "店舗名") +
  mapview(claude, col.regions = "orange", label = 'name')

それらしい地図にはなるんですけど、正確性には欠けますね。