#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 Очистите результат перед добавлением первой строки, добавьте разрыв строки для последующих строк в том же пикселе. Или вы можете безоговорочно сбросить оба сразу после щелчка. Я обновил ответ.