Получите информацию из нескольких слоев, используя метод forEachFeatureAtPixel

#javascript #openlayers

Вопрос:

Я хочу получить информацию из нескольких слоев, я использую метод forEachFeatureAtPixel, но когда я получаю результаты, я получаю только первый результат, Когда в ответе браузера я вижу, что возвращаемый JSON имеет больше результатов. Когда я использовал метод getFeaturesAtPixel, я получил все результаты через цикл FOR. Но теперь я не знаю, как получить все результаты.

 map.on("click", function (evt) {  var result = map.forEachFeatureAtPixel(evt.pixel, function (feature, layer) {  return { feature, layer };  });  if (result) {  var feature = result.feature;  var layer = result.layer;  if (layer === vec01) {  contINFO.innerHTML = 'lt;bgt;One name:'   feature.get('one_name')   'lt;bgt;'  }else if (layer === vec02) {  contINFO.innerHTML = 'lt;bgt;Other name:'   feature.get('other_name')   'lt;/bgt;lt;bgt;Percent: '   feature.get('percent')   'lt;/bgt;'  }  } });  

Ответ №1:

Возврат любого истинного значения в обратном вызове остановит обнаружение при первой функции. Чтобы получить все функции, не возвращайте значение и создавайте результаты для каждой функции

 const info1 = document.getElementById("info1"); map.on("click", function (evt) {  var info1Count = 0;  var contCount = 0;  map.forEachFeatureAtPixel(evt.pixel, function (feature, layer) {  var info1HTML = '';  var contHTML = '';  if (layer === vec01) {  info1HTML = JSON.stringify(  Object.entries(feature.getProperties()).filter(function (entry) {  return entry[0] !== "geometry";  })  );  contHTML = 'lt;bgt;One name: '   feature.get('one_name')   'lt;bgt;'  }else if (layer === vec02) {  info1HTML = JSON.stringify(  Object.entries(feature.getProperties()).filter(function (entry) {  return entry[0] !== "geometry";  })  );  contHTML = 'lt;bgt;Other name:'   feature.get('other_name')   'lt;/bgt;lt;bgt;Percent: '   feature.get('percent')   'lt;/bgt;'  }  if (info1HTML != '') {  if (info1Count == 0) {  info1.innerHTML = '';  } else {  info1.innerHTML  = 'lt;brgt;';  }  info1.innerHTML  = info1HTML;  info1Count   ;  }  if (contHTML != '') {  if (contCount == 0) {  contINFO.innerHTML = '';  } else {  contINFO.innerHTML  = 'lt;brgt;';  }  contINFO.innerHTML  = contHTML ;  contCount  ;  }  }); });  

Комментарии:

1. эффективно накапливая результаты. Как бы я должен был сделать так, чтобы каждый раз, когда вы нажимаете, он удалял предыдущий результат и выдавал новые? в конце концов, я прошу информацию с другой точки зрения.

2. Привет @Майк, могу ли я использовать это с WMS?

3. @Ivan Slaughter forEachFeatureAtPixel работает только для векторных объектов

4. @user68481 Очистите результат перед добавлением первой строки, добавьте разрыв строки для последующих строк в том же пикселе. Или вы можете безоговорочно сбросить оба сразу после щелчка. Я обновил ответ.