【问题标题】:show popups correctly with external hyperlinks in openlayers 4在 openlayers 4 中正确显示带有外部超链接的弹出窗口
【发布时间】:2018-01-15 22:42:48
【问题描述】:

我有一个 openlayers 地图,它加载了几个 kml 文件,每个文件包含大约 120 个多边形地标。由于它们太多,无法为每个显示弹出窗口,我不得不创建一个外部地图菜单,以便用户可以单击其中任何一个功能并查看它的信息/位置。

我使用这个函数来创建包含所有功能的外部地图菜单:

        vEnergeticos.getSource().on('change', function(evt){
            var source = evt.target;
            if (source.getState() === 'ready') {
                var energeticos = source.getFeatures();
                for (var i in energeticos) {
                    var figura = energeticos[i].getGeometry().getExtent();
                    var myCenter = ol.extent.getCenter(figura);
                    $("#containerLeft").append("<a href=javascript:showMenuPopup(" + myCenter + "," + energeticos[i].get('ID') + ")>" + energeticos[i].get('name') + "</a><br>");
                }
            }
        });

然后当用户点击这些选项中的任何一个时,就会调用这个函数:

        function showMenuPopup(xx, yy, theID){
            var myPixel = map.getPixelFromCoordinate([xx, yy]);
            var elNombre = "";
            var laDescripcion = "";
            map.forEachFeatureAtPixel(myPixel, function(feature, layer) {
                if (feature.get('ID') == theID){
                    elNombre = feature.get('name');
                    laDescripcion = feature.get('description');
                }
            });

            popupTitle.innerHTML = elNombre;
            popupContent.innerHTML = laDescripcion;
            overlay.setPosition([xx,yy]);
        }

这在某些情况下有效,但是,当所选要素位于当前地图视图之外时,地图会成功重新定位 (overlay.setPosition([xx,yy]);),会显示弹出窗口,但是弹出窗口是空的。如果当用户从左侧菜单中单击时该功能可见,则弹出窗口正确显示。

为了清楚起见,假设您正在查看可以看到欧洲部分地区的地图,然后单击位于加拿大的某个项目(使用地图外菜单),您会看到地图重新定位在加拿大,但显示的弹出窗口是空的。如果您再次单击同一个地图外链接,或在该位置/缩放视图中可见的任何其他功能,则弹出窗口将正确显示。

我尝试使用“moveend (ol.MapEvent)”来解决此问题,因此在重新定位地图后加载了弹出窗口,但它对我不起作用。 moveend 事件是在地图开始移动之前使用 overlay.setPosition([xx,yy]) 调用的,但我找不到其他可以使用的“重定位后”事件。

我已经为此苦苦挣扎了很多天,所以任何帮助都将不胜感激。

问候!!

【问题讨论】:

    标签: javascript html openlayers kml


    【解决方案1】:

    问题是当前地图视图之外的特征不是“AtPixel”,所以你不会用 map.forEachFeatureAtPixel 捕捉它们。

    我建议您避免将坐标传递给 showMenuPopup:您只需要功能 ID,就可以在 showMenuPopup 中检索功能的坐标。

    $("#containerLeft").append("<a href=javascript:showMenuPopup('" + energeticos[i].getId() + "')>" + energeticos[i].get('name') + "</a><br>");
    

    然后

    function showMenuPopup(featureId){
        var feature = vEnergeticos.getSource().getFeatureById(featureId);
        var elNombre = feature.get('name');
        var laDescripcion = feature.get('description');
        var figura = feature.getGeometry().getExtent();
        var myCenter = ol.extent.getCenter(figura);
    
        popupTitle.innerHTML = elNombre;
        popupContent.innerHTML = laDescripcion;
        overlay.setPosition(myCenter);
    }
    

    【讨论】:

    • 这完全有道理!!因为我的文件被删除了,我没有早点回复,4 周的编码已经过去了。我实际上是在尝试恢复我的文件,以便测试您所说的内容,否则,我将不得不从头开始,并且最终肯定会达到这一点。我已经开发了 18 年,这是我第一次丢失文件(某些病毒攻击了我的计算机)。我确实有3周前的备份,无论如何,非常感谢您的回答,我会尽快测试它!
    • 我的问题是 energyos[i].getId() 返回“未定义”。这些 ID 是自动生成的吗?或者我应该在 kml 文件中添加一个 ID 标签? feature.get('ID') 也返回“未定义”。 (其实我已经在kml文件中添加了一个ID标签,但是feature.get('ID')没有得到它。
    • feature.getId() 应该返回一个“特征的稳定标识符”,由 openlayers 自动生成(参见 openlayers.org/en/latest/apidoc/ol.Feature.html ),而 feature.get('ID') 应该返回读取的 ID 属性来自您的 kml 文件。
    • 我没有得到任何 ID,使用这两种方法,我在 kml 文件的每个地标上都有一个 someNumber 标签。我所做的是像这样在地标标签中添加ID: 所以现在 feature.getId() 返回一个ID,但它是kml文件中指定的ID,所以我有点对这些 ID 的行为感到困惑。无论如何,它现在就像一个魅力,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多