2021年7月16日金曜日

マップのサンプル解説 (4) - 円形ツールを使う

こちらの記事の続きです。

マップ上で円形ツールを使って選択した医療機関をレポートに表示します。


マップのサンプルではCircle Searchのページに実装されています。ひとつ前の記事で作成したレポート上で選択のページをコピーします。ページ番号、ページ名はマップ上で選択とします。

ページが作成されたら作業の開始です。

対話モード・レポートにページ・アイテムP8_CIRCLE_GEOJSONを作成します。タイプ非表示設定保護された値OFFにします。マップ上で円形ツールを使って指定した領域をGeoJSONの形式で保持するために使用します。


円形ツールで指定した領域をP8_CIRCLE_GEOJSONに保存する動的アクションを作成します。

マップ・リージョンで動的アクションの作成を実行します。識別名前Circle Finishedタイミングイベントマップが変更されました[マップ]選択タイプリージョンリージョン..マップを選択します。

クライアント側の条件として、タイプJavaScript式を選び、JavaScript式として以下を記述します。

this.data && this.data.changeType === "circle-drawn"

詳細イベント有効範囲動的にします。


最初のTrueアクションとして、値の設定を作成します。設定タイプの設定JavaScript Expressionを選択します。JavaScript式として以下を記載します。

( this.data.circle ? JSON.stringify( this.data.circle.data.geometry ) : "" )

影響を受ける要素選択タイプアイテムアイテムとしてP8_CIRCLE_GEOJSONを指定します。これで this.data.circle.data.geometry として取得される円形ツールで指定した領域が、GeoJSON形式でページ・アイテムP8_CIRCLE_GEOJSONに設定されます。


ページ・アイテムP8_CIRCLE_GEOJSONに領域の情報が設定されたので、対話モード・レポートのリージョンとマップ・リージョンをリフレッシュして、検索結果に反映させるアクションを作成します。

TRUEアクションの作成を実行し、識別アクションリフレッシュとします。影響を受ける要素選択タイプリージョンリージョンとして対話モード・レポートのリージョンである医療機関を指定します。


同様の手順で、マップ・リージョンをリフレッシュするアクションを作成します。


最後にTRUEアクションとしてJavaScriptコードの実行を作成します。円形ツールで選択した領域をクリアします。設定コードには以下を記述します。

apex.region( "medical-facilities-region" ).call ( "clearCircle" );


円形ツールによって指定された領域に含まれる医療機関のみが検索されるよう、対話モード・レポートとマップ・リージョンのSQL問合せを更新します。Oracle SpatialのSDO_ANYINTERACTファンクションを使用します。

select f.facility_id, f.zip_code, f.facility_name, f.facility_addr, f.geometry
, m.ans_type ans_type_m, e.ans_type ans_type_e, h.ans_type ans_type_h
from c19_medical_facilities f
left outer join (
select ans_type, facility_type, facility_id
from c19_medical_facility_statuses
where facility_type = 'M') m
on f.facility_id = m.facility_id
left outer join (
select ans_type, facility_type, facility_id
from c19_medical_facility_statuses
where facility_type = 'E') e
on f.facility_id = e.facility_id
left outer join (
select ans_type, facility_type, facility_id
from c19_medical_facility_statuses
where facility_type = 'H') h
on f.facility_id = h.facility_id
where
:P8_CIRCLE_GEOJSON is null
or
sdo_anyinteract(
geometry,
mdsys.sdo_util.from_geojson( :P8_CIRCLE_GEOJSON)
) = 'TRUE'

対話モード・レポートのSQL問合せを更新します。送信するページ・アイテムP8_CIRCLE_GEOJSONを追加します。


マップ・リージョンのSQL問合せも更新します。送信するページ・アイテムP8_CIRCLE_GEOJSONを追加します。


円形ツールで指定した領域をマップ上に表示するために、新規にレイヤーを作成します。

レイヤーの作成を実行し、識別名前検索範囲とします。レイヤー・タイプポリゴンです。ソースSQL問合せに以下のSELECT文を記述します。

select 0 as id,
mdsys.sdo_util.from_geojson( to_clob( :P8_CIRCLE_GEOJSON )) as geometry
from sys.dual
where :P8_CIRCLE_GEOJSON is not null

送信するページ・アイテムP8_CIRCLE_GEOJSONを指定します。


列のマッピングジオメトリ列のデータ型SDO_GEOMETRYを選択し、ジオメトリ列GEOMETRYとします。主キー列IDを選択します。外観塗りつぶしの色にベージュ#d8aa12を指定し、塗りつぶしの不透明度は .2 とします。


以上で完了です。ページを実行して記事の最初にあるGIF動画のような動作を確認してみましょう。

索引がある最初の記事はこちらになります。