オープンソースの住所正規化ライブラリです。
経産省の IMI コンポーネントツールのジオコーディングの仕組みからインスピレーションをうけて開発しました。
https://geolonia.github.io/normalize-japanese-addresses/
ライブラリは npm レジストリで @geolonia/normalize-japanese-addresses として配布されています。
npm コマンドなどを使ってインストールして下さい。
$ npm install @geolonia/normalize-japanese-addresses -S住所を正規化します。
import { normalize } from '@geolonia/normalize-japanese-addresses';
// ESMを利用しない場合は下記
// const { normalize } = require('@geolonia/normalize-japanese-addresses');
normalize('北海道札幌市西区24-2-2-3-3').then(result => {
console.log(result);
// {
// "pref": "北海道", // 都道府県名
// "city": "札幌市西区", // 市区町村名
// "town": "二十四軒二条二丁目", // 大字・丁目名
// "addr": "3-3", // 街区符号・住居符号または地番
// "level": 8, // 正規化レベル
// "point": {
// "lat": 43.074206115, // 緯度
// "lng": 141.315540696, // 軽度
// "level": 8 // 位置情報データレベル
// },
// "other": "" // 正規化できなかった文字列
// }
})住所の正規化結果として戻されるオブジェクトには、level プロパティが含まれます。level には、住所文字列のどこまでを判別できたかを以下の数値で格納しています。
0- 都道府県も判別できなかった。1- 都道府県まで判別できた。2- 市区町村まで判別できた。3- 大字・丁目まで判別できた。8- 住居表示住所の街区符号・住居符号または地番住所の地番まで判別できた。
point に位置情報データ (EPSG:4326) が入っています。位置情報の精度を表す level プロパティを参照してください。住所正規化レベルと位置情報データのレベルが異なる場合は主には、住居表示または地番情報(レベル8)は存在しましたが、位置情報データが存在しなかった場合。この場合は、大字・丁目の代表点の位置情報データを返却します。
位置情報データのレベルは下記となります。
1- 都道府県庁所在地2- 市区町村役所(役場)所在地3- 大字・丁目の代表点8- 住居表示住所の場合はフロンテージ位置多い。地番住所の場合は地番の中央点。
レベルの上限を設定することも可能です。例えば都道府県名のみを正規化したい場合、level オプションで指定することで処理を速くすることができます。
const { normalize } = require('@geolonia/normalize-japanese-addresses')
normalize('北海道札幌市西区24-2-2-3-3', { level: 1 }).then(result => {
console.log(result);
// {
// "pref": "北海道",
// "other": "札幌市西区24-2-2-3-3",
// "level": 1,
// "point": {
// "lat": 43.0639406375,
// "lng": 141.347906782,
// "level": 1
// }
// }
})normalize() は住所データの取得に失敗した場合、例外を投げます。取得できなかった住所を低い level で返すことはしません。低い level が返るのは、入力された住所文字列をそこまでしか判別できなかった場合だけです。
一過性の失敗と判断できるもの(HTTP 5xx、408、425、429、ネットワークエラー、200 で返されたエラーページ)は、指数バックオフで自動的に再試行します。試行回数は初回の要求を含めて最大 3 回、つまり再試行は最大 2 回です。それでも回復しない場合に例外となります。404 のように再試行しても解決しない失敗は、その場で例外になります。
例外の message には、どのデータの取得に失敗したかと失敗の原因が含まれます。原因は、HTTP エラーの場合はステータスコード、本文が期待どおりでない場合は期待したバイト長と実際のバイト長、ネットワークエラーの場合は元のエラーメッセージです。config.japaneseAddressesApi に file:// を指定している場合は、code プロパティに ENOENT などの Node.js のエラーコードが入ります。
大量の住所を一括で正規化する場合は、1 件の失敗で全体が止まらないように例外を捕捉してください。
const { normalize } = require('@geolonia/normalize-japanese-addresses')
async function normalizeAll(addresses) {
for (const address of addresses) {
try {
const result = await normalize(address)
console.log(result)
} catch (error) {
// 住所データの取得に失敗した。時間を置いて再度実行する
console.error(address, error.message)
}
}
}以下のパラメーターを変更することでライブラリの動作全体に関わる設定が変更できます。
住所データを配信する Web API のエンドポイントを指定します。デフォルトは https://japanese-addresses-v2.geoloniamaps.com/api/ja です。この API から配信されるデータのディレクトリ構成は Geolonia 住所データ を参考にしてください。
NodeJS環境のみ、このオプションに対して file:// 形式の URL を指定することで、ローカルファイルとして保存したファイルを参照することができます。
XXX郡などの郡の名前が省略されている住所に対しては、それを補完します。- 住所に含まれるアルファベットと数字を半角に統一します。
- 京都の通り名を削除します。
- 新字体と旧字体のゆらぎを吸収して、国交省の位置参照情報に記載されている地名にあわせます。
ヶケが、ヵカか力、之ノの、ッツっつなどのゆらぎを吸収して、国交省の位置参照情報に記載されている地名にあわせます。釜と竈、埠頭とふ頭などの漢字のゆらぎを吸収します。- 町丁目レベルに記載されている数字は、国交省の位置参照情報にあわせて、すべて漢数字に変換します。
- 番地や号レベルに記載されている数字はアラビア数字に変換し、
番地などの文字列は-に変換します。 - 住所の末尾に建物名がある場合は、なるべくなにもしないでそのまま返す仕様になっていますが、できればあらかじめ分離していただいたほうがいいかもしれません。
参考:
まず、以下のコマンドで環境を用意してください。
$ git clone git@github.com:geolonia/normalize-japanese-addresses.git
$ cd normalize-japanese-addresses
$ npm install次に、以下を実行してコンパイルをおこないます。
$ npm run builddist フォルダ以下に main-node.js など必要なファイルが生成されるので、
// sample.js
import { normalize } from './dist/main-node-esm.mjs';
// ESMを利用しない場合は下記
// const { normalize } = require('./dist/main-node-cjs.cjs');
normalize('北海道札幌市西区24-2-2-3-3', { level: 3 }).then(result => {
console.log(result);
// {
// "pref": "北海道",
// "city": "札幌市西区",
// "town": "二十四軒二条二丁目",
// "other": "3-3",
// "level": 3,
// "point": {
// "lat": 43.074273,
// "lng": 141.315099,
// "level": 3
// }
// }
})という内容で sample.js を用意したら、
$ node sample.jsでサンプルファイルを実行することができます。
normalize-japanese-addresses は現在、 NodeJS 18.x, 20.x, 22.x, 24.x, 26.x を対象としてテストを実施し、動作を確認しております。26.x は 2026 年 10 月に Active LTS となる予定のため、先行してテスト対象に含めています。なお 26.x では、テストに使用している puppeteer が Node.js 26 に未対応のため、ブラウザを起動する結合テストのみ実施していません。ビルド時は「開発環境」の NodeJS バージョンを利用ください。
NodeJS 以外のブラウザの環境は、最新ブラウザを前提とした対応となります。fetchが利用可能な環境であれば動く可能性が高い。テストは最新の Chrome を使って実施しております。
開発環境は、 .tool-versions にかかれているバージョンを利用してください。
準拠としては Node.js Releases を参照してください。基本的に動作環境は Maintenance, Active LTS をターゲットとし、開発環境は最新の Active LTS を利用しますが、更新のタイミング等でずれることがあります。
- この正規化エンジンは、住所の「名寄せ」を目的としており、たとえば京都の「通り名」は削除します。
- 郵便や宅急便などに使用される住所としては、問題ないと考えています。
- 正規化に利用するデータは、
japanese-addresses-v2で作成されます。元データに関してはそのレポジトリを御覧ください。 - 住居表示が未整備の地域については全体的に苦手です。
- ソースコードのライセンスは MIT ライセンスです。
- ご利用に際しましては、できればソーシャルでのシェア、Geolonia へのリンクの設置などをしていただけると、開発者たちのモチベーションが上がると思います。
住所の正規化を工夫すれば精度があがりそうなので、そのあたりのアイディアを募集しています。