为什么我使用 OpenLayers 在两个弹出窗口中获得相同的文本

2024-02-19

我正在使用 OpenLLayers 5。我将经度、纬度和汽车名称保存在数据库中的数组中。我可以显示两个标记(我的数组目前只有两个索引)。每个标记都有一个弹出窗口,其中应包含其名称、经度、纬度。例如,第一个标记的弹出窗口将汽车 1 作为文本。在我的例子中,汽车名称是 vehName。 我总是在两个弹出窗口上显示第二辆车的信息(这是我的数组的最后一个索引)。 有人可以帮我找到解决方案吗?

/* open street map newest version */
var map = new ol.Map({
    target: 'map', // the div id
    layers: [
        new ol.layer.Tile({
        source: new ol.source.OSM()
        })
    ],
    view: new ol.View({ 
        center: ol.proj.fromLonLat([4.35247, 52.520008]),
        zoom: 6,
        minZoom: 3
    })
});
for(var i=0; i < arrayPos.length; i++) {
    var long = arrayPos[i][0]
    var lat = arrayPos[i][1];
    var vehName = arrayPos[i][2];
    var batterCharge = arrayPos[i][3];
    console.log(batterCharge);
    // add a marker to the map
    var layer = new ol.layer.Vector({
        source: new ol.source.Vector({
            features: [
                new ol.Feature({
                    geometry: new ol.geom.Point(ol.proj.fromLonLat([long, lat]))
                })  
            ]
        })
    });
    layer.setStyle(new ol.style.Style({
        image: new ol.style.Icon({
        src: 'https://wiki.openstreetmap.org/w/images/0/0c/Hgv.png', //
        scale: 0.4 // set the size of the vehicle on the map
        })
    }));
    map.addLayer(layer);
    //initialize the popup
    var container = document.getElementById('popup');
    var content = document.getElementById('popup-content');

    var overlay = new ol.Overlay({
        element: container,
        autoPan: true,
        autoPanAnimation: {
            duration: 250
        }
    });
    map.addOverlay(overlay);

    //display the pop with on mouse over event
    map.on('pointermove', function (event) {
        if (map.hasFeatureAtPixel(event.pixel) === true) {  
            var coordinate = event.coordinate;
            //simple text written in the popup, values are just of the second index
            content.innerHTML = vehName+'<br><b>Batteriestatus: </b>'+batterCharge;//just the second one is getting displayed
            overlay.setPosition(coordinate);
        }
        else {
            overlay.setPosition(undefined);
        }
    });
}

编辑版! 但仍然无法正常工作! 有任何想法吗?

for(var i=0; i < arrayPos.length; i++) {
    //infos
    var long = arrayPos[i][0]
    var lat = arrayPos[i][1];
    var vehName = arrayPos[i][2];
    var batteryCharge = arrayPos[i][3];
    
    //create a feature
    var feature = new new ol.Feature({
        geometry: new ol.geom.Point(ol.proj.fromLonLat([long, lat]))
    })
    feature.set('batteryCharge', batteryCharge);
    vectorSource.add(feature);
}   
// add a marker to the map
var vectorSource = new ol.source.VectorSource();
var layer = new ol.layer.Vector({
    source: vectorSource({
        features: [feature]
    })
});

layer.setStyle(new ol.style.Style({
    image: new ol.style.Icon({
    src: 'https://wiki.openstreetmap.org/w/images/0/0c/Hgv.png', //
    scale: 0.4 // set the size of the vehicle on the map
    })
}));
map.addLayer(layer);

//initialize the popup
var container = document.getElementById('popup');
var content = document.getElementById('popup-content');

var overlay = new ol.Overlay({
    element: container,
    autoPan: true,
    autoPanAnimation: {
        duration: 250
    }
});
map.addOverlay(overlay);

//display the pop with on mouse over event
map.on('pointermove', function (event) {
    if (map.hasFeatureAtPixel(event.pixel) === true) {  
        var coordinate = event.coordinate;
        const features = event.target.getFeatures();
        const batteryCharge  = features.get(0).get('batteryCharge');

        //simple text written in the popup, values are just of the second index
        content.innerHTML = event.traget+'<br><b>Batteriestatus: </b>'+batteryCharge;
        overlay.setPosition(coordinate);
    }
    else {
        overlay.setPosition(undefined);
    }
});

您正在循环中创建并覆盖图层和叠加层。 通常,您在循环外部创建矢量图层和矢量源,然后在创建要素的循环中,只需将它们添加到矢量源即可。 您还应该将电池充电信息等存储为功能中的属性,以便您可以通过 event.target 访问它们。 你还可以使用对于每个特征在像素 https://openlayersbook.github.io/ch08-interacting-with-your-map/example-03.html

Edit:// 这是 for 循环的示例。 Source是也在外部声明的vectorSource

for(var i=0; i < arrayPos.length; i++) {
    const long = arrayPos[i][0]
    const lat = arrayPos[i][1];
    const vehName = arrayPos[i][2];
    const batterCharge = arrayPos[i][3];
    console.log(batterCharge);
    
    var feature = new new ol.Feature({
        geometry: new ol.geom.Point(ol.proj.fromLonLat([long, lat]))
    }) 
    feature.set('batteryCharge', batterCharge)
    source.add(feature)

}

还有您的活动:

  //display the pop with on mouse over event
    map.on('pointermove', function (event) {
        if (map.hasFeatureAtPixel(event.pixel) === true) {  
            var coordinate = event.coordinate;
            const features = event.target.getFeatures()
            const batterCharge  = features.get(0).get('batteryCharge')
            //simple text written in the popup, values are just of the second index
            content.innerHTML = event.traget+'<br><b>Batteriestatus: </b>'+batterCharge;//just the second one is getting displayed
            overlay.setPosition(coordinate);
        }
        else {
            overlay.setPosition(undefined);
        }
    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我使用 OpenLayers 在两个弹出窗口中获得相同的文本 的相关文章

  • 在 ajax 完成之前阻止提交

    我正在使用 jQuery 并且我希望在所有 ajax 调用完成之前表单提交不会起作用 我想到的一种方法是存储一个布尔值 该值指示是否有 ajax 请求正在进行 在每一个结束时它都会被设置为 false 我不确定这是否是最好的方法 所以我将不
  • 主干关系事件未触发?

    class TheModel extends Backbone RelationalModel relations type Backbone HasMany key subModels relatedModel SubModel coll
  • ReferenceError:找不到变量:需要

    我在加载时遇到问题node modules到我的网页之一 我已经安装了 npm node js 并且我想使用require 函数在我的网站上初始化 Firebase 我不知道为什么 但它抛出引用错误 ReferenceError 找不到变量
  • 无法显示由 Fine-uploader 上传到 Amazon s3 的图像

    我现在尝试设置fineuploader s3以显示在aws服务器上成功上传的文件的图像 如示例页面上所做的那样 http fineuploader com s3 demo http fineuploader com s3 demo 我 仍然
  • 请解释与 Google Chrome 扩展程序的后台通信

    我已经阅读并重新阅读了此页面 并运行了示例 http code google com chrome extensions background pages html http code google com chrome extension
  • Ext JS - 如何滚动到文本区域的底部

    这是我下面的代码 如何滚动到文本区域的底部 它一定是类似的东西 Ext getCmp output setScrollPosition Ext getCmp output getScrollHeight 这是我的文本区域代码 var myW
  • 限制文本区域中每行的字符数

    我整个周末都在寻找解决这个难题的方法 但尚未找到一个可以正常工作的解决方案 我想要实现的是限制文本区域中每行的字符数 不是相同地限制它们 而是我选择的每行不同的字符数 例如 我只想在我的文本区域中包含 4 行 第 1 2 和 3 行将限制为
  • 使用模态表单 ajax 超出 HTMLFormElement.toString 的最大调用堆栈大小

    我想使用模态窗口中的 ajax 请求提交表单 单击此链接可打开该模式 a class btn btn primary i class fa fa edit i Write a review a 模态窗口 div class modal fa
  • ElectronJS ReferenceError:导航器未定义

    我正在尝试在电子上制作自定义标题栏 但是当我启动我的应用程序时 我遇到了 ReferenceError 导航器未定义 问题 请帮忙 这是我的 main js 中的代码片段 My Codes https i stack imgur com c
  • 使react-leaflet能够离线使用

    我一直在使用反应传单 https github com PaulLeCam react leaflet图书馆 到目前为止运作良好 现在我希望网站预加载尽可能多的图块 以便网络应用程序 也是 PWA 可以在没有互联网的情况下使用 我找到了一些
  • iframe 重新加载按钮

    我浏览了很多网站 但似乎没有一个能正常工作 或者我不明白它们 我想要一个刷新某个 iframe 的简单按钮 该按钮将位于父页面上 并且 iframe 名称为 Right 有很多方法可以做到这一点 假设这个iframe markup 我们可以
  • v-file-input .click() 不是函数

    我试图以编程方式触发 v file input 的 click 事件 因为它在 Vuetify 的文档中 但它显示一个错误this refs imagePicker click is not a function我在这里错过了什么吗 代码重
  • KeyboardEvent.keyCode 已弃用。这在实践中意味着什么?

    根据 MDN 我们绝对应该not正在使用 keyCode财产 它已被弃用 https developer mozilla org en US docs Web API KeyboardEvent keyCode https develope
  • 使用 jquery 将字符串数组转换为整数

    我正在尝试将 jquery 中的字符串数组转换为整数数组 这是我的尝试 var cdata data values split each cdata function i l l parseInt l 我认为在这种情况下你不需要使用 Jqu
  • Jquery,清除/清空 tbody 元素的所有内容?

    我认为这会相当简单 但似乎空方法无法清除我拥有的 tbody 如果有人知道执行此操作的正确方法 我将不胜感激 我只想删除 tbody 中包含的所有内容 到目前为止我正在尝试 tbodyid empty HTML table tbody tr
  • window.showModalDialog 的等效跨浏览器解决方案是什么?

    window showModalDialog 的等效跨浏览器解决方案有哪些 showModalDialog 在 IE 和 FF 3 中引入 我个人认为没有 但是有很多 UI 工具包提供了这样的功能 例如jQuery UI http jque
  • Jquery:选择菜单以显示和隐藏某些div元素

    我正在创建一个选择菜单 根据所选选项显示和隐藏某些 div 像这样的东西
  • 替换两个引号之间的字符串

    我想转动一根绳子str hello my name is michael what s your s into hello my name is span class name michael span 我怎样才能在 JavaScript
  • Express.js Passport认证自动失败跳过策略

    UPDATE 我已将代码从护照本地注册内部移至单独的处理程序 并且运行良好 问题在于 Passport 和本地注册的使用 但我不知道为什么 我使用 Node js Express Passport 进行身份验证和注册设置 这是以前使用过的标
  • 如何调试 Gulp 任务?

    如何调试我的中定义的 gulp 任务gulpfile js使用诸如 Google Chrome 调试器之类的调试器逐行单步执行任务的代码 对于 Node js 6 3 版本 您可以使用 inspect flag https nodejs o

随机推荐

  • 如何获取CodeAttribute中的属性值

    我写了一个方法来按属性获取属性值 public string GetAttributeValueByNameAttributeAndProperty CodeClass cc string nameAttribute string name
  • 如何在 Jenkins 的 url 中传递 credentialID

    我正在使用这个命令 sh git push https userid passwd innersource com scm raghu demo git 但我想使用 credentialsId f0079d43 9522 4133 9601
  • 在 Ruby 中冻结变量不起作用 [重复]

    这个问题在这里已经有答案了 我正在学习 Ruby 并且在使用时发现了有趣的行为Object freeze带变量的方法 在我冻结一个变量之后 或者Fixnum or Array 我还是可以修改的 这很奇怪 因为就我而言 这不应该发生 而且Ty
  • Pandas 通过正则表达式读取带有字符串分隔符的 CSV

    我正在尝试将格式奇怪的文本文件导入到 pandas DataFrame 中 下面是两个示例行 LOADED LANE 1 MAT TYPE 2 LEFFECT 1 SPAN 200 SPACE 10 BETA 3 474 LOADEFFEC
  • Javascript:用另一个函数重新分配一个函数

    假设我有这两个功能 function fnChanger fn fn function sys print Changed function foo sys print Unchanged 现在 如果我打电话foo I see Unchan
  • PHP“未选择数据库”

    我最近开始用 PHP 创建一个网站 我的大部分代码都可以工作 但是我发现了一个无法纠正的问题 我有一个页面 其中有很多对数据库的调用 在我的页面顶部 我正在连接并使用 SELECT 来获取有关相关产品的一些信息 在页面底部 我再次连接以获取
  • 如何使用 Zend Framework 2 中的插件渲染自定义视图

    我正在开发一个应用程序 需要在流程完成后发送电子邮件 由于电子邮件需要是 HTML 我有一个好主意 将视图渲染为电子邮件消息正文 以便我可以实现 单击此处在浏览器上查看此内容 功能 这一切都在实现 AbstractRestfulContro
  • 如何用 Maven 属性替换 web.xml 中的值?

    我有一个 Maven 项目 它将一些测试文件下载到其构建目录中 target files 然后 这些文件应该可供 servlet 使用 我可以通过将完整路径硬编码为
  • 如何跳过HTTP请求的AngularJS拦截器?

    我有一个 angularjs 应用程序 其中有一个拦截器 它将授权令牌添加到每个请求的标头中 然而 在应用程序的某个地方 我需要使用外部 API 拦截器会破坏它 因为它添加了这个外部 API 提供者不接受的授权标头 如何让 angularj
  • VS2013 Windows服务-如何制作安装程序?

    我写了一个Windows服务 我现在想将其打包到安装程序中 我使用了 VS2013 x86 Native Tools 命令提示符 然后使用了以下命令 要安装它 installutil httpapiservice exe 要卸载它 inst
  • 启动Spring Boot应用程序时liquibase的问题

    我有一个Spring Boot申请与liquibase 第一次我创建表格没有问题 但当我再次启动时 我遇到了无法解决的问题 这是error Error starting ApplicationContext To display the c
  • 读取外部网页的内容并获取特定元素[重复]

    这个问题在这里已经有答案了 可能的重复 如何用PHP解析和处理HTML https stackoverflow com questions 3577641 how to parse and process html with php 我已经
  • 如何确保我使用的是“服务器”JVM?

    Sun 的 JVM 有两种风格 client and server 其中服务器 VM 应针对长时间运行的进程进行优化 建议用于服务器应用程序 当我跑步时java如果没有参数 它会显示使用选项 其中包括以下文本 The default VM
  • 减小 EPS 格式的绘图大小

    我有一个包含数百个项目的直方图 我为其绘制了 Q Q 图 这导致 EPS 大小为 2 5 兆字节 对于仅包含在出版物中并且不会以 100 倍放大倍率查看的图形来说 这太大了 R 中是否有任何选项可以以某种方式输出较小的 EPS 我搜索过文档
  • 无法在任何地方运行 jupyter(终端、anaconda 分发器)Mac os 10.12.6

    我在终端中运行 jupyter 时遇到问题 运行后终端显示什么 maxim MacBook Pro Maxim jupyter notebook Traceback most recent call last File Library Fr
  • 如何在C#中获取Windows面板控件中的Keypress事件

    我想在 C 中的 Windows 面板控件中获取按键事件 对我有帮助吗 你应该处理面板按键 http msdn microsoft com en us library system windows forms panel keypress
  • 弹簧形式:输入数字

    我正在使用 Spring 的 form input 如下
  • VS 扩展中未处理的异常

    我尝试为自定义文件定义创建语法突出显示 加载时出现异常 我已将 log 参数添加到 devenv 以获取日志 335 ERROR System Exception Duplicate EditorFormatDefinition expor
  • Python 中 OLS 的 Newey-West 标准错误?

    我想要一个系数和与之相关的 Newey West 标准误差 我正在寻找可以执行以下 R 代码正在执行的操作的 Python 库 理想情况下 但任何可行的解决方案都可以 library sandwich library lmtest a lt
  • 为什么我使用 OpenLayers 在两个弹出窗口中获得相同的文本

    我正在使用 OpenLLayers 5 我将经度 纬度和汽车名称保存在数据库中的数组中 我可以显示两个标记 我的数组目前只有两个索引 每个标记都有一个弹出窗口 其中应包含其名称 经度 纬度 例如 第一个标记的弹出窗口将汽车 1 作为文本 在