- 投稿日:2020-10-25T18:13:52+09:00
オープンデータを使って住所検索ライブラリを作りました
オープンデータな住所データを使用して文字列と緯度経度で住所検索できるNode.jsのモジュールを作りました。
japan-address-search
https://github.com/uedayou/japan-address-search従来、住所検索を行う場合、GoogleやYahooなど外部のWebサービス・Web APIと連携して検索するものが多いと思います。少数のデータを検索する場合は特に問題ないですが、大量のデータを検索したい場合には外部サービスの制限やレスポンスの問題など利用するには不向きです。
このモジュールは、モジュール内のデータについて検索するので、大量のデータでも外部サービスに影響なくローカルで検索することができます。
このモジュールは、経済産業省のIMIコンポーネントツールを元に作成していますので、住所表記の正規化も行えます。
npmリポジトリにも公開しているので、npmコマンドで手軽にインストールできます。
https://www.npmjs.com/package/japan-address-search
インストール方法
コマンドラインで使う場合は npm でグローバルにインストールしてください。
$ npm install -g japan-address-searchNode.js のコード内で利用したい場合はローカルにインストールします。
$ npm install japan-address-search使い方
コマンドラインで、文字列検索したい場合は以下のように実行します。
$ japan-address-search -s 神保町緯度経度による逆ジオコーディング検索は以下のようになります。
$ japan-address-search --lat 35.675551 --lng 139.750413どちらもデフォルトで最大10件表示されます。任意の件数を得たい場合はパラメータに
--limit 5
のように追加してください。コード内での利用は
https://github.com/uedayou/japan-address-search#readme
を参照してください。出力結果
検索結果は、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
をつけると検索対象が明治時代以前の地名になります。$ japan-address-search -s 神保町 --old $ japan-address-search --lat 35.675551 --lng 139.750413 --oldjapan-address-search について
japan-address-search
はIMIコンポーネントツールを改修して作成したものです。改修の経緯は以下のQiitaの記事にまとめています。
- IMI住所変換コンポーネントでいろんな住所を正規化してみた
- IMI住所変換コンポーネントを改造してリバースジオコーディングに対応してみた
- IMI住所変換コンポーネントを魔改造して昔の地名を検索できるようにしてみた
また、オープンデータとして
を利用しています。
各ツール・データを公開していただいている皆様には深く感謝いたします。
- 投稿日:2020-10-25T02:34:46+09:00
DockerFileに最新のNode.jsを追加した話
他で作成していたイメージにNode.jsをインストールしたかったが、調べてもすぐには出てこなかったためメモ
前提
Rustでwasmを触ってみようとして必要だった。
busterベースのコンテナを使用。結論
こちらを追加した
ENV NODE_VERSION 15.0.1 RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" \ && case "${dpkgArch##*-}" in \ amd64) ARCH='x64';; \ ppc64el) ARCH='ppc64le';; \ s390x) ARCH='s390x';; \ arm64) ARCH='arm64';; \ armhf) ARCH='armv7l';; \ i386) ARCH='x86';; \ *) echo "unsupported architecture"; exit 1 ;; \ esac \ && set -ex \ && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" \ && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \ && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" \ && ln -s /usr/local/bin/node /usr/local/bin/nodejs \ && node --version \ && npm --versionやっていることとしては
アーキテクチャを取得
公式サイトのurlを叩く
展開ログに表示されたバージョン
+ node --version v15.0.1 + npm --version 7.0.3考えたこと
最初はaptでインストールを行ったがバージョンが古く(10前後だった記憶)、せっかくなので最新にしようと考えた。しかし適当に調べても"正しい"方法が見つからないためDockerHubへ。
https://hub.docker.com/_/nodeここから自分の使っているイメージと似たようなOS(今回はbuster)をベースにしているイメージのDockerFileへ飛ぶ。
そこからnodeをインストールしている箇所を抜き出し、自分のDockerFileに適用。(本当はチェックサムやら何やらがあったが削除してしまった)見事動いた。
以上。出典
https://hub.docker.com/_/node
https://github.com/nodejs/docker-node/blob/d58d7e65c4f92ef22a190b0ca835ce62464ff3ba/15/buster/Dockerfile