在Leaflet LayerGroup中查找特定图层,其中图层是多边形

时间:2015-12-16 21:58:27

标签: javascript leaflet

我正在尝试定义一堆像这样的Leaflet多边形:

var poly = new L.Polygon([
  [10.1840229, 36.8906981],
  [10.1840393, 36.8906669],
  [10.1840989, 36.8906868],
  [10.1840826, 36.890718],
  [10.1840229, 36.8906981]
], {
  'id': 'someId'
});

然后我将这些多边形分组到GroupLayer中,如下所示:

var group = new L.LayerGroup([poly1, poly2, ..., polyn]);
group.addTo(map);

我可以使用group.getLayer()通过Id找到这些多边形吗? 或者我是否需要以不同方式定义图层/多边形才能执行此操作?

2 个答案:

答案 0 :(得分:16)

Leaflet为每个图层分配自己的唯一ID:

var marker = new L.Marker(...);
console.log(marker._leaflet_id) // 24

var polygon = new L.Polygon(...);
console.log(polygon._leaflet_id) // 25

getLayerL.LayerGroupL.FeatureGroup的{​​{1}}方法将这些ID作为参数:

L.GeoJSON

您也可以轻松指定自己的ID:

var layerGroup = L.LayerGroup([marker, polygon]);

layerGroup.getLayer(24); // returns the marker
layerGroup.getLayer(25); // returns the polygon

然后像这样取出它们:

var marker = new L.Marker(...);
marker.id = 'foo';

var polygon = new L.Polygon(...);
polygon.id = 'bar';

您可以轻松地将其添加到函数中,并将其包含在var layerGroup = L.LayerGroup([marker, polygon]); layerGroup.eachLayer(function (layer) { if (layer.id === 'foo') // it's the marker if (layer.id === 'bar') // it's the polygon });

L.LayerGroup

编辑:未在示例中找到ID,直到缩进编辑。您也可以像在示例中一样将其指定为选项,并创建自定义get函数来检索图层:

L.LayerGroup.include({
    customGetLayer: function (id) {
        for (var i in this._layers) {
            if (this._layers[i].id == id) {
               return this._layers[i];
            }
        }
    }
});

var layerGroup = L.LayerGroup([marker, polygon]);

layerGroup.customGetLayer('foo'); // returns the marker
layerGroup.customGetLayer('bar'); // returns the polygon

如果您需要识别图层的类型,可以使用instanceof:

  

instanceof运算符测试对象在其原型链中是否具有构造函数的prototype属性。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof

L.LayerGroup.include({
    customGetLayer: function (id) {
        for (var i in this._layers) {
            if (this._layers[i].options.id == id) {
               return this._layers[i];
            }
        }
    }
});

var layerGroup = L.LayerGroup([marker, polygon]);

layerGroup.customGetLayer('foo'); // returns the marker
layerGroup.customGetLayer('bar'); // returns the polygon

但请记住,当您发现自己做出共同选择时,理想情况下应将这些功能放在单独的图层/功能组中。

答案 1 :(得分:2)

getLayer() method of Layer Group需要一个非常具体的ID:由Leaflet在"stamping" a layer时自动分配的ID(例如,使用myId = L.stamp(myLayer))。

因此,您将无法使用预定义的ID。

如果您可以使用动态定义的ID(即事先未知),您可以轻松记录这些ID并使用它们来检索图层(多边形)。