IMI住所変換コンポーネントを魔改造して昔の地名を検索できるようにしてみた

1. [IMI住所変換コンポーネントでいろんな住所を正規化してみた](https://qiita.com/uedayou/items/4c9d30fc031a9bf6762e)
2. [IMI住所変換コンポーネントを改造してリバースジオコーディングに対応してみた](https://qiita.com/uedayou/items/667ffc162ec972c74e48)  
のシリーズ記事です。

今回は、IMI住所変換コンポーネントをさらに改造して、昔の地名も検索できるようにしました。

imi-enrichment-address-plus
<https://github.com/uedayou/imi-enrichment-address-plus>

## 昔の地名の検索

昔の地名のデータソースとして、[大学共同利用機関法人 人間文化研究機構](https://www.nihu.jp/ja)が公開する[歴史地名データ](https://www.nihu.jp/ja/publication/source_map)を利用利用しました。

現在の住所と同じくLevelDBに格納し、緯度経度による逆ジオコーディング検索にも対応しました。

これで、[imi-enrichment-address-plus](https://github.com/uedayou/imi-enrichment-address-plus)は

- 現在の住所
  - 正規化
  - 緯度経度で検索(逆ジオコーディング)
- 昔の地名
  - 部分一致検索
  - 緯度経度で検索(逆ジオコーディング)

の4つの検索が可能になりました。

## 検索方法

この記事では上記4つの検索のうち、昔の地名の部分一致検索と逆ジオコーディング検索の利用方法を紹介します。

現在の住所の正規化については
[IMI住所変換コンポーネントでいろんな住所を正規化してみた](https://qiita.com/uedayou/items/4c9d30fc031a9bf6762e)

現在の住所の逆ジオコーディングは
[IMI住所変換コンポーネントを改造してリバースジオコーディングに対応してみた](https://qiita.com/uedayou/items/667ffc162ec972c74e48)

もしくはimi-enrichment-address-plusの[README.md](https://github.com/uedayou/imi-enrichment-address-plus/blob/master/README.md)を見てください。

### 部分一致検索

最も簡単に試す方法はコマンドラインインタフェースでの検索です。

まず、imi-enrichment-address-plusをグローバルにインストールします。

```sh:インストールコマンド
$ npm install -g https://github.com/uedayou/imi-enrichment-address-plus/releases/download/v1.1.2/imi-enrichment-address-plus-1.1.2.tgz
```

これで`imi-enrichment-address-plus`コマンドが使えるようになるはずです。
通常の住所正規化は`-s`オプションを使います。

```sh:住所正規化コマンド
$ imi-enrichment-address-plus -s 神保町
```

昔の地名を検索するときは、`-s` とともに `--old` オプションをつけてください。
住所正規化は該当する1件を返しますが、この検索では文字数が近い最大10件が出力されます。

```sh:昔の地名の部分一致コマンド
$ imi-enrichment-address-plus -s 神保町 --old
```

例えば、上記を実行すると、以下のような結果が出力されます。

```json:昔の地名での検索結果
{
  "@context": "https://imi.go.jp/ns/core/context.jsonld",
  "場所": [
    {
      "@type": "場所型",
      "住所": [
        {
          "@type": "住所型",
          "種別": "歴史地名データ",
          "ID": "10025110",
          "町名": "神保町",
          "説明": "「大日本地名辞書」6巻 352頁",
          "都道府県": "武蔵",
          "都道府県コード": "594",
          "市区町村": "神田区",
          "市区町村コード": "917"
        },
        {
          "@type": "住所型",
          "表記": "東京都千代田区神田神保町二丁目",
          "都道府県": "東京都",
          "都道府県コード": "http://data.e-stat.go.jp/lod/sac/C13000",
          "市区町村": "千代田区",
          "市区町村コード": "http://data.e-stat.go.jp/lod/sac/C13101",
          "町名": "神田神保町",
          "丁目": "2",
          "種別": "位置参照情報"
        }
      ],
      "地理座標": [
        {
          "@type": "座標型",
          "緯度": "35.695555",
          "経度": "139.757500"
        }
      ]
    },
    ...
  ]
}
```

検索結果には、住所オブジェクトが2つあり、`"種別": "歴史地名データ"` であるほうが昔の地名、`"種別": "位置参照情報"`のほうが逆ジオコーディングにより検索された最も近い現在の住所となります。
`地理座標`からは緯度経度も得られます。

### 緯度経度で検索(逆ジオコーディング検索)

部分一致と同じく、通常の逆ジオコーディング検索に`--old`つけることで検索対象が昔の地名になります。

```sh:現在の住所の逆ジオコーディング検索
$ imi-enrichment-address-plus --lat 35.675551 --lng 139.750413
```

```sh:昔の地名の逆ジオコーディング検索
$ imi-enrichment-address-plus --lat 35.675551 --lng 139.750413 --old
```

## コマンドラインインタフェース以外の使い方

上記で説明したコマンドラインインタフェース以外の使い方として、Web APIとしての利用と、Nodeプログラム上で利用できます。

それぞれの使い方については、imi-enrichment-address-plusの[README.md](https://github.com/uedayou/imi-enrichment-address-plus/blob/master/README.md)を参照してください。

## 昔の地名のデータの中身

[歴史地名データ](https://www.nihu.jp/ja/publication/source_map)によると以下の資料をもとに作成されたデータだそうです。

資料名 | 説明
---- | ----
大日本地名辞書 | 大日本地名辞書は、吉田東伍（1864～1918）が編纂した日本で最初の本格的な地名辞書で、明治33年に初版が発行されました。「歴史地名辞書データ」には、北海道から沖縄（琉球）の53,528件の地名が収録されています。
延喜式神名帳 | 延喜式神名帳は、「官社」に指定された神社の一覧であり、延長5年（927年）に編纂されました。これに記載されている神社（式内社）全2,861社のうち、2,842社の位置情報が「歴史地名辞書データ」に収録されました。なお、比定された位置は、必ずしも編纂当時の位置とは限りません。
旧5万分の1地形図 | 日本ではじめて精密測量に基づいて作製された5万分の1地形図に含まれる地名252,544件とその緯度・経度が「歴史地名辞書データ」に収録されました。本データの作成に当たっては、国土地理院長の承認を得ています（承認番号 平成30情使、第12号）。対象となった図幅は1,343枚で、明治29年から昭和10年に測量されたものです（一部、例外あり）。なお、緯度・経度は、当時の測地系から世界測地系に変換されています。

これによれば、明治時代以前の地名であることがわかります。
上記でも説明しましたが、これら昔の地名に該当する現在の住所があらかじめ割り振っていますので、過去と現在を地理的につなげるような使い方ができると思います。

本モジュールと同じような機能を提供するWebサービスも公開されています。

歴史地名辞書の検索
<http://www.eri.u-tokyo.ac.jp/people/ykano/gazetteer/>

こちらは[今昔マップ](http://ktgis.net/kjmapw/)などの複数の外部サービスと連携してますし、いくつかの地名や位置を検索したい場合はこちらを利用したほうが良いと思います。

本モジュールはすべてローカル環境で検索を行うので、大量の検索したいデータがある場合、高速に処理が行えることが利点の一つで、自身のサービスに組み込みたい場合にも利用しやすいと思います。

住所・地名周りではかなり便利なツールになったと思いますので、是非活用してもらえればと思います。