デジタル庁によるアドレス・ベース・レジストリの説明は、次のサイトに掲載されています。
アドレス・ベース・レジストリ
まず、データを投入する表を作成します。表を定義するにあたって、2024年1月15日に更新されたデータフォーマット(仕様確定版)を参照しています。
Excelに記載された仕様から表定義を作成するにあたって、Oracle DatabaseおよびOracle APEXとして扱いやすくなるよう、いくつか定義の解釈を変えています。
- PKとして指定されている主キーについては、主キーではなく一意制約として作成しています。データをインポートする表に主キーは定義していません。このようにした理由は後述します。
- 町字マスター(Excelシートとしては03町字)のNo.21 chome_number(丁目名_数字)は文字列(半角数字)ではなく、データ型としては整数として定義しています。改訂履歴を見ると2.00版(2023年12月28日改訂)で、データ型を整数から文字列に変更していますが、chome_numberだけは文字列だと制約の設定が難しかったためです。これは町字マスター(フルセット)に含まれるchome_numberも同様です。
- 住居表示-住居マスター(Excelシートとしては06住居表示-住居)では、効力発生日のみPKと指定されています。効力発生日のみで一意にはできないため、一意制約の設定はしていません。
- 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スクリプトとして実行します。確認画面が開くので、即時実行をクリックします。
スクリプトが実行されます。エラーがないことを確認します。
これより、データのインポート作業を行います。
データのインポートにあたって、以下の作業をすべてのデータセットに対して繰り返します。
- デジタル庁が提供しているレジストリカタログより、インポートするデータセットを見つけてダウンロードします。
- ダウンロードしたZIPファイルを展開し、CSVを取り出します。
- APEXアプリケーションで共有コンポーネントのデータ・ロード定義を作成します。データ・ロード定義を作成するにあたって、ダウンロードしたCSVを使用します。
- 作成したデータ・ロード定義を主に、データをロードするページを作成します。
- 作成したページを実行し、ダウンロードしたデータセットのCSVをインポートします。
上記の作業を、都道府県、市区町村、町字、地番、住居表示-街区、住居表示-住居、町字フルセット、都道府県位置参照、市区町村位置参照、町字位置参照、地番位置参照、住居表示-街区位置参照、住居表示-住居位置参照を対象として、都合13回繰り返します。
都道府県から始めます。デジタル庁のレジストリカタログのサイトを開きます。
都道府県マスターのデータセットを検索し、日本 都道府県マスター データセットをダウンロードします。
ダウンロードしたmt_pref_all.csv.zipを解凍し、mt_pref_all.csvを取り出します。
共有コンポーネントのデータ・ロード定義を開きます。
作成をクリックします。
次へ進みます。
サンプル・ファイルとして、レジストリ・カタログからダウンロードしたmt_pref_all.csvを選択します。
データ・ロード定義の名前はPREFとします。表名にMT_PREFを選択します。
次へ進みます。
次へ進みます。
ファイル・エンコーディングを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です。
都道府県マスターの設定と同様に、ファイル・エンコーディングをUnicode(UTF-8)として、一意制約に含まれている列(市区町村マスターでは列LG_CODEのみ)の主キーにチェックを入れます。列ABLT_DATEの書式マスクにYYYY"-"MM"-"DDを設定します。
以上で、データ・ロードの作成をクリックします。
作成されたデータ・ロード定義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を選択します。
データ・ロード定義が作成された後に、ロード・メソッドは追加に変更します。
データ・ロードの進捗を確認します。
東京都 世田谷区 住居表示-街区マスター データセットをダウンロードします。ロード対象のファイルはmt_rsdtdsp_blk_city131121.csvになります。
町字マスターをロードするページの名前はLoad TOWNとします。データ・ロードとしてTOWNを選択します。
町字マスターはデータ量が多いため、最大ファイル・サイズ(MB)に200を設定します。
町字マスターはデータ量が多く、そのままデータ・ロードを行うと、ロード中にタイムアウトが発生します。そのため、データ・ロードをバックグラウンドで処理する必要があります。
作成されたデータ・ロードのページのプロセス・ビューを表示します。
新たにプロセスを作成します。
識別の名前はバックグラウンド処理、タイプは実行チェーンを選択します。
設定のバックグラウンド実行をオンにします。一時ファイル処理は移動、一時ファイル・アイテムとしてP30_FILE(ページ番号が異なる場合は、数値の部分が変わります。タイプがファイルのアップロードであるページ・アイテムを指定します)、実行限度を1とします。
実行限度は同一セッション内での制限になります。他のセッションから実行されることも考慮し、シリアライズをオン、すでに実行時にエラーを指定します。
サーバー側の条件のボタン押下時に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を使うといった方法、データベース・アクションを使うといった方法の検討もお勧めします。
Oracle APEXのデータ・インポートは、インポート時にルックアップ・テーブルをみて、ID値に置き換えたり、正規表現を適用して値を整形したりといった処理ができる反面、PL/SQLだけで実装しているため処理は速くありません。今回のように、CSVのデータをそのまま変更せずにデータベースにロードするケースでは、Oracle Databaseの外部表を使ったり、DBMS_CLOUD.COPY_DATAを使うといった方法、データベース・アクションを使うといった方法の検討もお勧めします。
これ以外のマスター・データに対する作業も、手順としては同じです。地番、住居表示-街区、住居表示-住居のマスターは町字よりもはるかにデータ量が多いため、全体を一度に取り込むことは、APEXのアプリケーションではほぼ出来ません。
データ・ロード定義およびアプリケーションの作成を完了させるために、データは世田谷区(市区町村で限定すればよく、世田谷区以外でも構いません)に限定して作業を進めます。
東京都 世田谷区 地番マスター データセットをダウンロードします。ロード対象のファイルはmt_parcel_city131121.csvになります。
データ・ロード定義の名前はPARCELとします。ターゲットの表名はMT_PARCELです。
主キーとして列LG_CODE、MACHIAZA_ID、PRC_ID、PRC_NUM1、RSDT_ADDR_FLG、EFCT_DATEをチェックします。それ以外は他と同じです。
データ・ロード定義の作成後、ロード・メソッドを追加に変更します。
データをロードするページを作成します。名前はLoad PARCEL、データ・ロードにPARCELを選択します。最大ファイル・サイズ(MB)は100とします。
ページが作成された後、町字マスターをロードするページと同様に、データのロードをバックグラウンドで処理するように、実行チェーンの作成を行います。手順はほぼ同じなので、省略します。
以上で地番のマスター・データをロードするページができます。
作成したページより、データ・ロード定義の作成に使用したファイルmt_parcel_city131121.csvをロードします。
ロードした結果はナビゲーション・メニューのParcelから開く、対話モード・レポートで確認できます。
東京都 世田谷区 住居表示-街区マスター データセットをダウンロードします。ロード対象のファイルはmt_rsdtdsp_blk_city131121.csvになります。
データ・ロード定義の名前はRSDTDSP_BLK、ターゲットの表名はMT_RSDTDSP_BLKです。
主キーとして列LG_CODE、MACHIAZA_ID、BLK_ID、RSDT_ADDR_FLG、EFCT_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の対話モード・レポートのページより、ロードされたデータを確認します。
町字マスター(フルセット)は、町字マスターより多くの列が定義されていますが、データ自体は、町字マスターとそれほど違いはありません。
作業手順や設定は町字マスターと同じです。そのため、手順の記載は省略します。作成するデータ・ロード定義の名前はTOWN_FULLSET、データをロードするページの名前はLoad TOWN_FULLSETとします。
日本 都道府県マスター位置参照拡張 データセットをダウンロードします。ロード対象のファイルはmt_pref_pos_all.csvになります。
データ・ロード定義の名前はPREF_POS、ターゲットの表名はMT_PREF_POSです。
ファイル・エンコーディングをUnicode(UTF-8)に変更します。主キーとして列LG_CODEをチェックします。位置参照拡張は履歴を含まないため、効力発生日および廃止日は含みません。
データ・ロード定義の作成後、ロード・メソッドを追加に変更します。
作成されたページよりデータをロードした後、ナビゲーション・メニューの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_CODE、MACHIAZA_ID、RSDT_ADDR_FLGをチェックします。
データ・ロード定義の作成後、ロード・メソッドを追加に変更します。
作成されたページよりデータをロードした後、ナビゲーション・メニューのTown Posの対話モード・レポートのページより、ロードされたデータを確認します。
データ・ロード定義の名前はPARCEL_POS、ターゲットの表名はMT_PARCEL_POSです。
ファイル・エンコーディングをUnicode(UTF-8)に変更し、主キーとして列LG_CODE、MACHIAZA_ID、PRC_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_CODE、MACHIAZA_ID、BLK_ID、REP_LON、REP_LATをチェックします。
データ・ロード定義の作成後、ロード・メソッドを追加に変更します。
データをロードするページを作成します。名前はLoad RSDTDSP_BLK_POS、データ・ロードにRSDTDSP_BLK_POSを選択します。最大ファイル・サイズ(MB)は5のまま変更せず、バックグラウンド処理の設定は省略します。
世田谷区 住居表示-住居マスター位置参照拡張 データセットをダウンロードします。ロード対象のファイルはmt_rsdtdsp_rsdt_pos_city131121.csvになります。
データ・ロード定義の名前はRSDTDSP_RSDT_POS、ターゲットの表名はMT_RSDTDSP_RSDT_POSです。
ファイル・エンコーディングをUnicode(UTF-8)に変更し、主キーとして列LG_CODE、MACHIAZA_ID、BLK_ID、RSDT_ID、REP_LON、REP_LATをチェックします。
データ・ロード定義の作成後、ロード・メソッドを追加に変更します。
データをロードするページを作成します。名前はLoad RSDTDSP_RSDT_POS、データ・ロードにRSDTDSP_RSDT_POSを選択します。最大ファイル・サイズ(MB)は50に変更しますが、バックグラウンド処理の設定は省略します。
以上で、デジタル庁によって整備されている以下のアドレス・ベース・レジストリをデータベースにロードし、参照するAPEXアプリケーションが作成できました。
- 都道府県マスター
- 市区町村マスター
- 町字マスター
- 地番マスター
- 住居表示-街区マスター
- 住居表示-住居マスター
- 町字マスター(フルセット)
- 都道府県マスター位置参照拡張
- 市区町村マスター位置参照拡張
- 町字マスター位置参照拡張
- 地番マスター位置参照拡張
- 住居表示-街区マスター位置参照拡張
- 住居表示-住居マスター位置参照拡張
最後に、アプリケーションにもうひとつ、ページを追加します。インポート対象のファイルがどのマスターに当たるかは、ファイル名から判断できます。
ファイル名から使用するデータ・ロード定義を決めて、データのロードを実行するページを作成します。
以下のようなページになります。ファイルを選択するページ・アイテムとアップロードするボタンだけの簡単なページです。
空白ページを作成して、機能を実装します。
ページ・アイテムの識別の名前はP41_FILES、タイプはファイルのアップロードです。ラベルはFilesとします。
ストレージのタイプは表APEX_APPLICATION_TEMP_FILES、ファイルをパージするタイミングはセッションの終わりを指定します。
複数ファイルの許可はオフにします。
データ・ロードの処理自体は、複数ファイルを指定しても動くように実装していますが、現行バージョンのOracle APEXは、複数のファイルは実行チェーンの一時ファイル処理の対象にならず、バックグラウンド処理へ一時ファイルが移動またはコピーされない、という不具合があります。24.1で修正される予定です。
ボタンLOADは、クリックするとページを送信する、一般的なボタンです。
ボタンLOADをクリックしたときに実行されるプロセスを作成します。
データのロードをバックグラウンドで処理するために、実行チェーンを作成します。設定内容は、今までの作業で作成した実行チェーンと同じです。
アップロードされたファイルをデータベースにロードするプロセスを作成します。
識別の名前はLoad ZIP、タイプはコードを実行とします。実行チェーンにバックグラウンド処理を指定します。
ソースのPL/SQLコードとして以下を記述します。
今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/address-base-registry.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完