2024年6月6日木曜日

デジタル庁が整備しているアドレス・ベース・レジストリをデータベースにロードする

デジタル庁がアドレス・ベース・レジストリとして整備している住所・所在地データを、Autonomous Databaseに取り込んでみます。簡易的なジオコーディング、逆ジオコーディングを行うための、元データとして使用することを想定しています。

デジタル庁によるアドレス・ベース・レジストリの説明は、次のサイトに掲載されています。

アドレス・ベース・レジストリ

まず、データを投入する表を作成します。表を定義するにあたって、2024年1月15日に更新されたデータフォーマット(仕様確定版)を参照しています。

Excelに記載された仕様から表定義を作成するにあたって、Oracle DatabaseおよびOracle APEXとして扱いやすくなるよう、いくつか定義の解釈を変えています。
  1. PKとして指定されている主キーについては、主キーではなく一意制約として作成しています。データをインポートする表に主キーは定義していません。このようにした理由は後述します。
  2. 町字マスター(Excelシートとしては03町字)のNo.21 chome_number丁目名_数字)は文字列(半角数字)ではなく、データ型としては整数として定義しています。改訂履歴を見ると2.00版(2023年12月28日改訂)で、データ型を整数から文字列に変更していますが、chome_numberだけは文字列だと制約の設定が難しかったためです。これは町字マスター(フルセット)に含まれるchome_numberも同様です。
  3. 住居表示-住居マスター(Excelシートとしては06住居表示-住居)では、効力発生日のみPKと指定されています。効力発生日のみで一意にはできないため、一意制約の設定はしていません。
  4. Excelのデータフォーマットでは、同一町字識別情報machiaza_dist)は、03町字および07町字フルセットで定義されていますが、04地番05住居表示-街区06住居表示-住居には定義されていません。しかし、レジストリカタログからダウンロードできるCSVのデータには、列としてmachiaza_distが含まれているため、これらのマスター表にも列としてmachiaza_distを追加しています。
町字地番住居表示-街区住居表示-住居町字フルセットのマスターでは、主キーに効力発生日が含まれます。試験公開されているアドレス・ベース・レジストリデータ解説書(試験公開版)を参照すると、3.5 効力発生日と廃止日として以下の説明があります。
3.5 効力発生日と廃止日

アドレス・ベース・レジストリの各テーブル(位置参照拡張を除く)には、「効力発生日」 「廃止日」のフィールドを用意しています。これらは、初期データ整備では収録していませ んが、今後のアドレス・ベース・レジストリ運用において、過去のレコードを保持できるよ うにすること、変更時に変更前後の情報を両方保持できるようにすること等を想定して、あ らかじめ項目だけ用意しているものです。
都道府県と市区町村マスター、および、それぞれの位置参照拡張は異なりますが、アドレス・ベース・レジストリとして配布されるデータは履歴を含むようです。今回はジオコーディングや逆ジオコーディングでのデータ利用を想定しているため、必要なのは最新のデータに限定されます。

アドレス・ベース・レジストリから取得するCSVは、あくまでデータ交換用として扱い、ロード先の表は、インターフェース表(データ交換のために一時的にデータをロードする表)として作成します。ジオコーディングや逆ジオコーディングに使う表は別途定義し、インターフェース表にアップロードした住所・所在地データをインポートすることにします。

本記事では、インターフェース表の作成とアドレス・ベース・レジストリとして入手できるCSVのロード(を行うAPEXアプリケーションの作成)までの作業を行います。

クイックSQLの以下のモデルから、アドレス・ベース・レジストリのマスター・データをインポートするインターフェース表を作成します。

クイックSQLを開き、左ペインにモデルを記述して、レビューおよび実行をクリックします。


スクリプト名を入力し、実行をクリックします。


即時実行をクリックします。


DDLが実行され、それぞれの表が作成されます。エラーが発生していないことを確認します。

アプリケーションの作成をクリックします。


確認画面が開くので、アプリケーションの作成をクリックします。


アプリケーション作成ウィザードが開きます。アプリケーションの名前Address Base Registyとします。

あらかじめ、クイックSQLのモデルで定義した13の表を対象としたフォーム付き対話モード・レポートのページが追加されています。

そのまま、アプリケーションの作成を実行します。


アプリケーションAddress Base Registryが作成されます。


アプリケーションを実行し、サインインします。それぞれの表の対話モード・レポートへのリンクが作成されています。


今の所、まったくデータはロードしていないため、どのレポートのページを開いても、何も表示されません。


これから、このアプリケーションにデータをロードする機能を追加していきます。

その前に、これらの表に制約を設定します。以下のSQLを実行します。

SQLワークショップSQLスクリプトとして実行します。確認画面が開くので、即時実行をクリックします。


スクリプトが実行されます。エラーがないことを確認します。


これより、データのインポート作業を行います。

データのインポートにあたって、以下の作業をすべてのデータセットに対して繰り返します。
  1. デジタル庁が提供しているレジストリカタログより、インポートするデータセットを見つけてダウンロードします。
  2. ダウンロードしたZIPファイルを展開し、CSVを取り出します。
  3. APEXアプリケーションで共有コンポーネントデータ・ロード定義を作成します。データ・ロード定義を作成するにあたって、ダウンロードしたCSVを使用します。
  4. 作成したデータ・ロード定義を主に、データをロードするページを作成します。
  5. 作成したページを実行し、ダウンロードしたデータセットのCSVをインポートします。
上記の作業を、都道府県市区町村町字地番住居表示-街区住居表示-住居町字フルセット都道府県位置参照市区町村位置参照町字位置参照地番位置参照住居表示-街区位置参照住居表示-住居位置参照を対象として、都合13回繰り返します。

都道府県から始めます。デジタル庁のレジストリカタログのサイトを開きます。

都道府県マスターのデータセットを検索し、日本 都道府県マスター データセットをダウンロードします。


ダウンロードしたmt_pref_all.csv.zipを解凍し、mt_pref_all.csvを取り出します。

共有コンポーネントデータ・ロード定義を開きます。


作成をクリックします。


データ・ロードの作成最初からです。

へ進みます。


データ・ロード定義の名前PREFとします。表名MT_PREFを選択します。

へ進みます。


サンプル・ファイルとして、レジストリ・カタログからダウンロードしたmt_pref_all.csvを選択します。

へ進みます。


インポートする表の定義は、アドレス・ベース・レジストリの定義を元にしているため、CSVのソース列と表のマップ先は自動的に一致します。

ファイル・エンコーディングUnicode(UTF-8)に変更します。列ABLT_DATE廃止日)にはデータが含まれていないため、書式マスクにデフォルト値が設定されません。列EFCT_DATEと同じになるよう、YYYY"-"MM-"-"DDを設定します。

表に設定している一意制約に含まれている列を、主キーとしてチェックを入れます。表MT_PREFについては列LG_CODEが一意制約の対象となっています。

以上の設定を行い、データ・ロードの作成をクリックします。


データ・ロード定義PREFが作成されます。


作成されたデータ・ロード定義PREFを開きます。

今回はCSVのデータを、データ交換のためにインターフェース表にロードします。そのため、設定ロード・メソッド追加に変更します。

変更の適用をクリックします。


作成したデータ・ロード定義を元に、データをロードするページを作成します。

ページの作成をクリックします。


データのロードを選択します。


データ・ロード属性データ・ロードPREFを選択します。ページの名前は選択するデータ・ロード定義に合わせて、Load PREFとします。

最大ファイル・サイズ(MB)はデフォルトの5から変更不要です。都道府県のデータは少ないためです。他のデータ、例えば町字マスターなどは全部で162MB程度あるため、最大ファイル・サイズ(MB)に、大きな値を設定する必要があります。

ナビゲーションはデフォルトから変更せず、ナビゲーションブレッドクラムの双方を作成します。

以上の設定で、ページの作成をクリックします。


データをロードするページが作成されます。

ページを実行し、データをロードします。


Load PERFにて、ファイルの選択をクリックします。


ファイルがアップロードされ、内容がプレビューされます。

データのロードをクリックします。


データのロードが完了し、ロードされた行数がメッセージに表示されます。


データベースにロードされたデータは、ナビゲーション・メニューのPerfから開く、表MT_PERFの対話モード・レポートより確認できます。


以上で、都道府県マスターのデータ・ロード作業は完了です。

次に市区町村マスターをデータベースにロードします。日本 市区町村マスター データセットをダンロードします。インポートするファイルはmt_city_all.csvです。


作成するデータ・ロード定義の名前CITYとします。ターゲットの表名MT_CITYです。続く画面で、サンプル・データとしてmt_city_all.csvを選択します。


都道府県マスターの設定と同様に、ファイル・エンコーディングUnicode(UTF-8)として、一意制約に含まれている列(市区町村マスターでは列LG_CODEのみ)の主キーにチェックを入れます。列ABLT_DATE書式マスクYYYY"-"MM"-"DDを設定します。

以上で、データ・ロードの作成をクリックします。


作成されたデータ・ロード定義CITYの設定のロード・メソッド追加に変更します。


作成したデータ・ロード定義CITYを元に、データをロードするページを作成します。

ページの名前Load CITYデータ・ロードとしてCITYを選択します。


作成したページLoad CITYを実行し、ファイルmt_city_all.csvをアップロードします。

プレビューを確認し、データのロードを実行します。


MT_CITYにロードされたmt_city_all.csvの内容は、ナビゲーション・メニューのCityの対話モード・レポートから確認できます。


町字マスターのデータをロードします。日本 町字マスター データセットをダウンロードします。インポート対象となるファイルはmt_town_all.csvです。


作成するデータ・ロード定義の名前TOWNとします。ターゲットの表名MT_TOWNです。続く画面で、サンプル・データとしてmt_town_all.csvを選択します。


ファイル・エンコーディングUnicode(UTF-8)への変更、主キーの設定(町字マスターでは列LG_CODEMACHIAZA_IDRSDT_ADDR_FLGEFCT_DATE)、ABLT_DATEの書式マスクYYYY"-"MM"-"DDの設定を行います。

データ・ロード定義が作成された後に、ロード・メソッド追加に変更します。


町字マスターをロードするページの名前Load TOWNとします。データ・ロードとしてTOWNを選択します。

町字マスターはデータ量が多いため、最大ファイル・サイズ(MB)200を設定します。


町字マスターはデータ量が多く、そのままデータ・ロードを行うと、ロード中にタイムアウトが発生します。そのため、データ・ロードをバックグラウンドで処理する必要があります。

作成されたデータ・ロードのページのプロセス・ビューを表示します。

新たにプロセスを作成します。

識別名前バックグラウンド処理タイプ実行チェーンを選択します。

設定バックグラウンド実行オンにします。一時ファイル処理移動一時ファイル・アイテムとしてP30_FILE(ページ番号が異なる場合は、数値の部分が変わります。タイプファイルのアップロードであるページ・アイテムを指定します)、実行限度とします。

実行限度は同一セッション内での制限になります。他のセッションから実行されることも考慮し、シリアライズオンすでに実行時エラーを指定します。

サーバー側の条件ボタン押下時LOADを指定します。


プロセスデータのロードを選択します。

識別実行チェーンとしてバックグラウンド処理を選択します。設定ファイル参照アイテムの値が、実行チェーンに設定した一時ファイル・アイテムの値と一致していることを確認します。

サーバー側の条件ボタン押下時をLOADから、無指定(- 選択 -)に戻します。サーバー側の条件は、実行チェーンに設定されています。


以上でデータ・ロードがバックグラウンドで実行されるようになりました。

ページを実行し、町字マスターのデータをロードしてみます。

Load TOWNを開き、アップロードするファイルとしてmt_town_all.csvを選択します。

時間がかかりますが、最終的にプレビューが表示されます。

データのロードをクリックします。


データのロードはバックグランドで実行されるため、データのロードをクリックした後に、アプリケーションは待機せずに操作可能になります。


データ・ロードの進捗を確認します。

ナビゲーション・メニューのTownを開き、対話モード・レポートのアクションからグループ化を選択します。

グループ化の対象列としてPerf(都道府県名)を選択します。ファンクションカウントを選択し、合計オンにします。都道府県ごとの件数と全体の件数を、対話モード・レポートに表示します。


都道府県ごとの町字のロード件数と、全体のロード件数が対話モード・レポートに表示されます。ページを再ロードすることにより、ロード件数が更新されます。データ・ロード定義のコミット間隔として200(デフォルト値)が設定されているため、200件ごとに表示が更新されます。


2024年6月時点でのmt_town_all.csvには、770209件の町字が含まれています。バックグラウンドで処理を行っているためタイムアウトは発生しませんが、すべてのデータをロードするのに2時間程度の時間がかかります。

Oracle APEXのデータ・インポートは、インポート時にルックアップ・テーブルをみて、ID値に置き換えたり、正規表現を適用して値を整形したりといった処理ができる反面、PL/SQLだけで実装しているため処理は速くありません。今回のように、CSVのデータをそのまま変更せずにデータベースにロードするケースでは、Oracle Databaseの外部表を使ったり、DBMS_CLOUD.COPY_DATAを使うといった方法、データベース・アクションを使うといった方法の検討もお勧めします。

これ以外のマスター・データに対する作業も、手順としては同じです。地番、住居表示-街区、住居表示-住居のマスターは町字よりもはるかにデータ量が多いため、全体を一度に取り込むことは、APEXのアプリケーションではほぼ出来ません。

データ・ロード定義およびアプリケーションの作成を完了させるために、データは世田谷区(市区町村で限定すればよく、世田谷区以外でも構いません)に限定して作業を進めます。

東京都 世田谷区 地番マスター データセットをダウンロードします。ロード対象のファイルはmt_parcel_city131121.csvになります。


データ・ロード定義の名前PARCELとします。ターゲットの表名MT_PARCELです。


主キーとして列LG_CODEMACHIAZA_IDPRC_IDPRC_NUM1RSDT_ADDR_FLGEFCT_DATEをチェックします。それ以外は他と同じです。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load PARCELデータ・ロードPARCELを選択します。最大ファイル・サイズ(MB)100とします。

ページが作成された後、町字マスターをロードするページと同様に、データのロードをバックグラウンドで処理するように、実行チェーンの作成を行います。手順はほぼ同じなので、省略します。


以上で地番のマスター・データをロードするページができます。

作成したページより、データ・ロード定義の作成に使用したファイルmt_parcel_city131121.csvをロードします。


ロードした結果はナビゲーション・メニューのParcelから開く、対話モード・レポートで確認できます。


東京都 世田谷区 住居表示-街区マスター データセットをダウンロードします。ロード対象のファイルはmt_rsdtdsp_blk_city131121.csvになります。


データ・ロード定義の名前RSDTDSP_BLK、ターゲットの表名MT_RSDTDSP_BLKです。


主キーとして列LG_CODEMACHIAZA_IDBLK_IDRSDT_ADDR_FLGEFCT_DATEをチェックします。それ以外は他と同じです。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load RSDTDSP_BLKデータ・ロードRSDTDSP_BLKを選択します。最大ファイル・サイズ(MB)5のまま、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのRsdtdsp Blkの対話モード・レポートのページより、ロードされたデータを確認します。


東京都 世田谷区 住居表示-住居マスター データセットをダウンロードします。ロード対象のファイルはmt_rsdtdsp_rsdt_city131121.csvになります。


データ・ロード定義の名前RSDTDSP_RSDT、ターゲットの表名MT_RSDTDSP_RSDTです。


主キーはチェックしません(下のスクリーンショットではチェックが入っていますが、外します)。それ以外は他と同じです。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load RSDTDSP_RSDTデータ・ロードRSDTDSP_RSDTを選択します。最大ファイル・サイズ(MB)20とし、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのRsdtdsp Rsdtの対話モード・レポートのページより、ロードされたデータを確認します。


町字マスター(フルセット)のデータをロードします。日本 町字マスター(フルセット) データセットをダウンロードします。インポート対象となるファイルはmt_town_fullset_all.csvです。

町字マスター(フルセット)は、町字マスターより多くの列が定義されていますが、データ自体は、町字マスターとそれほど違いはありません。

作業手順や設定は町字マスターと同じです。そのため、手順の記載は省略します。作成するデータ・ロード定義の名前TOWN_FULLSET、データをロードするページの名前はLoad TOWN_FULLSETとします。


日本 都道府県マスター位置参照拡張 データセットをダウンロードします。ロード対象のファイルはmt_pref_pos_all.csvになります。


データ・ロード定義の名前PREF_POS、ターゲットの表名MT_PREF_POSです。


ファイル・エンコーディングUnicode(UTF-8)に変更します。主キーとして列LG_CODEをチェックします。位置参照拡張は履歴を含まないため、効力発生日および廃止日は含みません。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load PREF_POSデータ・ロードPREF_POSを選択します。最大ファイル・サイズ(MB)5のまま変更せず、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのPref Posの対話モード・レポートのページより、ロードされたデータを確認します。


日本 市区町村マスター位置参照拡張 データセットをダウンロードします。ロード対象のファイルはmt_city_pos_all.csvになります。


データ・ロード定義の名前CITY_POS、ターゲットの表名MT_CITY_POSです。


ファイル・エンコーディングUnicode(UTF-8)に変更し、主キーとして列LG_CODEをチェックします。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load CITY_POSデータ・ロードCITY_POSを選択します。最大ファイル・サイズ(MB)5のまま変更せず、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのCity Posの対話モード・レポートのページより、ロードされたデータを確認します。


全国 町字マスター位置参照拡張 データセットをダウンロードします。

全国 町字マスター位置参照拡張のデータはmt_town_pos_all.csv.zipとしてダウロードされます。このZIPファイルにはmt_town_pos_pref01.csv.zipからmt_town_pos_pref47.csv.zipまで、47都道府県ごとに分割されたファイルが含まれています。

今回はこの中のmt_town_pos_pref13.csv.zip(つまり東京都)を解凍したmt_town_pos_pref13.csvをロード対象とします。


データ・ロード定義の名前TOWN_POS、ターゲットの表名MT_TOWN_POSです。


ファイル・エンコーディングUnicode(UTF-8)に変更し、主キーとして列LG_CODEMACHIAZA_IDRSDT_ADDR_FLGをチェックします。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load TOWN_POSデータ・ロードTOWN_POSを選択します。最大ファイル・サイズ(MB)5のまま変更せず、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのTown Posの対話モード・レポートのページより、ロードされたデータを確認します。


世田谷区 地番マスター位置参照拡張 データセットをダウンロードします。ロード対象のファイルはmt_parcel_pos_city131121.csvになります。


データ・ロード定義の名前PARCEL_POS、ターゲットの表名MT_PARCEL_POSです。


ファイル・エンコーディングUnicode(UTF-8)に変更し、主キーとして列LG_CODEMACHIAZA_IDPRC_IDをチェックします。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load PARCEL_POSデータ・ロードPARCEL_POSを選択します。最大ファイル・サイズ(MB)5のまま変更せず、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのParcel Posの対話モード・レポートのページより、ロードされたデータを確認します。


世田谷区 住居表示-街区マスター位置参照拡張 データセットをダウンロードします。ロード対象のファイルはmt_rsdtdsp_blk_pos_city131121.csvになります。


データ・ロード定義の名前PARCEL_POS、ターゲットの表名MT_PARCEL_POSです。


ファイル・エンコーディングUnicode(UTF-8)に変更し、主キーとして列LG_CODEMACHIAZA_IDBLK_IDREP_LONREP_LATをチェックします。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load RSDTDSP_BLK_POSデータ・ロードRSDTDSP_BLK_POSを選択します。最大ファイル・サイズ(MB)5のまま変更せず、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのRsdtdsp Blk Posの対話モード・レポートのページより、ロードされたデータを確認します。


世田谷区 住居表示-住居マスター位置参照拡張 データセットをダウンロードします。ロード対象のファイルはmt_rsdtdsp_rsdt_pos_city131121.csvになります。


データ・ロード定義の名前RSDTDSP_RSDT_POS、ターゲットの表名MT_RSDTDSP_RSDT_POSです。


ファイル・エンコーディングUnicode(UTF-8)に変更し、主キーとして列LG_CODEMACHIAZA_IDBLK_IDRSDT_IDREP_LONREP_LATをチェックします。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load RSDTDSP_RSDT_POSデータ・ロードRSDTDSP_RSDT_POSを選択します。最大ファイル・サイズ(MB)50に変更しますが、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのRsdtdsp Rsdt Posの対話モード・レポートのページより、ロードされたデータを確認します。


以上で、デジタル庁によって整備されている以下のアドレス・ベース・レジストリをデータベースにロードし、参照するAPEXアプリケーションが作成できました。
  1. 都道府県マスター
  2. 市区町村マスター
  3. 町字マスター
  4. 地番マスター
  5. 住居表示-街区マスター
  6. 住居表示-住居マスター
  7. 町字マスター(フルセット)
  8. 都道府県マスター位置参照拡張
  9. 市区町村マスター位置参照拡張
  10. 町字マスター位置参照拡張
  11. 地番マスター位置参照拡張
  12. 住居表示-街区マスター位置参照拡張
  13. 住居表示-住居マスター位置参照拡張
最後に、アプリケーションにもうひとつ、ページを追加します。インポート対象のファイルがどのマスターに当たるかは、ファイル名から判断できます。

ファイル名から使用するデータ・ロード定義を決めて、データのロードを実行するページを作成します。

以下のようなページになります。ファイルを選択するページ・アイテムとアップロードするボタンだけの簡単なページです。


空白ページを作成して、機能を実装します。

ページ・アイテムの識別名前P41_FILESタイプファイルのアップロードです。ラベルはFilesとします。

ストレージタイプ表APEX_APPLICATION_TEMP_FILESファイルをパージするタイミングセッションの終わりを指定します。

複数ファイルの許可オフにします。

データ・ロードの処理自体は、複数ファイルを指定しても動くように実装していますが、現行バージョンのOracle APEXは、複数のファイルは実行チェーンの一時ファイル処理の対象にならず、バックグラウンド処理へ一時ファイルが移動またはコピーされない、という不具合があります。24.1で修正される予定です。


ボタンLOADは、クリックするとページを送信する、一般的なボタンです。


ボタンLOADをクリックしたときに実行されるプロセスを作成します。

データのロードをバックグラウンドで処理するために、実行チェーンを作成します。設定内容は、今までの作業で作成した実行チェーンと同じです。


アップロードされたファイルをデータベースにロードするプロセスを作成します。

識別名前Load ZIPタイプコードを実行とします。実行チェーンバックグラウンド処理を指定します。

ソースPL/SQLコードとして以下を記述します。



アップロードした住所・所在地データのファイルがZIPであれば、ZIPを解凍して含まれているCSVファイルをデータベースにロードします。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/address-base-registry.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。