2021年11月18日木曜日

東京都のオープンデータAPIを呼び出してデータを取得する

 Oracle APEX 21.2のREST関連の新機能を紹介する記事を書く際に、最初はe-StatのAPIではなく東京都のオープンデータAPIを使うつもりでした。

東京都のAPIではレスポンスに含まれるendCursorの値を次のリクエストのパラメータcursorに与えることによりページ送りを実現しています。これは、Oracle APEXのRESTの新機能では扱うことができません。構造的にもフラットではなく、そのままリレーショナル・データベースの表に投入するのは難しいです。

設定ではできないため、東京都スポーツ施設一覧のAPIを呼び出して得られるデータを表に保存するコードを書いてみました。以下、その作業ログです。

最初に応答を保存する3つの表を作成します。クイックSQLの以下の定義を使いました。

# semantics: default
tky_od_requests
    requested_url  vc200
    requested_date date /default sysdate

tky_od_objects
    request_id number /fk tky_od_requests
    object json

tky_od_facilities
    facility_name vc100
    organization  vc200
    access_route  json
    address       vc200
    latitude      number
    longitude     number
    contact       json
    equipments    json
    types         json
    events        json
    numbers       json
    note          vc400
    capacity      json

表TKY_OD_REQUESTSには呼び出したオープンデータAPIのURLと、その日付を保存します。表TKY_OD_OBJECTSには、APIを呼び出して得られたデータをJSONのまま保存します。表TKY_OD_FACILITIESにはスポーツ施設の情報を施設ごとに保存します。

最初にAPIを呼び出し取得したスポーツ施設ひとつあたり、ひとつのJSONオブジェクトとして保存します。すべての施設のデータを読み出すまで、複数回のAPI呼び出しを行います。


表TKY_OD_OBJECTSに保存されたJSONのデータをパースして、表TKY_OD_FACILITIESへ入れ替えます。


返された情報の扱いを決めきれないため、厳密なスキーマは定義せずJSONのまま属性を保存ししています。また、表TKY_OD_OBJECTSにはリクエスト毎に取得した行を特定する列REQUEST_IDがありますが、上記のコードではREQUEST_IDは使っていません。

両方のコードともに、SQLコマンドより実行しています。


以上で、とりあえず表TKY_OD_FACILITIESに東京都のスポーツ施設の情報が保存されます。

APEXでアプリケーションを作成してデータを確認してみます。

アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前東京都オープンデータとします。ページの追加を実施し、表TKY_OD_FACILITIESをデータ・ソースとした対話モード・レポートファセット検索のページを作成します。

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

アプリケーションが作成されたら、アプリケーションを実行して対話モード・レポートの表示を確認します。

CSV形式で提供されているオープンデータに含まれている、施設名称や施設分類のデータが含まれていないため、単に同じ施設の行が複数あるように見えます。

ファセット検索のページに、Oracle APEX 21.2のミニマップを表示させてみます。こちらの記事の作業と同じです。

最初にminiMap.jsを読み込ませます。

ページ・プロパティJavaScriptに含まれるファイルURLとして、ミニマップの実装となるJavaScriptのファイルを指定します。ファイル名は以下になります。

#APEX_FILES#libraries/apex/widget.miniMap.js


カード・リージョンのAttributesを開き、サブタイトルADDRESS本文拡張フォーマットONにし、HTML式として以下を記述します。

<div class="card-map"
    data-center="[&LONGITUDE.,&LATITUDE.]"
    data-background="osm-bright"
    data-zoom="14"
    data-marker="true"
    data-marker-color="red"
    data-controls="true"
    data-interactive="true"
    data-tooltip="&FACILITY_NAME."
    style="width:100%;height:150px">
</div>


ページ区切りタイプページに変更し、1ページ当たりのカード10にします。


カード・リージョンに動的アクションを作成します。タイミングイベントページ変更[カード]を選択します。選択タイプリージョンリージョン検索結果です。


TRUEアクションの識別のアクションとしてJavaScriptコードの実行を選択し、設定のコードに以下を記述します。

$(".card-map").miniMap();

実行オプション初期化時に実行ONです。


以上でファセット検索のページに地図が表示されるようになりました。


実用的なアプリケーションにするには、JSON形式のまま保存しているデータを解釈したり、ファセットを調整する必要があるでしょう。ただし、東京都スポーツ施設一覧の情報については情報が少なくなっているため、APIよりはCSVを元にしてアプリケーションを作成した方が良さそうです。

以上になります。

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