1. 程式人生 > >Openlayers官方例項詳解四之圖層望遠鏡(Layer Spyglass)

Openlayers官方例項詳解四之圖層望遠鏡(Layer Spyglass)

目錄

一、示例簡介

二、程式碼詳解

三、總結


一、示例簡介

    圖層渲染可以在precomposepostcompose事件處理程式中被控制,這兩個事件處理程式的事件物件中包含一個Canvas渲染上下文屬性(canvas rendering context)。

    在本示例中,在precompose事件處理程式中生成一個以滑鼠游標為中心的剪下掩模,給使用者提供一個望遠鏡效果,使得在一個圖層中可以檢視另一個圖層。

    滑鼠在地圖上移動可以看到效果,使用 “↑”鍵和“↓”鍵可以調整望遠鏡的大小。

    圖層望遠鏡效果:

二、程式碼詳解

    html

<body>
    <!-- 圖層容器 --> 
    <div id="map"></div>
</body>

    JS

2.1、首先載入Bing地圖的路網地圖和影像地圖

// Bing地圖的key
var key = 'Bing地圖的key,可以去Bing地圖官網申請';

var roads = new TileLayer({         // Bing路網地圖
    source: new BingMaps({
        key: key,
        imagerySet: 'Road'
    })
});

var imagery = new TileLayer({       // Bing影像地圖
    source: new BingMaps({
        key: key,
        imagerySet: 'Aerial'
    })
});

var container = document.getElementById('map');

var map = new Map({
    target: container,
    layers: [
        roads,
        imagery
    ],
    view: new View({
        center: fromLonLat([-109, 46.5]),
        zoom: 6
    })
});

    可以去Bing地圖的官網申請Key碼。

2.2、控制望遠鏡的半徑和位置

    建立兩個變數radiusmousePosition以用於儲存望遠鏡的半徑和望遠鏡圓心的位置(也就是滑鼠游標所在畫素的位置)    

var radius = 75;                        // 用於控制圖層望遠鏡的半徑
document.addEventListener('keydown', function(evt){
    console.log(100);
    if(evt.keyCode === 38){            
        console.log(1);       
        // 如果使用者按下'↑'鍵,望遠鏡的半徑增加5畫素
        radius = Math.min(radius + 5, 150);
        map.render();
        evt.preventDefault();
    }else if(evt.keyCode === 40){
        // 如果使用者按下'↓'鍵,望遠鏡的半徑減少5畫素
        radius = Math.max(radius - 5, 25);
        map.render();
        evt.preventDefault();
    }
});


var mousePosition = null;                       // 用於實時儲存滑鼠游標所在的畫素的位置
container.addEventListener('mousemove', function(event){
    // 每次滑鼠移動就獲取滑鼠游標所在畫素相對於地圖視口的位置, 並重新渲染一次地圖
    mousePosition = map.getEventPixel(event);
    map.render();
});

container.addEventListener('mouseout', function(){
    // 滑鼠移出地圖容器,滑鼠位置設定為空,並重新渲染一次地圖
    mousePosition = null;
    map.render();
});

    主要通過"keydown"、"mousemove"、"mouseout"來控制望遠鏡的半徑和位置。

    注意:每次改變了望遠鏡的半徑或位置都需要重新渲染地圖,即呼叫map物件的render()方法。

2.3、繪製圖層望遠鏡

    因為precompose事件的事件處理程式的事件物件包含canvas渲染上下文,所以可以使用它繪製圖層望遠鏡。

imagery.on('precompose', function(event){       // 在每次繪製影像圖層之前觸發
    var ctx = event.context;      // 獲取canvase渲染上下文
    var pixelRatio = event.frameState.pixelRatio;  // 獲取地圖當前幀的畫素比率
    ctx.save();                 // 儲存當前canvas設定
    ctx.beginPath();            // 開始繪製路徑
    if(mousePosition){
        // 繪製一個圍繞滑鼠游標的圓
        ctx.arc(mousePosition[0] * pixelRatio, mousePosition[1] * pixelRatio, 
            radius * pixelRatio, 0, 2 * Math.PI);
            ctx.lineWidth = 5 * pixelRatio;
            ctx.strokeStyle = 'rgba(0, 0, 0, 0.5)';
            ctx.stroke();
    }
    ctx.clip();   // 使用剛繪製的圓裁剪影像圖層,使得影像圖層只保留該圓的範圍
});

// 在每次繪製影像圖層之後觸發
imagery.on('postcompose', function(event){
    var ctx = event.context;
    ctx.restore();                  // canvas恢復到之前的設定
})

    注意mousePosition中儲存的滑鼠游標位置資訊是基於當前地圖的畫素比的,所以要把它轉換成和canvas繪圖一致的畫素比。

 

三、總結

    圖層望遠鏡功能使得使用者可以在一個圖層上檢視另外一個圖層。

    官方示例地址:http://openlayers.org/en/latest/examples/layer-spy.html?q=Layer+Spyt