我正在尝试定义一堆像这样的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找到这些多边形吗? 或者我是否需要以不同方式定义图层/多边形才能执行此操作?
答案 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
getLayer
,L.LayerGroup
和L.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并使用它们来检索图层(多边形)。