選択情報を操作する

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