LoginSignup
4
3

More than 1 year has passed since last update.

Oracle APEXで地理空間データを扱う

Last updated at Posted at 2022-06-03

3-2.png

はじめに

Oracle Application Express(APEX)は、Oracle Databaseのためのローコード・アプリケーション・プラットフォームです。
先日、Oracle APEX上でOracle Databaseの地理空間機能、Oracle Spatialを扱うことができるようになりました。
本記事では、APEXとSpatialを組み合わせて、座標からの空間データを表示する対話型マップを含むアプリケーションを作成してみます。

前提条件

  • Oracle APEX バージョン21.1以上
    ※本記事のスクリーンショットは21.2です。

  • Autonomous Databaseインスタンスが構成済みであること
    ※APEX, Spatialはともに全てのOracle Databaseでもサポートされています。今回はADBを使用します。

  • 使用するサンプルデータのダウンロード

サンプルアプリのインストール

自分で一からアプリを作成する前に、まずはサンプルのアプリから始めてみます。
Oracle APEXには、いくつかの機能を紹介するサンプル・アプリケーションのポートフォリオがあります。今回はOracle APEXの地理空間機能を紹介するSample Mapsアプリケーションを使用します。

アプリケーションのインストール

  1. ワークスペースのホーム画面からアプリケーション・ビルダーをクリックします。
    1-1.png

  2. スタータまたはサンプル・アプリケーションのインストールをクリックします。
    1-2.png

  3. サンプルをクリックすると、サンプルアプリのリストが表示されます。
    1-3.png

  4. スクロールダウンし、Sample MapsDownload Appをクリックし、sample-maps.zipをダウンロードします。
    1-4.png

  5. アプリケーション・ビルダーに戻り、インポートをクリックします。
    1-5.png

  6. sample-maps.zipをドラッグ&ドロップし、次をクリックします。
    1-6.png

  7. デフォルトの設定のまま、アプリケーションのインストールをクリックします。
    1-7.png

  8. 全てデフォルト設定で、インストールをクリックします。
    1-8.png

  9. アプリケーションを実行します。
    1-9.png

  10. APEXのワークスペースのユーザー名とパスワードでサインインします。
    1-10.png

データのロード

  1. 初回起動時にデータのロードに関するメッセージが表示されます。Data Loadingをクリックします。
    2-1.png

  2. Upload Filesを選択し、US States Dataにstates-full.json, Airports Dataにairports-full.jsonをアップロードし、データセットをロード
    2-2.png

サンプルアプリの確認

  1. タイルをクリックすると、機能の関連ページに移動します。今回はMap and Reportをクリックします。
    3-1.png

  2. 地図上に空港の位置情報がマッピングされ、ピンアイコンをクリックすると詳細情報が表示されます。
    3-2.png

  3. 他にもヒートマップなど様々なデータ探索の仕方ができるページがあります。
    3-3.png

サンプルデータの確認

  1. APEX画面に戻りSQLワークショップをクリックし、オブジェクト・ブラウザに移動します。
    4-1.png

  2. EBA_SAMPLE_MAP_AIRPORTSのデータを確認します。右側にスクロールしてジオメトリの列を表示すると、空港は点として保存されるため、点のジオメトリ値が入っています。
    4-2.png

  3. EBA_SAMPLE_MAP_SIMPLE_STATESのデータを確認します。ジオメトリの列を表示すると、州はポリゴンとして保存されます。
    4-3.png

  4. MDRT_...$というテーブルは、他のテーブルの空間索引をサポートするために自動で作成されます。これらは無視してかまいません。
    4-4.png

ゼロから地図アプリを作る

次はゼロから地図上に空港の位置をマッピングするアプリを作成してみます。

ページの作成

  1. アプリケーション・ビルダーから新たにアプリを作成します。
    5-1.png

  2. 新規アプリケーションをクリックします。
    5-2.png

  3. 名前はAPEX Mappingとします。ページの追加をクリックします。
    5-3.png

  4. ゼロから作るので、空白ページを選択します。
    5-4.png

  5. ページの名前はAirports and States Mapとします。
    5-5.png

  6. こちらでアプリケーションの作成をクリックします。
    5-6.png

空港マップをページに追加

  1. 作成したAirports and States Map の編集画面にいきます。リージョンパレットからマップをドラッグし、Bodyセクションの下にドロップします。
    6-1.png

  2. リージョンのタイトルを新規からMy Map Regionへ変更します。
    6-2.png

  3. マップリージョンにはレイヤーという子要素が含まれています。レイヤーは、地図上にレンダリングされるデータコンテンツです。名前を空港に変更し、レイヤー・タイプがポイントになっていることを確認します。
    6-3.png

  4. ソースとして表名にEBA_SAMPLE_MAP_AIRPORTS表を指定します。レンダリングされる空港を制限するため、where句にLAND_AREA_COVERED > 2500を追記します。また、空間索引の使用ボタンをONにします。
    6-4.png

  5. 下にスクロールして、[列のマッピング]セクションに移動します。ジオメトリ型のデータ型SDO_GEOMETRYとジオメトリ列GEOMETRYを選択します。また、主キー列にIDを指定します。
    6-5.png

  6. 下にスクロールして、[情報ウィンドウ]セクションに移動します。ここでは、マップ内のアイテムをクリックしたときにポップアップで表示する情報を設定できます。拡張フォーマットボタンをONにし、HTML式に以下をペーストします。

    <strong>&AIRPORT_NAME.</strong><br>
    &CITY., &STATE_NAME.<br>
    Code: &IATA_CODE.
    

6-6.png

州マップの追加

  1. 「レイヤー」を右クリックし、「レイヤーの作成」を選択します。
    7-1.png

  2. 名前を州、レイヤー・タイプをポリゴン、ソースをEBA_SAMPLE_MAP_SIMPLE_STATESに設定します。
    7-2.png

  3. レイヤーはページツリーに表示されている順番でレンダリングされます。空港を州の上にレンダリングするため、州レイヤーを空港レイヤーの上にドラッグします。また、[列のマッピング]でジオメトリ列GEOMETRYを選択します。[外観]で塗りつぶしの色と不透明度を設定します。ただし、不透明度を1にしてしまうと、背景の地図が見えなくなってしまうので注意してください。そしてツールチップにNAME列を指定します。
    7-3.png

  4. こちらで保存し、実行します。
    7-4.png

  5. 空港をクリックすると設定した情報ウィンドウが表示されます。また、州の上にカーソルを置くと、設定したツールチップ、州の名前が表示されます。
    7-5.png

空間分析

続いて上で作成したマップを拡張します。選択した州の中から、ユーザーが決めた距離の範囲内にある空港を検索できるようにします。

フィルタリングのためのリージョンを追加

  1. 左側のツリー一番上のページ2:Airports and States Mapをクリックします。次に、右側のプロパティパネルで、[外観]のページ・テンプレートをLeft Side Columnに変更します。
    8-1.png

  2. 静的コンテンツをLEFT COLUMNにドラッグします。
    8-2.png

  3. 名前をMy Filters Regionに変更します。
    8-3.png

州の選択リストの作成

  1. アイテム:選択リストをREGION BODYにドラッグし、名前をP2_STATE、ラベルを州にします。
    9-1.png

  2. 右側のアイテムプロパティで、[検証]で必須の値に設定します。そしてLOVのタイプをSQL問合せにし、以下のクエリを入力します。また、追加値の表示・NULL値の表示はOFFにします。

    select name, state_code
    from EBA_SAMPLE_MAP_SIMPLE_STATES
    order by name
    

    9-2.png

  3. スクロールダウンし、[デフォルト]セクションでタイプを静的に、静的値を'Texas'または任意の州('で囲む)に設定します。
    9-3.png

距離の入力項目を追加

  1. アイテム:数値フィールドをREGION BODYにドラッグし、名前をP2_DISTANCEにします。またラベルを距離(km)とします。
    10-1.png

  2. スクロールダウンし、[検証]セクションで必須の値をONにします。
    10-2.png

  3. スクロールダウンし、[デフォルト]セクションでタイプ:静的、静的値:100と入力します。
    10-3.png

動的アクションの作成

  1. P2_DISTANCEを右クリックし、動的アクションの作成をクリックします。
    11-1.png

  2. 動的アクションのプロパティで、名前を検証と更新に設定します。[タイミング]セクションでイベント:変更、選択タイプ:アイテム、アイテム:P2_DISTANCE, P2_STATE に設定します。続いて距離に負の値を送信させないように、[クライアント側の条件]セクションでタイプ:アイテム => 値、アイテム:P2_DISTANCE、値:0に設定します。
    11-2.png

  3. 動的アクションは、設定された条件に基づいて呼び出されるTRUEアクションとFALSEアクションで構成されています。クライアント側の条件(P2_DISTANCE >= 0)がTRUEである場合、入力値を送信し、ページを更新する必要があります。アクションプロパティで、アクション:リフレッシュ、選択タイプ:リージョン、リージョン:My Map Regionと設定します。
    11-3.png

  4. 次に、クライアント側の条件が満たされない場合、つまり負の距離値が入力された場合に呼び出されるアクションを設定します。[False]を右クリックし、FALSEアクションの作成をクリックします。
    11-4.png

  5. FALSEアクションは、ユーザーへのポップアップメッセージとします。アクション:アラートに設定し、タイトルとメッセージを入力します。
    11-5.png

  6. My Map Region には現在すべての州が表示されるようになっています。ここから、P2_STATEで選択した州のみ表示させるようにします。州レイヤーを選択し、レイヤープロパティの[ソース]セクションのWHERE句でstate_code = :P2_STATEと入力します。
    11-6.png

  7. 最後に、ユーザーが入力した州と距離の範囲内の空港が表示されるよう空港レイヤーを修正します。空港レイヤーを更新し、レイヤープロパティの[ソース]セクションのタイプをSQL問合せにし、以下のクエリを入力します。

    select a.*
    from EBA_SAMPLE_MAP_AIRPORTS a, 
         EBA_SAMPLE_MAP_SIMPLE_STATES b
    where b.state_code= :P2_STATE
    and a.land_area_covered > 1000
    and sdo_within_distance(a.geometry, b.geometry, 'distance='|| :P2_DISTANCE ||' unit=KM') = 'TRUE'
    

    送信するページ・アイテムには、P2_STATE, P2_DISTANCEを設定します。
    11-7.png

  8. アプリケーションを保存・実行します。州でAlabamaを選択すると、アラバマ州と100km以内の空港が地図上に表示されています。
    11-8.png

  9. 次に州でKansasを選択し、距離で600を指定すると、以下のように表示されます。
    11-9.png

  10. 最後に距離に負の値を入力してみると、正しく設定したポップアップが表示されました。
    11-10.png

おわりに

サンプルアプリで示したように、APEX上でOracle Spatial機能を使ってできることは他にもたくさんあります。本記事では基本的な機能を持つアプリを作成しましたが、上手く活用すればより高度な空間分析も可能ですので、ぜひお試しいただければと思います。

参考資料

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3