循环传单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
) 并遍历每个单独的层/特征以确定该层是否包含该位置。
见
我有一张地图,其中包含 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
) 并遍历每个单独的层/特征以确定该层是否包含该位置。
见