1.5. 图层组和图层控件

本教程将展示如何将多个层组合成一组层,以及如何使用层控件来允许用户在地图上的不同层之间轻松切换。

Show the example

1.5.1. 图层组

假设有一组层,并且希望在代码中组合并处理它们:

var littleton = L.marker([39.61, -105.02]).bindPopup('This is Littleton, CO.'),
denver    = L.marker([39.74, -104.99]).bindPopup('This is Denver, CO.'),
aurora    = L.marker([39.73, -104.8]).bindPopup('This is Aurora, CO.'),
golden    = L.marker([39.77, -105.23]).bindPopup('This is Golden, CO.');

可使用LayerGroup类执行以下操作,而不是直接将它们添加到地图:

var cities = L.layerGroup([littleton, denver, aurora, golden]);

很简单!现已有一个 cities 将城市徽标合并到一个层中的层,以便可立即在地图中添加或删除。

1.5.2. 图层控制

Leaflet是一个很好的小控件,允许用户控制他们在地图上看到的层。除了演示如何使用它之外,还将演示图层组的另一种方便用法。

有两种类型的层:

  1. 互斥的基础图层(一次只能在地图上看到一个),例如切片图层

  2. 覆盖所有放置在基础层上的层。

其他内容。在本例中,我们希望切换两个基本层(灰度和颜色基本图),以及切换和关闭一个覆盖层(先前创建的城市标记)。

现在,让我们创建基础层并将默认层添加到地图:

var grayscale = L.tileLayer(mapboxUrl, {id: 'MapID', attribution: mapboxAttribution}),
streets   = L.tileLayer(mapboxUrl, {id: 'MapID', attribution: mapboxAttribution});
var map = L.map('map', {
    center: [39.73, -104.99],
    zoom: 10,
    layers: [grayscale, cities]
});

接下来创建两个对象。一个包含基本层,一个包含覆盖层。这些只是具有键/值对的简单对象。键设置控件中的层的文本(例如“Streets”),对应的值是相反的层(例如, streets )。

var baseMaps = {
    "Grayscale": grayscale,
    "Streets": streets
};

var overlayMaps = {
    "Cities": cities
};

现在,只需创建一个Layer控件并将其添加到地图中。创建Layer控件时传递的第一个参数是基本层对象,第二个参数是Overlay对象。这两个参数都是可选的:当省略第二个参数时,只能传递基本层对象,或者如果只想传递Overlay对象,则可以将NULL作为第一个参数传递。在任何一种情况下,省略的层类型都不会出现供用户选择。

L.control.layers(baseMaps, overlayMaps).addTo(map);

请注意,我们添加了 grayscale 层和 cities 层,但没有 streets 。层控制足够智能,可以检测已添加了哪些层,并设置相应的单选按钮和复选框。

还请注意,当使用多个基本层时,只需要在实例化时将其中一个添加到地图中,但当创建Layer控件时,所有这些基本层对象都应该存在。

最后,在为层定义对象时,可以为对象的键定义样式。例如,此代码将使灰度贴图的标签变为灰色:

var baseMaps = {
"<span style='color: gray'>Grayscale</span>": grayscale,
"Streets": streets
};

现在,让我们使用一个单独的页面查看结果:./leavlet_layer_control/example.html