2015-11-04 3 views
0

Я создал функцию сборщика слой:OpenLayers 2 WMSGetFeatureInfo GetFeatureInfo не выбирает функцию

// Add Feature Picker 
      featurePicker = new OpenLayers.Control.WMSGetFeatureInfo({ 
       url: "http://server01:8080/geoserver/sf/wms", 
       title: 'identify features on click', 
       layers: [layer01, 
         layer02], 
       queryVisible: true, 
       output: 'features', 
       infoFormat: 'application/json', 
       format: new OpenLayers.Format.JSON 
      }); 

      featurePicker.events.register("getfeatureinfo", this, showFeatureInfo); 

      map.addControl(featurePicker); 
      featurePicker.activate(); 

От одного слоя (layer01) он находит функцию, а из другого слоя (layer02), он не найти когда я нажимаю на функцию.

Это огонь событие showFeatureInfo при нажатии на функцию из любого слоя:

function showFeatureInfo(e) { 

      // Parse the features into an array 
      selectedFeaturesParse(e.features); 
} 

Но ни черта не возвращается при нажатии на функцию из layer02:

Другими словами jsonObject.features.length всегда равен нулю при нажатии на функцию из layer02. При нажатии на функции из layer01, jsonObject.features.length равно единице:

function selectedFeaturesParse(jsonObject) { 

      selectedFeatures = []; 

      for (var i = 0 ; i < jsonObject.features.length; i++) { 
... 
} 

У меня есть бэкенд как GeoServer и оба слоя выполнены одинаковыми. Один слой представляет собой таблицу (layer01), а другой слой представляет собой запрос sql view (layer02). Почему функции не будут найдены при нажатии на функцию из layer02? Благодарю.

ответ

0

Обнаружена проблема, которая, кажется, является ошибкой. Сначала вы определяете слой с помощью viewparams (в этом случае слой запроса «layer02» имел параметр). Затем пройти этот слой на новый объект WMSGetFeatureInfo:

// Add Feature Picker 
      featurePicker = new OpenLayers.Control.WMSGetFeatureInfo({ 
       url: "http://server01:8080/geoserver/sf/wms", 
       title: 'identify features on click', 
       layers: [layer01, 
         layer02], 
... 

Тогда вот ошибка: Когда вызов сервера выполняется, чтобы получить информацию функции, она не проходит viewparams обратно на сервер! (Несмотря на то, что вы уже определили параметр при создании слоя и передали весь слой в WMSGetFeatureInfo, и на самом деле вы можете видеть, что параметр присутствует при отладке, но он не использует его)

Вот обходной путь. (Вы должны снова определить параметры при создании объекта WMSGetFeatureInfo во время мероприятия beforegetfeatureinfo):

featurePicker.events.register("beforegetfeatureinfo", null, beforeGetFeatureInfo); 

Затем создать метод передать параметр viewparams с помощью vendorParams:

// This method is called by the picker to setup params 
function beforeGetFeatureInfo(e) 
{ 
    e.object.vendorParams = { viewparams:"username:bob" }; 
} 

ПРИМЕЧАНИЕ: Одна вещь, которая отвлекает от использования этого обходного пути, что независимо от того, какой слой вы нажимаете, он все равно передает параметр обратно на сервер. В приведенном выше примере layer01 не имеет параметра, но когда выполняется вызов сервера, он по-прежнему передает дополнительный параметр серверу. Он работает, но что-то нужно знать о том, что вы отправляете данные мусора на сервер. Если кто-то знает, как настроить событие для проверки функции щелкнутого слоя и в зависимости от того, какой уровень отправлен на сервер, только при необходимости передайте параметры просмотра на сервер и захотите показать пример, который будет отличным. Мне просто не нравится отправлять данные мусора на сервер. В любом случае описанная выше работа работает и возвращает данные с сервера для любого уровня.

Смежные вопросы