1. 程式人生 > >OpenLayers 3 載入WMTS天地圖

OpenLayers 3 載入WMTS天地圖

  • 設定空間參考座標系
    使用哪個座標系取決於載入的地圖服務,如果座標系與地圖服務的不同,則可能出現無法載入地圖的問題
var projection = ol.proj.get('EPSG:4326');//經緯度空間參考座標系
var projection = ol.proj.get('EPSG:3857');//墨卡託投影空間參考座標系
  • 設定地圖縮放層級解析度
var projectionExtent = projection.getExtent();
var size = ol.extent.getWidth(projectionExtent) / 256;
var resolutions = [];
var
matrixIds = []; for (var z = 2; z < 19; ++z) { resolutions[z] = size / Math.pow(2, z); matrixIds[z] = z; }
  • 建立tile layer
var url = "http://www.sdmap.gov.cn/tileservice/SDPubMap";
var layers = [new ol.layer.Tile({
            source: new ol.source.WMTS({
                url: url,
                projection: projection,
                style: 'default'
, format: 'image/png', matrixSet: "EPSG:4326", layer: "sdvec", tileGrid: new ol.tilegrid.WMTS({ origin: ol.extent.getTopLeft(projectionExtent);, resolutions: resolutions, matrixIds: matrixIds }), }) })];
  • 設定view
    如果不設定view,則地圖無法載入
var view = new ol.View({
            projection: projection,//座標系引數如果不設定,則預設為墨卡託
            resolutions:resolutions,//解析度層級陣列
            //resolution: resolutions[8],//初始展示解析度,若不設定該引數,則需設定zoom引數,否則地圖無法載入
            center: [120.151527, 35.99825595],//必須引數,否則地圖無法載入
            zoom: 14
        })
  • 載入地圖
var map = new ol.Map({
        layers: layers ,
        target: 'map',//為地圖div的id
        controls: ol.control.defaults({
            attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
                collapsible: false
            })
        }),//放縮控制組件
        view: view 
    });
  • 完整程式碼
<!DOCTYPE html>
<html>

<head>
    <title>WMTS</title>
    <link rel="stylesheet" href="https://openlayers.org/en/v4.3.1/css/ol.css" type="text/css">
    <!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
    <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script>
    <script src="https://openlayers.org/en/v4.3.1/build/ol.js"></script>
</head>
<style type="text/css">
#map {
    width: 100%;
    height: 100%;
}
</style>

<body>
    <div id="map" class="map"></div>
    <script>
    var projection = ol.proj.get('EPSG:4326');
    //var projection = ol.proj.get('EPSG:3857');
    var projectionExtent = projection.getExtent();
    var size = ol.extent.getWidth(projectionExtent) / 256;
    var resolutions = [];
    var matrixIds = [];
    for (var z = 2; z < 19; ++z) {
        resolutions[z] = size / Math.pow(2, z);
        matrixIds[z] = z;
    }

    var url = "http://www.sdmap.gov.cn/tileservice/SDPubMap";
    var layers = [new ol.layer.Tile({
            source: new ol.source.WMTS({
                url: url,
                projection: projection,
                style: 'default',
                format: 'image/png',
                matrixSet: "EPSG:4326",
                layer: "sdvec",
                tileGrid: new ol.tilegrid.WMTS({
                    origin: ol.extent.getTopLeft(projectionExtent);,
                    resolutions: resolutions,
                    matrixIds: matrixIds
                }),
            })
        })];

    var view = new ol.View({
           projection: projection,//座標系引數如果不設定,則預設為墨卡託
           resolutions:resolutions,//解析度層級陣列
           //resolution: resolutions[8],//初始展示解析度,若不設定該引數,則需設定zoom引數,否則地圖無法載入
           center: [120.151527, 35.99825595],//必須引數,否則地圖無法載入
           zoom: 14
       })        

    var map = new ol.Map({
        layers: layers,
        target: 'map',
        controls: ol.control.defaults({
            attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
                collapsible: false
            })
        }),
        view: view 
    });
    </script>
</body>

</html>