利用Openlayers4實現地圖遮罩效果(二)

效果對比

之前實現的遮罩效果,在深色背景的底圖上,對要突出的區域採用半透明遮罩,以此來突出該區域。暫且稱之爲中心遮罩,遮罩前後對比如下圖:
遮罩前
遮罩後
但是有時底圖顏色偏白,這時候不再適合對要突出的區域採用遮罩,而是要對突出區域之外進行遮罩處理。暫且稱爲四周遮罩如下圖:遮罩前
遮罩後

代碼實現

實現代碼如下:
js代碼

(function(){
    
    var map, converLayer;
    function initMap() {
        var baselayer = new ol.layer.Tile({
            source: new ol.source.XYZ({
                url: 'https://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetGray/MapServer/tile/{z}/{y}/{x}'
            })
        });
    
        map = new ol.Map({
            target: 'map',
            layers: [baselayer],
            view: new ol.View({
                projection: 'EPSG:4326',
                center: [112, 36],
                zoom: 6
            })
        });

        var mystyle = new ol.style.Style({
            fill: new ol.style.Fill({
                color:"rgba(72,61,139, 0.4)",
            }),
            stroke: new ol.style.Stroke({
                color:"#BDBDBD",
                width:2
            })
        });
        converLayer = new ol.layer.Vector({
            source: new ol.source.Vector(),
            style: mystyle
        });
        map.addLayer(converLayer);
    }

    //todo
    //添加遮罩
    function addconver(data) {
        $.getJSON(data, function(data) {
            var fts = new ol.format.GeoJSON().readFeatures(data);
            var ft = fts[0];
            var converGeom = erase(ft.getGeometry());

            var convertFt = new ol.Feature({
                geometry: converGeom
            })
            converLayer.getSource().addFeature(convertFt);
        })
    }

    // 擦除操作,生產遮罩範圍
    function erase(geom) {
        var extent = [-180,-90,180,90];
        var polygonRing = ol.geom.Polygon.fromExtent(extent);
        var coords = geom.getCoordinates();
        coords.forEach(coord =>{ 
            var linearRing = new ol.geom.LinearRing(coord[0]);
            polygonRing.appendLinearRing(linearRing);
        })
        return polygonRing;
    }

    initMap();
    var dataURL = '/static/data/shanxi.geojson'
    addconver(dataURL);
})();

html代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>周邊遮罩</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://openlayers.org/en/v4.6.5/css/ol.css" type="text/css">
    <script src="/static/js/node_modules/jquery/dist/jquery.min.js"></script>
    <script src="https://openlayers.org/en/v4.6.5/build/ol.js"></script>
    <style>
        head,body,#map{
            width: 100%;
            height: 100%;
            background-color: black;
        }
    </style>
</head>
<body>
    <div id="map"></div>
    <script src="/static/js/conver.js"></script>
</body>
</html>

原理

利用GIS空間運算中的擦除操作,熟悉GIS數據處理的同學應該不陌生這個操作。在Openlayers中,雖然並不支持空間運算,但是我們可以取構建擦除運算的結果。正常情況下,擦除運算的結果類似一個空心環,分爲外環和內環,內外環之間爲填充區域。

環裝幾何

openlayers支持環狀幾何,我們將地圖周邊視爲外環,將中心視爲內環,構建環,在利用半透明填充即可實現四周遮罩。具體方法見js代碼中的erase函數

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