OpenLayers學習筆記高級篇(二、地圖控件)

在OpenLayers 3中,地圖控件指的是下圖標註的這些,包括縮放按鈕,標尺,版權說明,指北針等等。

他們不會隨着地圖的移動而移動,一直處於一個固定的位置。 在實現上,並不是在畫布上繪製的,而是使用傳統的HTML元素來實現的,便於同地圖分離,也便於界面實現。 在本章節中,將先概覽OpenLayers 3中已有的地圖控件,對其實現進行分析,在此基礎上進一步修改其樣式,從而定義自己的控件。

OpenLayers 3目前內置的地圖控件類都在包ol.control下面,依次有:

  • ol.control.Attribution: 右下角的地圖信息控件
  • ol.control.FullScreen: 全屏控件
  • ol.control.MousePosition: 鼠標位置控件
  • ol.control.OverviewMap: 鳥瞰圖控件
  • ol.control.Rotate: 指北針控件
  • ol.control.ScaleLine: 比例尺控件
  • ol.control.Zoom: 縮放按鈕控件
  • ol.control.ZoomSlider: 縮放滾動條控件
  • ol.control.ZoomToExtent: 放大到設定區域控件

每一個類都有一些設置參數,可對照官網API的文檔來了解其對應的功能。

默認情況下,在地圖上是不會顯示這麼多地圖控件的,只會應用ol.control.defaults()這個函數返回的地圖控件,默認包含了ol.control.Zoomol.control.Rotateol.control.Attribution這個控件。 其使用方式同ol.interaction.defaults()很像,同樣可以設置一些參數來控制控件的一些功能,從而實現定製化需求。

1、下面我們來實現一個沒有任何控件的地圖:

<!doctype html>
<html xmlns=http://www.w3.org/1999/xhtml>
<head>                  
    <meta http-equiv=Content-Type content="text/html;charset=utf-8">
    <meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1">
    <meta content=always name=referrer>
    <title>點線面圓的繪製</title>
    <link href="css/ol.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="js/ol.js" charset="utf-8"></script>
</head>

<body>
     <div id="map" style="width: 100%"></div>
<script type="text/javascript">
    var map = new ol.Map({
        // 設置地圖控件,默認的三個控件都不顯示
        controls: ol.control.defaults({
        	//右下角的地圖信息控件
            attribution: false,
            //指北針控件
            rotate: false,
            //縮放按鈕控件
            zoom: false
        }),
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
  
          })
        ],
        target: 'map',
        view: new ol.View({
          center: ol.proj.transform(
              [120.374798,36.07316], 'EPSG:4326', 'EPSG:3857'),
          zoom: 10
        })
    });
</script>
</body>

</html>


看一下效果:

地圖已經沒有了任何的控件信息!其實如果讓地圖控件都不顯示有一個更簡介的寫法:controls: [],大家可以自行測試一下!

 2、我們再實現一個加載了所有基本控件的地圖的展示:

<!doctype html>
<html xmlns=http://www.w3.org/1999/xhtml>
<head>                  
    <meta http-equiv=Content-Type content="text/html;charset=utf-8">
    <meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1">
    <meta content=always name=referrer>
    <title>去除所有地圖控件</title>
    <link href="css/ol.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="js/ol.js" charset="utf-8"></script>
</head>

<body>
     <div id="map" style="width: 100%"></div>
<script type="text/javascript">
    var map = new ol.Map({
         // 在默認控件的基礎上,再加上其他內置的控件
        controls: ol.control.defaults().extend([
        	//全屏
            new ol.control.FullScreen(),
            //鼠標位置控件
            new ol.control.MousePosition(),
            //鳥瞰圖控件
            new ol.control.OverviewMap(),
            //比例尺控件
            new ol.control.ScaleLine(),
            //縮放滾動條控件
            new ol.control.ZoomSlider(),
            // 放大到設定區域控件
            new ol.control.ZoomToExtent()
        ]),
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
  
          })
        ],
        target: 'map',
        view: new ol.View({
          center: ol.proj.transform(
              [120.374798,36.07316], 'EPSG:4326', 'EPSG:3857'),
          zoom: 10
        })
    });
</script>
</body>

</html>



看一下效果:

下圖是一個界面控件和類的對照關係圖: 

 

每一個控件都有相應的參數設置,如果具體到某一個控件使用時,不能滿足需求,可以先參照官網API說明,進行相應使用。

3、如果我們想改變控件的UI,應該如何改變呢?其實也是非常簡單的,我們先使用開發者調試工具獲取到控件UI,然後直接使用css或者javascript修改即可!我們再來兩個修改控件UI樣式的demo:

<!doctype html>
<html xmlns=http://www.w3.org/1999/xhtml>
<head>                  
    <meta http-equiv=Content-Type content="text/html;charset=utf-8">
    <meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1">
    <meta content=always name=referrer>
    <title>添加所有地圖控件</title>
    <link href="css/ol.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="js/ol.js" charset="utf-8"></script>
    <style>
    	.ol-zoom .ol-zoom-in {
	    background-color: #0000ff;
	    color: #ff0000;
	    }
	    .ol-zoom .ol-zoom-out {
	    background-color: #0000ff;
	    color: black;
	    }
	    
    </style>
    
}
</head>

<body>
     <div id="map" style="width: 100%"></div>
<script type="text/javascript">
    var map = new ol.Map({
         // 在默認控件的基礎上,再加上其他內置的控件
        controls: ol.control.defaults().extend([
        	//全屏
            new ol.control.FullScreen(),
            //鼠標位置控件
            new ol.control.MousePosition(),
            //鳥瞰圖控件
            new ol.control.OverviewMap(),
            //比例尺控件
            new ol.control.ScaleLine(),
            //縮放滾動條控件
            new ol.control.ZoomSlider(),
            // 放大到設定區域控件
            new ol.control.ZoomToExtent()
        ]),
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
  
          })
        ],
        target: 'map',
        view: new ol.View({
          center: ol.proj.transform(
              [120.374798,36.07316], 'EPSG:4326', 'EPSG:3857'),
          zoom: 10
        })
    });
</script>
</body>

</html>



這一個我們是通過直接修改css樣式改變控件UI的,可以看一下效果:

我們的地圖放大縮小的控件UI已經發生了改變!

再來一個通過javascript修改控件UI的demo:

<!doctype html>
<html xmlns=http://www.w3.org/1999/xhtml>
<head>                  
    <meta http-equiv=Content-Type content="text/html;charset=utf-8">
    <meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1">
    <meta content=always name=referrer>
    <title>添加所有地圖控件</title>
    <link href="css/ol.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="js/ol.js" charset="utf-8"></script>
    <script type="text/javascript" src="js/jquery.js" charset="utf-8"></script>
</head>

<body>
     <div id="map2" style="width: 100%"></div>
<script type="text/javascript">
    new ol.Map({
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
          })
        ],
        target: 'map2',
        view: new ol.View({
          center: ol.proj.transform(
              [104, 30], 'EPSG:4326', 'EPSG:3857'),
          zoom: 10
        })
    });

    // 設置放大按鈕符號,下面這個代碼需要引入jquery,或者zepto庫
    $('#map2 .ol-zoom-in').html('<>');
</script>
</body>

</html>



這裏我們引入了JQuery庫使用js代碼對控件樣式進行了修改,看一下效果:

修改成功!既然我們可以通過css或者js修改控件的ui,那麼我們可不可以在地圖上自定義控件呢?顯然是可以的,自定義控件就相對簡單,共分爲兩個步驟,第一步是構建界面,第二步是用代碼實現功能。 下面自定義了一個輸出當前地圖的功能的demo:

3、自定義輸出當前地圖的控件:

<!doctype html>
<html xmlns=http://www.w3.org/1999/xhtml>
<head>                  
    <meta http-equiv=Content-Type content="text/html;charset=utf-8">
    <meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1">
    <meta content=always name=referrer>
    <title>自定義地圖輸出控件</title>
    <link href="css/ol.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="js/ol.js" charset="utf-8"></script>
    <script type="text/javascript" src="js/jquery.js" charset="utf-8"></script>
    <script type="text/javascript" src="js/fileSave.js" charset="utf-8"></script>
    <style>
    	.share {
		    position: absolute;
		    top: 10px;
		    right: 10px;
		    border: 1px;
		    border-color: #333;
		    background-color: #339999;
		    color: #fff;
		    box-shadow: 0px 0px 2px #666;
		    cursor: pointer;
		    padding: 0 4px 0 4px;
		}
    </style>
</head>

<body>
     <div id="map" style="width: 100%"></div>
<script type="text/javascript">
    var map = new ol.Map({
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
          })
        ],
        target: 'map',
        view: new ol.View({
          center: ol.proj.transform(
              [120.374798,36.07316], 'EPSG:4326', 'EPSG:3857'),
          zoom: 10
        })
    });

    // 在viewport節點下添加一個分享按鈕
    var viewport = map.getViewport();
    $(viewport).append('<div id="share" class="share">地圖輸出</div>');

    // 監聽按鈕點擊事件,執行相關操作
    document.getElementById('share').onclick = function() {
         	map.once('postcompose', function (event) {
            var canvas = event.context.canvas;
            canvas.toBlob(function (blob) {
                saveAs(blob, 'map.png');
            });
        });
        map.renderSync();
    }
</script>
</body>

</html>




這次先解釋一下代碼:首先在viewport節點下添加一個輸出按鈕,然後監聽這個按鈕,這裏我們使用了一個saveAs方法,這是一個調用的封裝好的保存文件的js文件,最後重新渲染了map,來看一下效果:

點擊地圖輸出,會顯示我們已經下載好的地圖:

打開map.png:

 

當前地圖輸出成功!

關於地圖控件的介紹我們就到這兒了! 下一節我們會介紹地圖中動畫的使用!大家加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章