循环传单FeatureGroup

Loop through leaflet FeatureGroup

我有一张地图,其中包含 3 个代表学区边界的 geoJson 图层。我需要的功能很简单:单击地图,弹出每个级别(小学、初中和高中)的学校名称。[eLayer,mLayer,hLayer]

这是我的功能组:

var fGroup = new L.featureGroup([eLayer,mLayer,hLayer]).addTo(map);

我想我可以使用带有单击事件的 eachLayer 方法来获取该位置每个多边形的学校名称。下面的代码让我很接近。

fGroup.on('click',function(e){
    fGroup.eachLayer(function(layer){
        alert(e.layer.feature.properties.School);
    });
});

我只得到最后添加的geoJson层的名称,在本例中是高中。我是一名新手程序员,但我已经研究了好几天了,我发现了一个例子,它有点像一个建议,但他们的解决方案实际上并没有奏效。

为了完全清楚,我希望我的输出如下所示。

___________________________
|                         |
|Lincoln Elementary School|
|Tubman Middle School     |
|Frederick High School    |
|_________________________|

我猜你有几个特征组,每个特征组只涉及三组学校。

你很接近。如果我理解正确的话,你需要的是:

fGroup.on('click',function(e){
    var txt = '';
    fGroup.eachLayer(function(layer){
        txt = txt + layer.feature.properties.School + ' ; ';
    });
    alert(txt);
});

单击组会生成一个包含三个名称的警报。

编辑

我还是不明白你是如何检索 geojson 内容的。例如,eLayer 包含一所学校或几所学校?以下内容仅在您的每个 *Layer 仅包含一所学校时才有效。否则,如果它们包含多个功能,我看不出如何在 eLayer 功能之一和 mLayer 之一之间建立关联...

var txt = '';
var eLayer = L.geoJson(ejsoncontent, {
    onEachFeature: function(feature, layer){
      txt = txt + feature.properties.School;
    }
});
var mLayer = L.geoJson(mjsoncontent, {
    onEachFeature: function(feature, layer){
      txt = txt + ' ; ' + feature.properties.School;
    }
});
var hLayer = L.geoJson(hjsoncontent, {
    onEachFeature: function(feature, layer){
      txt = txt + ' ; ' + feature.properties.School;
    }
});

var fGroup = new L.featureGroup([eLayer,mLayer,hLayer]).addTo(map);
fGroup.on('click',function(e){
    alert(txt);
});

e.layer 只会为您提供精确点击的图层/要素,点击不会 "propagate" 到下方的图层,即使它们也可能覆盖该确切位置。这就是为什么您只获得最近添加的组数据(即高中)。

此外,您在 fGroup 的每一层上循环,但不要对每个子 layer 做任何特定的事情,它们实际上是您的 3 个 GeoJSON 层组。因此,您会收到 3 个包含相同消息的警报。

相反,您应该简单地获取单击的位置 (e.latlng) 并遍历每个单独的层/特征以确定该层是否包含该位置。