いくつかのコンポーネントでは、ユーザがマップ上のフィーチャを対話的に選択することができます。Infrastructure Map Server は、必要に応じてマップ イメージを現在の選択情報で更新しますが、選択されたフィーチャの属性をユーザに表示することはしません。それはアプリケーションの役目です。
フィーチャの選択方法に関係なく、Map コンポーネントはアプリケーションがユーザの選択情報を取得したり操作するための API を提供しています。アプリケーションは、ユーザの選択情報が変更されたことを知るために、次の 2 つのイベントを使用できます。
アプリケーションは、Map コンポーネントから MAP_SELECTION_ON イベントを受け取ると、次の関数を使用して選択情報を操作できます。
例として、「サンプル 2: 選択」を参照してください。
アプリケーションは、通常は MAP_SELECTION_ON イベントに応答して getSelection() を呼び出します。この代表的なコードは次のとおりです。
window.onload=function() { // ... Fusion.registerForEvent( Fusion.Event.FUSION_ERROR, fusionError); Fusion.registerForEvent( Fusion.Event.FUSION_INITIALIZED, fusionInitialized); Fusion.initialize(); } var theMap; function fusionInitialized() { theMap = Fusion.getWidgetById('Map'); theMap.registerForEvent(Fusion.Event.MAP_SELECTION_ON, OpenLayers.Function.bind(this.selectionOn, this)); theMap.registerForEvent(Fusion.Event.MAP_SELECTION_OFF, OpenLayers.Function.bind(this.selectionOff, this)); } function selectionOn() { //a new selection has been made, request it theMap.getSelection(displaySelection); } function displaySelection(selection) { //display the selection to the user in some way ... } function selectionOff() { //clear the selection results }
コールバック ルーチンに渡されるパラメータは、1 つ以上のマップからの選択内容が含まれる関連性のある配列です。ほとんどの場合、配列内には 1 つの要素があり、メイン マップのための Selection オブジェクトを備えています。この Selection オブジェクトは次の API を提供します。
アプリケーションは、通常は選択範囲内の複数の画層を越えてループし、getLayer() または getLayerByName() によって返される Layer Selection オブジェクトを使用して、個々の結果を取得します。Layer Selection オブジェクトに次の API があります。
次のコードは、Selection オブジェクトや Layer Selection オブジェクトを使用して、選択されたフィーチャを表形式で表示する方法の例を示しています。
function displaySelection(multiSelection) { var theMap = Fusion.getWidgetById("Map"); if (!theMap.hasSelection()) { alert("Nothing selected"); return; } var selection = multiSelection[theMap.getMapName()]; //display the selection to the user in some way ... //make sure something got selected ... if (selection && selection.getNumLayers() > 0) { //obtain a reference to the HTML Element that the results //will be placed in var resultElm = $('selectionResultDiv'); resultElm.innerHTML = ''; for (var i=0; i<selection.getNumLayers(); i++) { var selectionLayer = selection.getLayer(i); var propNames = selectionLayer.getPropertyNames(); var span = document.createElement('span'); span.className = 'selectionResultsTitle'; span.innerHTML = 'Layer ' + selectionLayer.getName(); resultElm.appendChild(span); var table = document.createElement('table'); table.className = 'selectionResultsTable'; resultElm.appendChild(table); //set up the table header to be the property names var thead = document.createElement('thead'); table.appendChild(thead); var tr = document.createElement('tr'); thead.appendChild(tr); for (var j=0; j<propNames.length; j++) { var td = document.createElement('td'); td.innerHTML = propNames[j]; tr.appendChild(td); } //output the selection values var tbody = document.createElement('tbody'); table.appendChild(tbody); for (var j=0; j<selectionLayer.getNumElements(); j++) { var tr = document.createElement('tr'); tbody.appendChild(tr); for (var k=0; k<propNames.length; k++) { var td = document.createElement('td'); td.innerHTML = selectionLayer.getElementValue(j, k); tr.appendChild(td); } } } } else { //could display a message of some sort saying nothing was //selected } }