WAPIの仕組みでデジタル庁のサイトをAPI化してみた

2022年4月22日、デジタル庁が「ベースレジストリ・データカタログサイト」を公開しました。

デジタル庁のお知らせ:https://www.digital.go.jp/news/KgQ8ac8h/

「ベースレジストリってなんぞや?」とは思いましたが、このサイトは「CKAN」で作られているとのこと。それなら、WAPIの仕組みでAPI化できるのではないか?と思いたち、「デジタル庁のベースレジストリ・データカタログサイトを勝手にAPI化してみよう!」プロジェクトを立ち上げ、DAPI(デジタル庁のAPIだからDAPI。安易だなぁ)を構築しました。

WAPIでCKANを検索する仕組み(クロールと呼んでいます)はある。必要なのは、対象となるデータセットの特徴(データセット、リソースを特定する条件、CSVの項目情報など)を知っているクラスを作ること。

今回の「ベースレジストリ・データカタログサイト」には、次の10種類のデータセットが公開されています。

  • 都道府県マスター
  • 市区町村マスター
  • 町字マスター
  • 町字マスター位置参照拡張
  • 住居表示・住居マスター
  • 住居表示・住居マスター位置参照拡張
  • 住居表示・街区マスター
  • 住居表示・街区マスター位置参照拡張
  • イベント
  • 公共施設

これらのデータセットの定義書は、先のデジタル庁のお知らせの中にExcelで公開されていたので、それを見ながら、専用クラスに記述。

困ったこと

データ形式はCSV、でもZIP

CKANのデータセット情報では、リソースのデータ形式は「CSV」になっていたけど、読み取りでエラー?

調べてみたらZIPファイルになっていた。ZIPファイルの解析方法をクラスに教えてあげて対応。

elasticsearchの項目名

一番困ったのは、データベース(elasticsearch)に書き込むときの項目名(英語表記)をどうするか?

  • 都道府県名、市区町村名は、まあいい、政令市区名?
  • 郡、大字、小字って英語でなんていうの?
  • 丁目って?
  • その他、聞いたことのない専門的な?項目がいくつかあった

Google先生に聞きながら、とりあえず(適当に)決めておこう。

なんとか全部の専用クラスを準備して、一通り動くようになったので、それでは「いってこい!」と全検索を指示してみた。

対象となる自治体数が約2000、1つの自治体が持つデータセット数はたかだか10個だけど、データセットによってはものすごくでかいものがある(データ件数が100万件を超えるCSVがチラホラ)

最初は全部終わるのに100時間ほどかかった。その後、elasticsearchへの書き込みを調整して、10時間程度で終わるようにはなった。

こうして、デジタル庁の「ベースレジストリ・データカタログサイト」をAPI化した結果、こうなりました。

DAPIのデータセット一覧:https://dapi.bodik.jp/dataset

API化してわかったこと

CSV項目の定義書との違い

WAPI(DAPIも)では、CSVファイルを読んでAPIサーバに登録するとき、問題があればレポート形式のログに記録するようにしています。このログに「定義書にある項目がない、知らない項目がある」というエラーが報告されていた。調べてみたら、あるデータセットでは特定の項目名がすべての自治体で間違っている。「定義書の内容をクラスに教えるとき、間違ったかな?」と調べてみたけど、クラスには定義書通りに書かれていた。

つまり、一部の項目で、間違った項目名でCSVが統一されている。

このことはデジタル庁の「ベースレジストリ・データカタログサイトご意見募集」があったので、ご報告しておきました。

デジタル庁のご意見募集サイト:https://digital-agency.ideabox.cloud/category/88467892-d117-11ec-b7e4-0ab333cbe91b

API化するだけなら全部の自治体のデータを使わなくてもいい

ある場所の情報を検索すると、同じデータが3回登録されていることがわかった。更新・削除で失敗したのかな?と確認したけど、問題なし。どうやら、町>市>都道府県と上位の組織がデータを集約しているようだ。つまり、47の都道府県と特殊なデータを持つ「日本」のデータだけを集めれば、日本全部をカバーできそう。処理時間の短縮につながることが期待できる。

APIを使ってみた

せっかくAPIにしてみたので、何か使ってみよう。「ベースレジストリ」がよくわからんけど、住所を細分化できるみたい。

都道府県>市区町村>町>丁目???

なので、住所を都道府県から順次指定して、最後は位置情報(緯度経度)があったので、そこにマーカーを立てる地図アプリにしてみた。

ベースレジストリを使った地図アプリ:https://dapi.bodik.jp/baseregistry

下図は、ISITのある「福岡県福岡市早良区百道浜二丁目」を指定してみたところです。

今の「ベースレジストリ」では、ポリゴン情報が抜けています。(ポリゴン情報は整備計画中とのこと)

この情報が整備されたらエリアを地図に表示できるようになります。特に「地番」のエリアを表示できるようになると面白いことができそうな気がする。

ひらの