こんにちは、石原です。地図や位置情報を使ったWebサービスを作るのが好きで、位置情報を使ったクイズラリーを作って楽しめるまちクエストや、観光地などの案内板のデータベースをみんなで作るMonumentoというサービスも開発・運営しています。
オープンデータとして公開していて、Geoloniaの不動産共通IDのベースとしても使用されている住所APIをバージョンアップしました。
そもそも住所APIとは?については以下のブログエントリーを参照してください。
正規化や住所入力に便利な住所APIをGitHub Pagesで公開しました!
3月からGeoloniaのプロジェクトをお手伝いすることになったのですが、各プロジェクトのソースコードはGitHub上で公開されており、タスク管理など基本的なやりとりはIssuesやPull Requests上で公開されていて誰でも閲覧できるようになっているのが、Geoloniaのとてもユニークで面白いところだと思っています。
今回のバージョンアップで
というところが主な改善点です。それぞれをひとつずつ紹介していきたいと思います。
もともとの住所APIは、国土交通省が公開している位置参照情報の大字・町丁目レベルのデータをベースに、ローマ字やふりがなのデータは郵便番号データより取得して、組み合わせて作成していました。
しかし、以下のIssueの通り、「網羅している住所が不十分。特に地番住所が弱い。」という問題がありました。そこで、いろいろとデータソースを検討した結果、同じく位置参照情報の街区レベルのデータとうまく組み合わせればより多くの住所を網羅することができるようになりました。
https://github.com/geolonia/japanese-addresses/issues/17
データソースを複数にしてマージすることで、それまで189,540件だった住所が190,165件に増えました。
しかし、街区レベルのデータまで取得するようになったことで、新たに小字まで含んだ住所の代表点(緯度、経度)を決める必要がでてきました。たとえば「長野県長野市篠ノ井塩崎長谷」のように小字まで含んだ住所については、街区レベル位置参照情報より、その住所に属する街区の緯度、経度を複数取得できるので、何らかの方法でひとつだけ代表点を決め、その緯度と経度をAPIで返さなければなりません。
そこで以下のような方法をとりました。
例えばA、B、Cの3点が「長野県長野市篠ノ井塩崎長谷」に属する街区だとして、A、B、Cを囲む一番小さな長方形(バウンディングボックス)を作り、その中心を求めます。次にA、B、Cの中からその長方形の中心に最も近い点を選びます。たとえばそれがCだとすると、「長野県長野市篠ノ井塩崎長谷」の代表点はCと決め、その緯度、経度を返すようにしています。
上記方法をとることで、Geolonia社内では三日月型とか飛び地型とよばれている特殊な地形でうまく代表点を決められない問題に対応しています。
街区レベル位置参照情報は、平成12年度より整備を開始し、平成15年度より毎年1回の更新を実施しています。
とあるように位置参照情報は一年に一回の更新のため、これだけに頼っていると、各自治体の住居表示の実施などで追加された住所には対応できません。
そこで、こうした追加/変更/削除された住所を反映できるように、別にjson形式のファイルで管理するようにしました。
今はまだ手動での対応ですが、以下のように足りない住所をIssueで指摘していただければ、随時反映していきます。
また、こうした住所データの追加/修正/削除のリクエストについては、Issueを作成する際に、バグ報告や機能追加のリクエストとは別の専用のテンプレートを用意しましたので、報告もしやすくなったかと思います。
住所APIのソースコードをGitHubに公開していることで、機能改善やバグ修正をPull Requestという形でコミュニティの皆さんからも受け付けることができています。しかし、いざそうしたリクエストを受け付けたとして、いままでのAPIの挙動に影響がでてしまって新たにバグが発生してしまったりしては困ってしまいます。
そこで、まだごく基本レベルではありますが、動作をテストするテストコードを新たに追加し、GitHub Actionsをつかって、新しくコミットがおこなわれるたびに自動テストを実行するようにしました。
また、開発途中のバージョンについては、Gitでタグをつけたときに、同じくGitHub Actionsで自動的に開発バージョンのAPIを作成して、公開版のAPIとは別の場所に配置することで、社内だけでテストできるようにしています。
Geoloniaの住所APIのバージョンアップでの改善点を紹介しました。
歴史的な経緯などいろいろとあって、住所データをきれいな形で整えるというのはなかなかに大変だなあというのがこの3ヶ月間取り組んでみての感想なのですが、自動化・システム化できるところと、コミュニティの力を借りたり地道に手動でやらなければいけないところとをうまく組みあわせながら、住所APIをより使いやすい形にしていけらたらなと思っています。