法務省登記所備付データを利用した旧地名研究

前回「[法務省登記所備付地図データをマージする](https://qiita.com/ishiijunpei/items/cefcd1758a47aee6c57a)」では北海道庁の喜多耕一さんが公開している「[登記所備付地図（Geojson）のダウンロード](https://koukita.github.io/touki_map_hokkaido/index_link.html?fbclid=IwAR0QTgV2eM-y2Pdyc1tgpufsNHvjO5TpnvlCU4_pPMNprYYDuCDg36Vv-LA)」のデータをマージする手法を紹介しました。
今回は、この登記所地図データを地名研究の強力なツールに改造していきます。

## 字名地番変更調書
多くの自治体では過去に字名改正が行われたことがあると思います。厚沢部町では昭和35年に字名改正が行われ、その結果が「字名地番変更調書」として公開されています。
![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/3c1ae10a-46b0-44bb-b8fe-fd710920cffe.jpeg)

変更調書の中身は下のような字地番の新旧対象形式となっています。新字地番が旧字地番のどこに対応するのかがわかります。
![06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/400aab49-0c61-5325-c7b1-a0a22eb72870.jpeg)

## 旧地名対照表の作成
新字地番と旧地名（旧字名）の対照表を作成します。
手順は次のとおりです。

1. 表計算ソフトで「字名」と「地番」、「旧地名（旧字名）」の項目を作成する
2. 新字地番に対応する旧地名（旧字名）を入力する

これだけです。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/1eaa9193-d2d4-7e22-7508-cae25ad621ae.png)
件数としては膨大ですが、大半がコピーペーストでできてしまうので、変更調書の分厚さに怯える必要はありません。

このデータを「OldName.csv」という名前で保存してRで読み込みます。
```R
# 旧地名データを読み込み
old_name <-
  read_csv(
    "data/OldName.csv",
    locale = locale(encoding="utf8")
  )

> old_name
# A tibble: 4,665 × 3
   字      地番 旧地名
   <chr>  <dbl> <chr> 
 1 赤沼町    33 川原  
 2 赤沼町    34 川原  
 3 赤沼町    35 川原  
 4 赤沼町    36 川原  
 5 赤沼町    37 川原  
 6 赤沼町    38 川原  
 7 赤沼町    39 川原  
 8 赤沼町    40 川原  
 9 赤沼町    41 川原  
10 赤沼町    42 川原  
# … with 4,655 more rows
# ℹ Use `print(n = ...)` to see more rows
```

## 登記所地図データの地番を本番と枝番に分割する
登記所地図データは「1-1」、「1-2」のように本番と枝番がハイフンで結合されています。字名改正時点では、枝番は原則としてほとんどなく、本番のみが付されています。そのため、旧字名の対照は本番のみを参照します。ハイフンを取り除いて本番と枝番に分割します。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/b7c0fa96-a1bb-a7a4-024b-ae1fb5880421.png)
`tidyr::separate`パッケージは区切り文字（この場合はハイフン）を指定して文字列を複数のカラムに分割して格納してくれます。
```R
# パッケージ読み込み
library(tidyverse)
library(sf)
# 地番を番地と号に分ける
map_bango <-
  tidyr::separate(
    data = map, col = 地番, into = c("番", "号"), sep = "-"
  )
```
「地番」というカラムが消えて、「番」と「号」に分割されました。
```R
> map_bango
Simple feature collection with 33550 features and 6 fields (with 395 geometries empty)
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -1358599 ymin: 4630667 xmax: 8537937 ymax: 17948300
Projected CRS: JGD2000 / UTM zone 54N
First 10 features:
       市区町村名 大字名 丁目名 小字名 番   号                       geometry
1  檜山郡厚沢部町   <NA>   <NA> 字峠下  1 <NA> MULTIPOLYGON (((449812.8 46...
2  檜山郡厚沢部町   <NA>   <NA> 字峠下  2 <NA> MULTIPOLYGON (((449809 4644...
3  檜山郡厚沢部町   <NA>   <NA> 字峠下  3 <NA> MULTIPOLYGON (((449817.8 46...
4  檜山郡厚沢部町   <NA>   <NA> 字峠下  4 <NA> MULTIPOLYGON (((449838.6 46...
5  檜山郡厚沢部町   <NA>   <NA> 字峠下  6 <NA> MULTIPOLYGON (((450081.3 46...
6  檜山郡厚沢部町   <NA>   <NA> 字峠下  7 <NA> MULTIPOLYGON (((449854.8 46...
7  檜山郡厚沢部町   <NA>   <NA> 字峠下  8 <NA> MULTIPOLYGON (((449849.2 46...
8  檜山郡厚沢部町   <NA>   <NA> 字峠下 11 <NA> MULTIPOLYGON (((449869.7 46...
9  檜山郡厚沢部町   <NA>   <NA> 字峠下 13    1 MULTIPOLYGON (((450816.7 46...
10 檜山郡厚沢部町   <NA>   <NA> 字峠下 13    2 MULTIPOLYGON (((450799 4644...
```

## 字名と本番を結合する
登記所地図データと旧地名データの結合キーとするために、登記所地図データの字名と地番を結合します。
登記所地図データの字名は「大字」、「丁目名」、「小字名」のいずれかに格納されています。厚沢部町の場合、「赤沼町」のように「町」がつく字名は「大字名」に、町がつかない「字上里」のような字名は「小字名」に格納されています。また、「大字〇〇字〇〇」のような大字・小字形式の場合は複数のカラムに格納されていると思われます。

`tidyr::unite()`関数を利用して文字列を結合します。
```R
# 登記所地図データの大字名、丁目名、小字名、番を結合する
map_jk <-
  tidyr::unite(
    data = map_bango,                    # データを指定
    col = "join_key",                    # 結合先のカラム名
    c("大字名", "丁目名", "小字名", "番"),  # 結合するカラム名
    sep = "-",                          # 区切り文字を指定　ここはハイフンを指定
    remove = FALSE,                     # 元のカラム名を消去しない
    na.rm = TRUE                        # NAのセルは無視
  )
> map_jk
Simple feature collection with 33550 features and 7 fields (with 395 geometries empty)
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -1358599 ymin: 4630667 xmax: 8537937 ymax: 17948300
Projected CRS: JGD2000 / UTM zone 54N
First 10 features:
       市区町村名  join_key 大字名 丁目名 小字名 番   号                       geometry
1  檜山郡厚沢部町  字峠下-1   <NA>   <NA> 字峠下  1 <NA> MULTIPOLYGON (((449812.8 46...
2  檜山郡厚沢部町  字峠下-2   <NA>   <NA> 字峠下  2 <NA> MULTIPOLYGON (((449809 4644...
3  檜山郡厚沢部町  字峠下-3   <NA>   <NA> 字峠下  3 <NA> MULTIPOLYGON (((449817.8 46...
4  檜山郡厚沢部町  字峠下-4   <NA>   <NA> 字峠下  4 <NA> MULTIPOLYGON (((449838.6 46...
5  檜山郡厚沢部町  字峠下-6   <NA>   <NA> 字峠下  6 <NA> MULTIPOLYGON (((450081.3 46...
6  檜山郡厚沢部町  字峠下-7   <NA>   <NA> 字峠下  7 <NA> MULTIPOLYGON (((449854.8 46...
7  檜山郡厚沢部町  字峠下-8   <NA>   <NA> 字峠下  8 <NA> MULTIPOLYGON (((449849.2 46...
8  檜山郡厚沢部町 字峠下-11   <NA>   <NA> 字峠下 11 <NA> MULTIPOLYGON (((449869.7 46...
9  檜山郡厚沢部町 字峠下-13   <NA>   <NA> 字峠下 13    1 MULTIPOLYGON (((450816.7 46...
10 檜山郡厚沢部町 字峠下-13   <NA>   <NA> 字峠下 13    2 MULTIPOLYGON (((450799 4644...
```
「join_key」のカラムに「字名-地番」の形式で結合されました。

## 旧地名データの字名と本番を結合する
同じように結合キーとするため、旧地名データの字名と本番を結合します。

```R
old_name_jk <-
  tidyr::unite(
    data = old_name,
    col = "join_key",    
    c("字", "地番"),   
    sep = "-",       
    remove = FALSE,
    na.rm = TRUE    
  )
> old_name_jk
# A tibble: 4,665 × 4
   join_key  字      地番 旧地名
   <chr>     <chr>  <dbl> <chr> 
 1 赤沼町-33 赤沼町    33 川原  
 2 赤沼町-34 赤沼町    34 川原  
 3 赤沼町-35 赤沼町    35 川原  
 4 赤沼町-36 赤沼町    36 川原  
 5 赤沼町-37 赤沼町    37 川原  
 6 赤沼町-38 赤沼町    38 川原  
 7 赤沼町-39 赤沼町    39 川原  
 8 赤沼町-40 赤沼町    40 川原  
 9 赤沼町-41 赤沼町    41 川原  
10 赤沼町-42 赤沼町    42 川原  
# … with 4,655 more rows
# ℹ Use `print(n = ...)` to see more rows
```

## 登記所地図データと旧地名データを結合
`dplyr::left_join()`関数を使って、登記所地図データと旧地名データを結合します。

```R
# Left Join
map_join <-
  map_jk %>%
  dplyr::left_join(old_name_jk, by = "join_key") %>% 
  dplyr::select(市区町村名, 大字名, 丁目名, 小字名, 番, 号, 旧地名) 
> map_join
Simple feature collection with 33553 features and 7 fields (with 395 geometries empty)
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -1358599 ymin: 4630667 xmax: 8537937 ymax: 17948300
Projected CRS: JGD2000 / UTM zone 54N
First 10 features:
       市区町村名 大字名 丁目名 小字名 番   号 旧地名                       geometry
1  檜山郡厚沢部町   <NA>   <NA> 字峠下  1 <NA> 稲倉石 MULTIPOLYGON (((449812.8 46...
2  檜山郡厚沢部町   <NA>   <NA> 字峠下  2 <NA> 稲倉石 MULTIPOLYGON (((449809 4644...
3  檜山郡厚沢部町   <NA>   <NA> 字峠下  3 <NA> 稲倉石 MULTIPOLYGON (((449817.8 46...
4  檜山郡厚沢部町   <NA>   <NA> 字峠下  4 <NA> 稲倉石 MULTIPOLYGON (((449838.6 46...
5  檜山郡厚沢部町   <NA>   <NA> 字峠下  6 <NA> 稲倉石 MULTIPOLYGON (((450081.3 46...
6  檜山郡厚沢部町   <NA>   <NA> 字峠下  7 <NA> 稲倉石 MULTIPOLYGON (((449854.8 46...
7  檜山郡厚沢部町   <NA>   <NA> 字峠下  8 <NA> 稲倉石 MULTIPOLYGON (((449849.2 46...
8  檜山郡厚沢部町   <NA>   <NA> 字峠下 11 <NA> 稲倉石 MULTIPOLYGON (((449869.7 46...
9  檜山郡厚沢部町   <NA>   <NA> 字峠下 13    1   峠下 MULTIPOLYGON (((450816.7 46...
10 檜山郡厚沢部町   <NA>   <NA> 字峠下 13    2   峠下 MULTIPOLYGON (((450799 4644...
```

## 同じ旧地名でマージする
現時点では元の地番ごとのポリゴンなので、旧地名単位でマージした新たなポリゴンを生成します。ポリゴンのマージは`group_by()`関数でマージする変数を選んでから、空の`summarise()`を適用します。
```R
map_merge <-
  map_join %>%
  drop_na(旧地名) %>%
  group_by(旧地名) %>%
  summarise() 
> map_merge
Simple feature collection with 114 features and 1 field
Geometry type: GEOMETRY
Dimension:     XY
Bounding box:  xmin: 434854.1 ymin: 4631814 xmax: 455154.6 ymax: 4647572
Projected CRS: JGD2000 / UTM zone 54N
# A tibble: 114 × 2
   旧地名                                                                                                  geometry
   <chr>                                                                                             <GEOMETRY [m]>
 1 アカハギ     POLYGON ((445043.2 4634860, 445029.4 4634834, 444981.2 4634902, 444962.3 4634929, 444922.1 463501.…
 2 アジヤ澤     MULTIPOLYGON (((438484.9 4638041, 438477 4637994, 438458.8 4637964, 438508.2 4637926, 438475.1 46.…
 3 イシナ渕     MULTIPOLYGON (((436046.8 4642087, 436045 4642101, 436041.5 4642115, 436100.2 4642127, 436105.3 46.…
 4 イシナ渕岱   POLYGON ((435685 4642168, 435681.2 4642209, 435777.3 4642215, 435817.6 4642218, 435811.3 4642190,.…
 5 ウグイス岱   MULTIPOLYGON (((440707.9 4641796, 440729.6 4641764, 440653.6 4641715, 440646.4 4641712, 440630.2 .…
 6 カツコ沢     POLYGON ((435718.1 4641963, 435717.4 4641967, 435717.2 4641968, 435713.6 4641988, 435711 4642003,.…
 7 カツコ沢中洲 POLYGON ((435766.2 4641883, 435756.4 4641884, 435749.1 4641886, 435738.3 4641890, 435726.4 464188.…
 8 ザルイシ     MULTIPOLYGON (((437121.4 4640853, 437133.7 4640843, 437115.3 4640818, 437104.4 4640832, 437121.4 .…
 9 シトンドシ   MULTIPOLYGON (((436399.3 4642178, 436380.7 4642168, 436349.9 4642163, 436331 4642148, 436315.7 46.…
10 ツナ澤       MULTIPOLYGON (((438522 4638641, 438511.8 4638689, 438570 4638689, 438555.2 4638650, 438522 463864.…
# … with 104 more rows
# ℹ Use `print(n = ...)` to see more rows
```

## データの書き出し
データを書き出したら終了です。
```R
# write data
st_write(
  obj = map_merge,
  driver = "GPKG",
  append = FALSE ,
  "output/AssabuOldName_JGD2000utm54.gpkg")  # ファイルを書き出し
```

書き出したファイルをQGISで開きます。旧地名ポリゴンがうまく作成されているようです。
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/ba21df28-e6c3-ef5d-2461-b65b9a1169db.png)

## まとめ
法務省登記所備付データは任意座標のポリゴンが混ざっていたりしてまだまだ使いにくい面もありますが、日本全国の地番ポリゴンが公開されたことの異議は極めて大きいと思います。字名変更調書と組み合わせた旧地名研究への応用は非常に強力です。これまでは紙に出力した地番集成図を用いて手作業で同一地名をマーキングして旧地名の分布を明らかにしていました。地番ポリゴンは、字名変更調書から対照表を作成するだけでこれらの作業がPC上で行えてしまいます。

地名研究は旧地名を地図にマッピングし、現地踏査を行うことが必須です。地番ポリゴンを使えば、スマホやタブレットで旧地名をフィールドに持ち出すことが可能となります。地番ポリゴンは北海道のアイヌ語地名研究の強力なツールとなることは間違いありません。