循环传单FeatureGroup

时间:2017-03-30 18:39:39

标签: javascript loops foreach leaflet overlap

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

这是我的专题小组:

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

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

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    |
|_________________________|

2 个答案:

答案 0 :(得分:1)

e.layer只会获得完全点击的图层/功能,点击不会传播"下面的图层,即使它们也可以覆盖那个确切的位置。这就是为什么你只获得最近添加的组数据(即高中)。

此外,您要在fGroup的每一层上循环,但不要对每个子layer执行任何特定操作,这实际上是您的3个GeoJSON图层gorup。因此,您将收到3条带有相同消息的警报。

相反,您只需获取点击的位置(e.latlng)并循环浏览每个单独的图层/要素,以确定此图层是否包含该位置。

请参阅Leaflet event how to propagate to overlapping layers

答案 1 :(得分:0)

我猜你有几个功能组,每个功能组只涉及一个三联学校。

你很亲密。如果我理解正确,你需要的是:

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);
});

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

修改

我仍然不知道如何检索geojson内容。例如,eLayer包含一所或几所学校?以下内容仅适用于每个* Layer仅包含一个学校的情况。否则,如果它们包含多个功能,我看不出如何在eLayer功能之一和mLayer之间建立关联......

void print_the_file()
{
    FILE* file_hndl = fopen("my_bin_file.bin", "rb");
    if (file_hndl == NULL)
    {
        printf("file open failed");
    }
    else
    {
        while (!feof(file_hndl) && !ferror(file_hndl))
        {
            int c = fgetc(file_hndl);
            if (c != EOF) /* should be redundant */
            {
                printf("%02x", c);
            }
        }
        fclose(file_hndl);
    }
}