【问题标题】:Change Leaflet marker icon with data from external geoJSON file使用来自外部 geoJSON 文件的数据更改传单标记图标
【发布时间】:2021-02-17 20:11:30
【问题描述】:

我在更改传单地图上的 geoJSON 数据图标时遇到问题。

我正在从外部 geoJSON 文件加载我的数据。因此,我使用XMLHttpRequest() 打开文件(文件名存储在数组orteDB 中),然后将它们添加到我的图层orte,然后将其添加到地图中:

for (var i = 0; i < orteDB.length; i++) {
    let xhr = new XMLHttpRequest();
    xhr.open('GET', 'files/geoJSONfiles/orte/' + orteDB[i]);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.responseType = 'json';
    xhr.onload = function () {
        if (xhr.status !== 200) return
        L.geoJSON(xhr.response).addTo(orte).on('click', onClick);
    };
    xhr.send();
}

orte = L.geoJson(orte).addTo(map);

借助此示例https://gist.github.com/geog4046instructor/80ee78db60862ede74eacba220809b64,我已经设法更改了默认图标。但我真正想要的是在单击按钮或标记本身到此redIcon 后动态更改的图标:

var redIcon = L.Icon.extend({
        iconUrl: 'files/marker-icon_red.png',
        iconSize:     [25, 41],
        iconAnchor:   [12, 40],
    });

我也尝试过使用 pointToLayer() 函数,但它对我不起作用。

每个 geoJSON 点都有一个唯一的 ID,我可以通过 e.layer.feature.properties.id 调用它。所以最后我想通过使用它的唯一 ID 来单独更改标记图标。

我的 geoGSON 文件如下所示:

{
 "type": "FeatureCollection",
 "name": "02_Roncesvalles",
 "features": [
  { 
   "type": "Feature", 
   "properties": 
     { 
      "id": 2 }, 
   "geometry": 
     { 
      "type":"Point", 
      "coordinates": [ 
        -1.320700314538876, 
        43.009378247303687 ] 
     } 
   }
  ]
}

非常感谢您的帮助!

【问题讨论】:

    标签: javascript leaflet icons geojson marker


    【解决方案1】:

    您可以使用marker.setIcon(icon) 更改标记的图标,并且您需要遍历所有层并在id 上找到正确的层。

    我使用map.eachLayer 而不是orte.eachLayer(),因为GeoJSON Group 也可以包含LayerGroups。

    var wantedId = 1;
    map.eachLayer((layer)=>{
       if(layer instanceof L.Marker && layer.feature && layer.feature.properties && layer.feature.properties.id == wantedId){
          layer.setIcon(new redIcon());
       }
    });
    

    更新

    感谢@ghybs,我没认出图标的extend

    如果您想扩展图标类,您需要将选项放在options 属性中。

    var redIcon = L.Icon.extend({
       options: {
            iconUrl: 'files/marker-icon_red.png',
            iconSize:     [25, 41],
            iconAnchor:   [12, 40],
       }
    });
    

    然后你可以用marker.setIcon(new redIcon())改变图标

    但我建议你简单地创建一个 Icon 变量而不是创建一个新类。

    var redIcon = L.icon({
            iconUrl: 'files/marker-icon_red.png',
            iconSize:     [25, 41],
            iconAnchor:   [12, 40],
        });
    

    然后拨打marker.setIcon(redIcon)

    【讨论】:

    • 感谢您的帮助!当我尝试时,我总是得到Uncaught TypeError: layer.setIcon is not a function。你知道为什么会这样吗?
    • @ELonMask:您的 GeoJSON 数据中很可能有非点类型的特征。分享具有代表性的数据样本将有助于提供更相关的答案。
    • @ELonMask 我在 if 中添加了layer instanceof L.Marker,那么它应该可以工作
    • @FalkeDesign 谢谢。不幸的是layer instanceof L.Marker 不起作用,我现在收到错误t.icon.createIcon is not a function。 @ghybs 我添加了我的 geoJSON 文件的示例。我认为它并没有真正被识别为标记/点,所以它不会改变图标。
    • @ELonMask 看看这个例子:jsfiddle.net/falkedesign/n5veb63L 它就像我描述的那样工作
    猜你喜欢
    • 2019-09-02
    • 1970-01-01
    • 2022-07-11
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    相关资源
    最近更新 更多