zoukankan      html  css  js  c++  java
  • 行政区划遮罩 -openlayers

    有时候我们做GIS开发时需要只显示某个区域的地图,需要把其他地方遮罩住,比如下图这样:

    pic_0ffe6868.png

    好了,上代码:

    //添加遮罩
        function clipmap(data) {
            $.getJSON(data, function(data) {
                var fts = new ol.format.GeoJSON().readFeatures(data);
                var ft = fts[0];
                var converGeom =ft.getGeometry()
                converGeom.applyTransform(ol.proj.getTransform('EPSG:4326', 'EPSG:3857'));
                //var convertFt =new  ol.Feature(converGeom);
                //converLayer.getSource().addFeature(convertFt);
                var center,pixelScale,offsetX,offsetY,rotation;
                map.on('precompose',function(evt) {
                    var canvas=evt.context;
                    canvas.save();
                   
                    var coords=converGeom.getCoordinates();
                    var frameState = evt.frameState;
                    var pixelRatio = frameState.pixelRatio;
                    var viewState = frameState.viewState;
                    center = viewState.center;
                    var resolution = viewState.resolution;
                    rotation = viewState.rotation;
                    var size = frameState.size;
                    var size1=map.getSize();
                    offsetX = Math.round(pixelRatio * size[0] / 2);
                    offsetY = Math.round(pixelRatio * size[1] / 2);
                    pixelScale = pixelRatio / resolution;
    
                    canvas.beginPath();
                    if(converGeom.getType() == 'MultiPolygon'){
                        for(var i=0;i<coords.length;i++){
                            createClip(coords[i][0], canvas);
                        }
                    }
                    else if(converGeom.getType() == 'Polygon'){
                        createClip(coords[0], canvas);
                    }
                    canvas.backgroundColor="red";
                    canvas.clip();
                });
    
                function createClip(coords, canvas) {
                    for (var i = 0, cout = coords.length; i < cout; i++) {
                        var xLen = Math.round((coords[i][0] - center[0]) * pixelScale);
                        var yLen = Math.round((center[1] - coords[i][1]) * pixelScale);
                        var x = offsetX;
                        var y = offsetY;
                        if (rotation) {
                            x = xLen * Math.cos(rotation) - yLen * Math.sin(rotation) + offsetX;
                            y = xLen * Math.sin(rotation) + yLen * Math.cos(rotation) + offsetY;
                        } else {
                            x = xLen + offsetX;
                            y = yLen + offsetY;
                        }
                        if (i == 0) {
                            canvas.moveTo(x, y);
                        } else {
                            canvas.lineTo(x, y);
                        }
                    }
                    canvas.closePath();
                    
                }
                
    
                map.on('postcompose', function(event) {
                    var ctx = event.context;
                    ctx.restore();
                });
    
    
    
            })
        }
    
        var dataURL="../data/geojson/hubei.geojson";
        clipmap(dataURL);
    

    示例网址:

    http://www.mapmonster.cn:7000/exapmles/openlayers/base_add_geojson_clip_canvas.html

  • 相关阅读:
    7.6实战练习
    构造方法的主要应用
    6.0字符串String
    数组冒泡排序
    数组(二维数组)
    5.1数组(一维部分)
    4个方位的三角形和菱形
    4.3循环语句
    控制台输入输出
    4 java语句 4.2条件语句
  • 原文地址:https://www.cnblogs.com/hustshu/p/14902263.html
Copyright © 2011-2022 走看看