オープンデータを使って住所検索ライブラリを作りました

オープンデータな住所データを使用して文字列と緯度経度で住所検索できるNode.jsのモジュールを作りました。

**japan-address-search**
<https://github.com/uedayou/japan-address-search>

従来、住所検索を行う場合、GoogleやYahooなど外部のWebサービス・Web APIと連携して検索するものが多いと思います。少数のデータを検索する場合は特に問題ないですが、大量のデータを検索したい場合には外部サービスの制限やレスポンスの問題など利用するには不向きです。

このモジュールは、モジュール内のデータについて検索するので、大量のデータでも外部サービスに影響なくローカルで検索することができます。

このモジュールは、経済産業省の[IMIコンポーネントツール](https://info.gbiz.go.jp/tools/imi_tools/)を元に作成していますので、住所表記の正規化も行えます。

npmリポジトリにも公開しているので、npmコマンドで手軽にインストールできます。

<https://www.npmjs.com/package/japan-address-search>

## インストール方法

コマンドラインで使う場合は npm でグローバルにインストールしてください。

```sh
$ npm install -g japan-address-search
```

Node.js のコード内で利用したい場合はローカルにインストールします。

```sh
$ npm install japan-address-search
```

## 使い方

コマンドラインで、文字列検索したい場合は以下のように実行します。

```sh
$ japan-address-search -s 神保町
```

緯度経度による逆ジオコーディング検索は以下のようになります。

```sh
$ japan-address-search --lat 35.675551 --lng 139.750413
```

どちらもデフォルトで最大10件表示されます。任意の件数を得たい場合はパラメータに`--limit 5`のように追加してください。

コード内での利用は
<https://github.com/uedayou/japan-address-search#readme>
を参照してください。

## 出力結果

検索結果は、JSONで以下のように出力されます。
町・丁目レベルには代表点として緯度経度が得られます。

```json
{
  "@context": "https://imi.go.jp/ns/core/context.jsonld",
  "場所": [
    {
      "@type": "場所型",
      "住所": [
        {
          "@type": "住所型",
          "表記": "神保町",
          "都道府県": "千葉県",
          "都道府県コード": "http://data.e-stat.go.jp/lod/sac/C12000",
          "市区町村": "船橋市",
          "市区町村コード": "http://data.e-stat.go.jp/lod/sac/C12204",
          "町名": "神保町",
          "種別": "位置参照情報"
        }
      ],
      "地理座標": {
        "@type": "座標型",
        "緯度": "35.762159",
        "経度": "140.051552"
      }
    },
    {
      "@type": "場所型",
      "住所": [
        {
          "@type": "住所型",
          "表記": "神保町",
          "都道府県": "新潟県",
          "都道府県コード": "http://data.e-stat.go.jp/lod/sac/C15000",
          "市区町村": "見附市",
          "市区町村コード": "http://data.e-stat.go.jp/lod/sac/C15211",
          "町名": "神保町",
          "種別": "位置参照情報"
        }
      ],
      "地理座標": {
        "@type": "座標型",
        "緯度": "37.500056",
        "経度": "138.970828"
      }
    },
    {
      "@type": "場所型",
      "住所": [
        {
          "@type": "住所型",
          "表記": "神保町",
          "都道府県": "千葉県",
          "都道府県コード": "http://data.e-stat.go.jp/lod/sac/C12000",
          "市区町村": "船橋市",
          "市区町村コード": "http://data.e-stat.go.jp/lod/sac/C12204",
          "町名": "大神保町",
          "種別": "位置参照情報"
        }
      ],
      "地理座標": {
        "@type": "座標型",
        "緯度": "35.773812",
        "経度": "140.061923"
      }
    },
    {
      "@type": "場所型",
      "住所": [
        {
          "@type": "住所型",
          "表記": "神保町",
          "都道府県": "東京都",
          "都道府県コード": "http://data.e-stat.go.jp/lod/sac/C13000",
          "市区町村": "千代田区",
          "市区町村コード": "http://data.e-stat.go.jp/lod/sac/C13101",
          "町名": "神田神保町",
          "種別": "位置参照情報"
        }
      ]
    }
  ]
}
```

## その他の機能

`japan-address-search`モジュールには、現在の住所以外に明治時代以前の地名についても、文字列と緯度経度で検索することができます。コマンドラインでは、`--old`をつけると検索対象が明治時代以前の地名になります。

```sh
$ japan-address-search -s 神保町 --old
$ japan-address-search --lat 35.675551 --lng 139.750413 --old
```

## japan-address-search について

`japan-address-search` は[IMIコンポーネントツール](https://info.gbiz.go.jp/tools/imi_tools/)を改修して作成したものです。改修の経緯は以下のQiitaの記事にまとめています。

1. [IMI住所変換コンポーネントでいろんな住所を正規化してみた](https://qiita.com/uedayou/items/4c9d30fc031a9bf6762e)
2. [IMI住所変換コンポーネントを改造してリバースジオコーディングに対応してみた](https://qiita.com/uedayou/items/667ffc162ec972c74e48)  
3. [IMI住所変換コンポーネントを魔改造して昔の地名を検索できるようにしてみた](https://qiita.com/uedayou/items/ac9c100eeb0dac46da5d)

また、オープンデータとして

- [国土地理院 位置参照情報](https://nlftp.mlit.go.jp/cgi-bin/isj/dls/_choose_method.cgi)
- [統計LOD](http://data.e-stat.go.jp/lodw/)
- [歴史地名データ](https://www.nihu.jp/ja/publication/source_map)

を利用しています。
各ツール・データを公開していただいている皆様には深く感謝いたします。