2021年6月1日火曜日

都道府県ごとの人口をヒートマップで表示する

Oracle APEX 21.1の新機能であるマップ・リージョンを使って、都道府県の県庁所在地とそれぞれの都道府県の人口をヒートマップとして表示させてみます。

都道府県の県庁所在地の座標データはアマノ技研さんが公開しているデータを使用しています。

必要事項を入力し、ダウンロードをします。ダウンロードされたasti-datr0304po.zipというファイルに含まれるr0304puboffice_utf8.csvをデータベースに取り込みます。

では、マップを表示するまでの作業ログを記載します。都道府県ごとの人口の情報は、以前の記事で作成した表EGOV_POPULATIONを参照するため、そちらの作業を先に実施する必要があります。

データをロードするための表を作成します。SQLワークショップのユーティリティよりクイックSQLを実行します。以下のモデルより表を作成します。

# prefix: amano
# semantics: default
municipality_location
jiscode num
name vc40
namekana vc80
building vc80
zipcode vc8
address vc160
tel vc20
source vc40
lat num
lon num
note vc80

モデルの入力を行い、SQLの生成、SQLスクリプトを保存、レビューおよび実行を順次実施します。

CREATE文をレビューし、実行をクリックします。確認画面が表示されるので、そこで即時実行をクリックします。

表が作成されたら、アプリケーションの作成を開始します。こちらも確認画面が表示されるので、アプリケーションの作成を再度クリックします。

アプリケーションの名前を都道府県人口とし、アプリケーションの作成を行います。

アプリケーションが作成されたら、地方公共団体の位置データを読み込むために、データ・ロード定義を作成します。共有コンポーネントのデータ・ロード定義を開きます。


データ・ロード定義の一覧画面より、作成を実行します。


データ・ロードの作成として最初からを選択し、次へ進みます。


名前としてMUNICIPALITY_LOCATIONを指定し、ターゲット・タイプは表、表名として先程作成したAMANO_MUNICIPALITY_LOCATIONを選択します。次へ進みます。


サンプル・ファイルとしてアマノ技研さんよりダウンロードしたファイルr0304puboffice_utf8.csvを指定します。次へ進みます。


表AMANO_MUNICIPALITY_LOCATIONの列名はCSVのヘッダーと一致するように作成しているため、マップ先はすべて自動的に割り当たります。ファイル・エンコーディングとしてUnicode(UTF-8)、ソース列のJISCODE(Number)の主キーにチェックを入れます。ページの作成および追加を実行します。


ページの名前をデータのロードとします。次へ進みます。


ナビゲーションのプリファレンスとして、新規ナビゲーション・メニュー・エントリの作成を選びます。次に進みます。


デフォルトで指定される値は変更不要なので、そのまま作成を実行します。


作成されたページを実行して、データのロードを行います。


ファイルの選択をクリックして、r0304puboffice_utf8.csvを選択します。

プレビューを確認し、データのロードをクリックします。


データ・ロード終了:1963行が処理されました。と表示され、データのロードが完了します。


ホーム・ページにマップ・リージョンを作成します。ページ・デザイナでページ番号1のホーム・ページを開きます。ページ・ナビゲーションのリージョンを削除します。


新規にリージョンの作成を行い、識別のタイトルを都道府県人口とします。タイプにマップを選択し、ソースの位置はローカル・データベース、タイプはSQL問合せとします。

SQL問合せには以下を記述します。

select
l.name, l.address, l.lat, l.lon,
p.total
from egov_population p join amano_municipality_location l
on p.prefecture_name = l.name
where p.city_name is null and p.gender = 'T'


新規と表示されているレイヤーを選択し、識別の名前を人口、レイヤー・タイプにヒート・マップを選択します。ソースの位置にリージョン・ソースを選択します。列のマッピングとして、ジオメトリ列のデータ型に経度/緯度、経度列にLON、緯度列にLATを選択します。外観の値列はTOTALを選択します。


新規にレイヤーの作成を行い、識別の名前を都道府県とし、レイヤー・タイプにポイントを選択します。ソースの位置はリージョン・ソースです。列のマッピングとして、ジオメトリ列のデータ型に経度/緯度、経度列にLON、緯度列にLATを選択します。


加えて、ツールチップの拡張フォーマットをONに変更し、HTML式に以下を記載します。

&NAME.
<br/>
住所: &ADDRESS.
<br/>
人口: &TOTAL.


以上でアプリケーションの完成です。アプリケーションを実行すると、各都道府県の県庁所在地とその場所を中心とした人口のヒートマップが表示されます。


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

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

完

総務省が公表している【総計】令和2年1月1日住民基本台帳年齢階級別人口(市区町村別)のExcelファイルを読み込む

 政府CIOポータルのワクチン接種ダッシュボードでは、総務省が公開している住民基本台帳に基づく人口、人口動態及び世帯数内の【総計】令和2年1月1日住民基本台帳年齢階級別人口(市区町村別)を利用しているので、これをOracle APEXにロードしてみました。

多分、e-Statから見ると、このファイルに当たる情報ですが、ファイル名が異なるだけでファイル形式と内容は同じでした。

どちらもExcel 97-2004 ブック(.xls)形式でOracle APEXで読み込むにはExcelブック(.xlsx)に変換する必要があります。

政府CIOポータルからファイル000701583.xlsをダウンロードし、Oracle APEXを使ってデータベースにロードします。

ダウンロードしたファイルを開き、先頭行を削除した上でExcelブック(.xlsx)形式で保存します。ファイル名は000701583.xlsxとします。

SQLワークショップのデータ・ワークショップを使って、データをロードすることができます。この場合、アプリケーションを作成する必要はありません。今回はロード処理は一度だけの作業なのでデータ・ワークショップで十分なのですが、あえてアプリケーションを作成してみます。

最初にデータのロード先となる表を作成し、続けてアプリケーションも作成します。SQLワークショップよりユーティリティのクイックSQLを実行します。

モデルとして以下を入力します。

# prefix: egov
# semantics: default
population
municipality_code num
prefecture_name vc80
city_name vc160
gender vc8
total num
age00 num
age05 num
age10 num
age15 num
age20 num
age25 num
age30 num
age35 num
age40 num
age45 num
age50 num
age55 num
age60 num
age65 num
age70 num
age75 num
age80 num
age85 num
age90 num
age95 num
age100 num

SQLの生成、SQLスクリプトの保存そしてレビューおよび実行を順次実行します。


SQLのレビュー画面では、アプリケーションの作成ではなく 実行をクリックします。


確認画面では、即時実行をクリックします。


表が作成されたら、アプリケーションの作成を実行します。確認画面が開くので、そこでもアプリケーションの作成をクリックします。

アプリケーションの名前を人口統計とします。アプリケーションの作成をクリックします。

アプリケーションが作成されます。共有コンポーネントのデータ・ロード定義を開きます。


作成済みのデータ・ロード定義の一覧画面が表示されます。作成をクリックします。


データ・ロードの作成として最初からを選択し、次へ進みます。


データ・ロード定義の名前をPOPULATIONとしています。名前に日本語を使うこともできますが、その場合は静的IDがうまく生成されないため(日本語の文字は_ (アンダースコア)に置き換えられ、一意性が担保されない)、今回は英字のみで名前を付けました。ターゲット・タイプは表、表名として先程作成したEGOV_POPULATIONを選択します。次へ進みます。


サンプル・ファイルとして、先頭行の削除と形式の変換を行なったファイル000701583.xlsxを指定します。次へ進みます。


すべてのソース列にたいしてマップ先を割り当てます。列は沢山あるので、下までスクロールさせます。主キーの指定は不要です。ページの作成および追加を実行します。


データをロードするページの名前をデータのロードとします。次へ進みます。


ナビゲーションのプリファレンスとして、新規ナビゲーション・メニュー・エントリの作成を選択します。次へ進みます。


データ・ロードとしてPOPULATIONが選択され、最大ファイル・サイズ(MB)が5であることを確認します。作成をクリックします。


データをロードするページが作成されるので、ページを実行します。


ファイルの選択をクリックし、000701583.xlsxを選択します。


プレビューが表示されるので内容を確認し、データのロードをクリックします。


データ・ロード終了:6834行が処理されました。と表示されます。


データのロードに成功しました。Populationのページを開き、都道府県のデータを参照します。フィルタとしてCity NameがNULLを設定します。


都道府県名として読み込んだデータの末尾に'*'(アスタリスク)がついていたり(おそらく都道府県全体の集計について*を付けているようですが、茨城県や栃木県など*が付いていない場合もあります)、男女も漢字のままでは扱いにくいので、データとしてのロード時に変換を行うようにしてみます。

共有コンポーネントのデータ・ロード定義からPOPULATIONを開きます。設定のロード・メソッドを追加から置換へ変更します。その後、データ・プロファイルの編集を開きます。


データのトランスフォーメーションを設定する対象は、PREFECTURE_NAMEとGENDERです。両方ともSQL式を使って変換します。

最初にPREFECTURE_NAMEを開きます。名前をPREFECTURE_NAMEからPREFECTURE_NAME_Rに変更します。表示可能はOFFとします。変更の適用を行います。


列の追加を実行します。

元々Excelに含まれる列をPREFECTURE_NAME_Rとして読み込み、それをSQL式で変換したデータをPREFECTURE_NAMEとしてロードします。


名前をPREFECTURE_NAME、表示可能はON、列タイプにSQL式を選択します。SQL式として以下を指定します。(トランスフォーメーションのルール・タイプに置換がありますが、置き換え後の文字列として式2を必ず指定する必要があり、式1の文字列を削除するためには使用できません。)

replace(PREFECTURE_NAME_R,'*')

データ型は元々の定義と同じくVarchar2、最大長は80とし、作成を実行します。


続いてGENDERを開き、名前をGENDER_Rに変更します。表示可能をOFFにし、変更の適用を行います。


列の追加を再度クリックし、データ・プロファイル列の追加を行います。名前をGENDER、表示可能はON、列タイプにSQL式を選択します。SQL式として以下を記載します。

decode(GENDER_R, '男', 'M', '女', 'F', '計', 'T', 'U')

データ型はVarchar2、最大長は8とします。


データ・プロファイル列として、今までの列PREFECTURE_NAMEとGENDERが、PREFECTURE_NAME_R、GENDER_Rに変更されていることを確認します。


また、新たに列タイプがSQL式のPREFECTURE_NAMEとGENDERが追加されていることを確認し、変更の適用を実行します。


変更の適用をせずにデータ・プロファイルの編集を開くと、それまで画面に指定していた変更がリセットされるようです。今回はロード・メソッドですが、追加に戻っていたら置換に設定し直します。変更の適用を実行します。


アプリケーションを実行し、再度データのロードを行います。


データのロードに成功したら、Populationのレポートを同じ条件(City NameがNULL)で表示させ、結果を確認します。

Prefecture Name、Genderともに設定通りの変換が行われていることが確認できます。


以上でExcelファイルの読み込みは完了しました。

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

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

完