Leaflet:控件Control相關


Leaflet官方文檔中只給出了4種控件:Zoom、Attribution、Layers、Scale;它們都是繼承自Control類,具體可以參考Control

Control

Zoom、Scale、Layer、Attribution的父類

1、參數

position //Map控件的位置,只能位於Map四個角落中的一個,
//即值只能是'topleft', 'topright', 'bottomleft' , 'bottomright',
//默認是topleft左上角

 

2、方法

//子類繼承的方法
getPosition() //獲取控件位置
setPosition(position) //設置控件的位置,還是只能取參數中所說的四個值
getContainer() //返回包含了這個Control的HTMLElement
addTo(<Map>map) //把這個控件加到map上
remove() //從該空間當前活動的map上移除該控件

 

 

control.zoom

一個縮放控件;有兩個按鈕分別是放大(Zoom in)和縮小(Zoom out)。其實這個按鈕在我們創建的Map上是默認存在的,除非在通過L.map初始化Map時,把參數zoomControl設置為了false,這樣才不會顯示最初的縮放控件。

    L.control.zoom({
        position:'topright',
        zoomInTitle:'放大',
        zoomOutTitle:'縮小'
    }).addTo(leafletMap);

默認位置為左上角。如果要設置位置,可通過修改從父類Control繼承而來的屬性position設置。

 

control.attribution

一個展示Layer屬性信息文本塊的控件;這個控件是默認顯示的,除非在L.map初始化Map時,把參數attributionControl設置為了false

L.control.attribution({
    position:'bottomleft', prefix:'This is an attribution' }).addTo(leafletMap);

這時就會在Map左下角顯示出來。

 可以通過attribution動態顯示出坐標信息:

 

//暫未實現

 

control.scale

比例尺控件

    L.control.scale({
        position:'topleft', maxWidth:'100', imperial:false }).addTo(leafletMap);

參數imperial標識英制長度,默認是true,這里修改為false不讓顯示。

設置完成后,在Map左上角顯示一個比例尺scale:

 

 

control.layer

一個Layer控件,可以疊加多個Layer,可以在該控件中選擇顯示哪個。

 這個控件我認為是最高級、最炫酷、最難的一個控件了,這里多花一點篇幅細細說明。以下內容來自Leaflet官方文檔之Layer Groups and Layers Control

 

假如你有一組Map元素(Circle、Marker、Polygon等),想把它們作為一個整體加入到Layer中,而不是作為一個個單獨的元素加入。

這時你可以把它們布置到一個另外的Layer(區別於底圖的Layer,該Layer只有這些元素)中,方法是L.layerGroup( [ 元素A , 元素B , 元素C ... ] )

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.');

//把上述元素加入到一個額外的Layer cities中
var cities=L.layerGroup( [ littleton, denver, aurora, golden ] );

 

現在就有了一個citiesLayer,其中結合了所有的Marker元素。這時,你就可以將這些Marker元素作為一個整體,加入到Map或者從Map中刪除了。

 

之后就是顯示了,我們要用到Layers Control,負責控制顯示/隱藏哪個Layer。

在Leaflet中,有兩種Layer:(1)base layers——底圖(在我們的GIS系統中一次只能顯示一張底圖,比如之前的代碼中一直顯示的mapbox的tile layer);(2)overlays——覆蓋Layer(放在底圖上的Layer,比如上文的citiesLayer)。

在下邊的例子中,我們要創建兩個底圖:一個是streets——街道圖,另一個是satellite——衛星圖;然后在其上覆蓋一個Layer——我們之前創建的citiesLayer。

var map1 = L.tileLayer(url, {
        maxZoom: 18, id: 'mapbox.satellite' }), map2 = L.tileLayer(url, { maxZoom: 18, id: 'mapbox.streets' }).addTo(leafletMap); cities.addTo(leafletMap);

把底圖map2和覆蓋Layer cities都加入到leafletMap中,這些Layer也可以在通過L.map初始化Map時通過屬性layers : [ map2 , cities ]進行添加。

之后,我們要創建兩個對象——一個包含了我們所有的底圖;另一個包含了我們的覆蓋Layer。這兩個對象都是以key:value形式創建的。Key是我們在Layer控件中顯示的這些Layer名字,Value就是這些名字對應的Layer對象

注:Key/Value的寫法類似於之前創建某種元素時的屬性的寫法,都是{ name1 : value1 ,...}

var baseMaps={
    'Satellite' : map1,
    'Streets': map2
};
var overlayMaps={
    'Cities' : cities
};

現在,與Layer控件相關的准備工作都已經做好了,包括控件上顯示的內容(Layer名)以及這些內容實際對應的Layer對象。剩下的就是生成控件並把它加入到Map中了。通過L.control.layers()創建一個Layer Control

兩個參數:

第一個參數是之前創建的包含了所有底圖的對象baseMaps;

第二個參數則是覆蓋Layer對象overlayMaps。

這兩個參數都是可選的,你可以不寫第二個參數而只用一個底圖對象;也可以用null代替第一個參數而只用一個覆蓋Layer對象。在這兩種情況下,省略的Layer都不會顯示出來。

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

當然,你也可以通過在創建時設置其父類Control的屬性position來設置該控件的位置,但是補充的參數要放在上邊所說的兩個參數后邊:

L.control.layers( baseMaps , overlayMaps ,
{position:'topleft'}).addTo(leafletMap);

結果:

 

 

 

 

 寫在Layer相關的最后:

1、雖然我們應用了多個底圖(base map),但是在初始化Map只有一個參與了(即L.map時的layers屬性中只有一個底圖,或者只有一個底圖在創建時addTo(leafletMap)),但是當我們使用Layer控件時,仍要把所有的底圖都以Key/Value的形式給放在一個底圖對象中,該對象就是創建控件時L.control.layers()的第一個參數。

 2、上文的Key可以賦予相應的樣式,比如把Satellite變成紅色:

var baseMaps = {
    "<span style='color: red'>Satellite</span>": map1, "Streets": map2 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM