javascript - forEachFeatureAtPixel 在不同的特征上表现不同
问题描述
单击地图上的要素时,我正在尝试添加叠加层。这工作得很好。如果有几个功能,我希望有一个显示图片日期的表格,并使不同的日期可单击以显示图像。
问题来了:我有 2 个图层添加了不同的图像/图标,但通常相同的代码正在为图层创建所有信息。当我单击第一层的图标时,一切都像预期的那样工作得很好。但是,单击第二层上的重叠图标仅显示一个日期,因此仅显示一个图像。要查看我的问题,您可以访问:https ://forestwatch.lup-umwelt.de/app_development/,打开左侧的地图层,将“Fotos”和“Drohnenbilder”添加到地图中。您将在右侧看到一堆相机符号,其行为与预期一样:无需缩放,单击堆栈将为您提供一堆日期。单击中间的无人机图像将打开覆盖,显示必须单击的单个日期(如果只有一个图像,则不应发生这种情况)。所以 - 没有自动打开,也没有带图像的表格。
这是我用于检测功能的代码:
var overlay = new ol.Overlay({
element: document.getElementById('overlay'),
positioning: 'bottom-left'
});
var displayImage = function(pixel) {
var features = [];
map.forEachFeatureAtPixel(pixel, function(feature){
features.push(feature);
},{hitTolerance: 0});
if (features.length === 1){
var imag = features[0].values_.pointAttributes.Image;
var date = features[0].values_.pointAttributes.Datum;
overlay.setPosition(features[0].values_.geometry.flatCoordinates);
var innerHTML = "<img ID=\"theImage\" src= " + imag + "><table id=\"fototable\"><tr><td><button class=\"btn\" disabled>" + date + "</button><td><tr></table>";
var element = overlay.getElement();
element.innerHTML = innerHTML;
map.addOverlay(overlay);
}else if (features.length > 1) {
var imag = [];
var date = [];
for (var i = 0, ii = features.length; i < ii; ++i) {
imag.push(features[i].values_.pointAttributes.Image);
date.push(features[i].values_.pointAttributes.Datum);
overlay.setPosition(features[i].values_.geometry.flatCoordinates);
let innerHTMLStart = "<img ID=\"theImage\" src= \"\"><table id=\"fototable\">";
let innerHTMLEnd = "</table>";
let innerHTML = innerHTMLStart;
let lastIndex = imag.length - 1;
//loop over our items
for(var i = 0; i < date.length; i++) {
//first iteration
if(i % 3 === 0 && i === 0) {
innerHTML = innerHTML + "<tr>";
//modulo 3 but not first iteration
} else if(i % 3 === 0 && i > 0) {
innerHTML = innerHTML + "</tr><tr>";
}
//add cells to the table
innerHTML = innerHTML + "<td><button class=\"btn\" data-img=" + imag[i] + " onclick=\"showImage(this);\">" + date[i] + "</button></td>";
if(i === lastIndex) {
//last iteration? how many <td>?
//always finish with 3 cells
if((i+1) % 3 === 0) {
innerHTML = innerHTML + "</tr>";
} else if((i+1) % 2 === 0) {
innerHTML = innerHTML + "<td></td></tr>";
} else {
innerHTML = innerHTML + "<td></td></tr>";
}
}
}
innerHTML = innerHTML + innerHTMLEnd;
var element = overlay.getElement();
element.innerHTML=innerHTML
;
map.addOverlay(overlay);
}
} else{
var element = overlay.getElement();
element.innerHTML = null;
overlay.setPosition(undefined);
}
};
map.on('click', function(event) {
var pixel = event.pixel;
displayImage(pixel);
});
这是创建层的代码(两个变量名相同的代码):
var FotoSource = new ol.source.Vector();
$.getJSON('config/Fotos.json', function (data) {
$.each(data, function(key, val){
var newMarker = new ol.Feature({
geometry: new ol.geom.Point([this.Longitude,this.Latitude]),
pointAttributes: {'Datum': this.Datum, 'Image':this.Name}
});
FotoSource.addFeature(newMarker);
});
});
var FotoStyle = new ol.style.Style({
image: new ol.style.Icon({
src: 'images/camera2.png',
class: "Fotoicon"
})
});
我将它们添加为新的 ol.layer.Vector,并以 Fotosource 作为源。
解决方案
推荐阅读
- mqtt - 无法将数据发布到我的本地 mqtt 服务器
- racket - 为什么球拍解释器中的“骗局”与 drracket 中的不同?
- javascript - 如何导入可能有语法错误的模块?
- c# - 给定元素时检索 XML“id”属性值
- java - Java - Excel 导入日期和数字
- python - Paramiko TypeError: from_buffer() 无法返回 str 或 unicode 或 bytearray 对象中的原始字符串的地址
- laravel - 完成选择框 Vuetify 行为到文本字段中
- json - Laravel AJAX JSON eturn 数据相关
- amazon-emr - 如何使用 cloudwatch 监控 EMR 集群是否终止
- android - 在 GLsurface 视图的情况下,bringToFront 不起作用