いくつかのコンポーネントでは、ユーザがマップ上のフィーチャを対話的に選択することができます。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
}
}