OpenLayers如何给地图添加遮罩层

(本篇文章前提是了解openlayers具体使用方法)

先上图:

如图所示,遮罩层就是覆盖在地图上面的蓝色透明图层,但是中间是挖空掉的,挖空掉的部分就显示地图原本的样子。一些业务需求就是要这种效果,感觉只是在造型上起到作用吧(bushi)。

大致原理其实就是:emm...上图

所以我们需要两个主要的数据,一个是遮罩层(相当于橡皮泥),一个是边界线(相当于磨具)

代码如下:

// 开始之前记得先import引入ol的相关方法哦,这里不再赘述了
addReverseBoundary() {
    let features = [];
    const format = new GeoJSON();
    // boundLine就是边界线了,一般都是从后端获取,我的是json文件,也有的是wkt,目标都是要转成feature,具体百度一下
    let fes = format.readFeature(boundLine, {
        dataProjection: 'EPSG:4326', // 数据坐标系
        featureProjection: 'EPSG:4326', // 目标坐标系
    });
    features.push(fes);
    const reversalGeom = this.reversalGeometry(features);
    const convertFt = new Feature({
        geometry: reversalGeom.transform('EPSG:4326', 'EPSG:3857'),
    });
    convertFt.setStyle(
        new Style({
            fill: new Fill({
                color: 'rgba(8,5,66,0.65)',
            }),
            stroke: new Stroke({
                color: '#1c8acf ',
                width: 3,
            }),
        })
	);
    const vLayer = new VectorLayer({
        source: new sourceVector({
            features: [convertFt],
        }),
    });
    vLayer.setZIndex(2); // 设置一下层级
    this.map.addLayer(vLayer); // 添加到地图上
},
reversalGeometry(fes) {
    // 先平铺一张遮罩层,遮罩层的大小当前屏幕视窗的四个角范围
    const polygonRing = fromExtent([-180, -90, 180, 90]);
    // 边界线可能不止一个,所以得循环操作一下
    for (let i = 0, len = fes.length; i < len; i++) {
        let geom = fes[i].getGeometry();
        let isMulit = false;
        if (geom instanceof MultiPolygon) isMulit = true; 
        const coords = geom.getCoordinates();
        coords.forEach((coord) => {
            let arr = coord[0];
            if (!isMulit) arr = coord; //单面
			const linearRing = new LineString(arr);
			polygonRing.appendLinearRing(linearRing);
		});
	}
    return polygonRing;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值