mirror of
				https://github.com/jiawanlong/Cesium-Examples.git
				synced 2025-11-04 09:14:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			303 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			303 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
(function(){
 | 
						||
    var PrintMap = {};
 | 
						||
    var LAYER_COUNT = 0;
 | 
						||
    var LAYER_LENGTH = 0;
 | 
						||
    window.MapToImg = PrintMap;
 | 
						||
 | 
						||
    PrintMap.excute = function(map){
 | 
						||
        var canvas = document.createElement("canvas");
 | 
						||
        var broz = SuperMap.Browser.name;
 | 
						||
        if(!canvas.getContext||(broz=='msie'&&!canvas.msToBlob)){
 | 
						||
            alert("您的浏览器版本太低,请升级。");
 | 
						||
            return;
 | 
						||
        }
 | 
						||
        if(document.location.toString().match(/file:\/\//)){
 | 
						||
            alert("该功能需要在服务器中发布出来后,方可使用");
 | 
						||
            return;
 | 
						||
        }
 | 
						||
        LAYER_COUNT = 0;
 | 
						||
 | 
						||
        var layers = map.layers.concat([]);
 | 
						||
 | 
						||
        //layers排序,将markers放到最上边
 | 
						||
        var layers1 = [];
 | 
						||
        for(var i=0;i<layers.length;){
 | 
						||
            if(layers[i].CLASS_NAME == "SuperMap.Layer.Markers"){
 | 
						||
                var templayer = layers.splice(i,1);
 | 
						||
                layers1.push(templayer[0]);
 | 
						||
            } else if(layers[i].CLASS_NAME == "SuperMap.Layer.GOAnimationLayer" ||
 | 
						||
                layers[i].CLASS_NAME == "SuperMap.Layer.PlottingLayer.Temporary" ||
 | 
						||
                (layers[i].CLASS_NAME == "SuperMap.Layer.PlottingLayer" && !layers[i].getVisibility()) ||
 | 
						||
                layers[i].CLASS_NAME == "SuperMap.Layer.PlottingLayer.RootContainer"){
 | 
						||
                //处理标绘图层的动画图层和图层不显示
 | 
						||
                layers.splice(i,1);
 | 
						||
            } else {
 | 
						||
                i++;
 | 
						||
            }
 | 
						||
        }
 | 
						||
        layers = layers.concat(layers1);
 | 
						||
 | 
						||
        LAYER_LENGTH = layers.length;
 | 
						||
        var imgUrls = [];
 | 
						||
        for(var i=0;i<layers.length;i++){
 | 
						||
            var layer = layers[i];
 | 
						||
            if(layer.CLASS_NAME == "SuperMap.Layer.TiledDynamicRESTLayer"){
 | 
						||
                if(layer.useCanvas==false){
 | 
						||
                    draw(getImgLayerData(layer,map),i,imgUrls);
 | 
						||
                }
 | 
						||
                else{
 | 
						||
                    draw(getCanvasLayerData(layer),i,imgUrls);
 | 
						||
                }
 | 
						||
            }
 | 
						||
            else if(layer.CLASS_NAME == "SuperMap.Layer.Markers"){
 | 
						||
                draw(getImgLayerData(layer,map),i,imgUrls);
 | 
						||
            }
 | 
						||
            else if(layer.CLASS_NAME == "SuperMap.Layer.Vector"){
 | 
						||
                getVectorLayerData(layer,map,function(imgUrls,i){
 | 
						||
                    return function(img){
 | 
						||
                        draw(img,i,imgUrls);
 | 
						||
                    }
 | 
						||
                }(imgUrls,i))
 | 
						||
            }
 | 
						||
            else if(layer.CLASS_NAME == "SuperMap.Layer.PlottingLayer"){
 | 
						||
                getPlottingLayerData(layer,map,function(imgUrls,i){
 | 
						||
                    return function(img){
 | 
						||
                        draw(img,i,imgUrls);
 | 
						||
                    }
 | 
						||
                }(imgUrls,i))
 | 
						||
            }
 | 
						||
        }
 | 
						||
    };
 | 
						||
 | 
						||
    function draw(img,i,imgUrls){
 | 
						||
        imgUrls[i] = img;
 | 
						||
        LAYER_COUNT++;
 | 
						||
 | 
						||
        if(LAYER_COUNT>=LAYER_LENGTH){
 | 
						||
            var canvas = document.createElement("canvas");
 | 
						||
            var size = map.getSize();
 | 
						||
            canvas.height = size.h;
 | 
						||
            canvas.width = size.w;
 | 
						||
            var ctx = canvas.getContext("2d");
 | 
						||
 | 
						||
            canvas.style.position = "relative";
 | 
						||
            canvas.style.border = "1px solid #4c4c4c";
 | 
						||
 | 
						||
            //document.body.appendChild(canvas);
 | 
						||
 | 
						||
            var panel = document.createElement("div");
 | 
						||
 | 
						||
            panel.style.position = "absolute";
 | 
						||
            panel.style.left = "0px";
 | 
						||
            panel.style.top = "0px";
 | 
						||
            panel.style.height = "100%";
 | 
						||
            panel.style.width = "100%";
 | 
						||
            // panel.style.background = "#e6e8eb";
 | 
						||
            panel.style.background = "#ffffff";
 | 
						||
            document.body.appendChild(panel);
 | 
						||
 | 
						||
 | 
						||
            var buttonPanel = document.createElement("div");
 | 
						||
            buttonPanel.style.position = "relative";
 | 
						||
            panel.appendChild(buttonPanel);
 | 
						||
            panel.appendChild(canvas);
 | 
						||
 | 
						||
            window.setTimeout(function(){
 | 
						||
                for(var i=0;i<imgUrls.length;i++){
 | 
						||
                    ctx.drawImage(imgUrls[i],0,0);
 | 
						||
                }
 | 
						||
 | 
						||
                if(canvas.msToBlob){
 | 
						||
                    var button = document.createElement("input");
 | 
						||
                    buttonPanel.appendChild(button);
 | 
						||
                    button.type = "button";
 | 
						||
                    button.value = "保存";
 | 
						||
 | 
						||
                    button.onclick = function(){
 | 
						||
                        window.navigator.msSaveBlob(canvas.msToBlob(), 'map.png');
 | 
						||
                    }
 | 
						||
                }
 | 
						||
                else{
 | 
						||
                    var aa = document.createElement("a");
 | 
						||
                    buttonPanel.appendChild(aa);
 | 
						||
                    aa.target = "_blank";
 | 
						||
                    aa.download="map.png";
 | 
						||
                    aa.href=canvas.toDataURL();
 | 
						||
 | 
						||
                    var button = document.createElement("input");
 | 
						||
                    aa.appendChild(button);
 | 
						||
                    button.type = "button";
 | 
						||
                    button.value = "保存";
 | 
						||
                }
 | 
						||
 | 
						||
                var button = document.createElement("input");
 | 
						||
                buttonPanel.appendChild(button);
 | 
						||
                button.type = "button";
 | 
						||
                button.value = "关闭";
 | 
						||
                button.onclick = function(){
 | 
						||
                    document.body.removeChild(panel);
 | 
						||
                }
 | 
						||
            },30);
 | 
						||
        }
 | 
						||
    }
 | 
						||
    //截取图片图层
 | 
						||
    function getImgLayerData(layer,map){
 | 
						||
        var div = layer.div;
 | 
						||
        var pdiv = div.parentNode;
 | 
						||
        var offsetX =  parseInt(pdiv.style.left.replace(/px/,""));
 | 
						||
        var offsetY =  parseInt(pdiv.style.top.replace(/px/,""));
 | 
						||
 | 
						||
        var canvas = document.createElement("canvas");
 | 
						||
        var size = map.getSize();
 | 
						||
        canvas.height = size.h;
 | 
						||
        canvas.width = size.w;
 | 
						||
        var ctx = canvas.getContext("2d");
 | 
						||
 | 
						||
        canvas.style.position = "absolute";
 | 
						||
        canvas.style.left = "5px";
 | 
						||
        canvas.style.top = "600px";
 | 
						||
        canvas.style.border = "1px solid #f00";
 | 
						||
 | 
						||
        //document.body.appendChild(canvas);
 | 
						||
 | 
						||
        var divs = div.getElementsByTagName("div");
 | 
						||
        for(var i=0;i<divs.length;i++){
 | 
						||
            var div1 = divs[i];
 | 
						||
            if(div1.style.display!="none"){
 | 
						||
                var left = parseInt(div1.style.left.replace(/px/,""));
 | 
						||
                var top = parseInt(div1.style.top.replace(/px/,""));
 | 
						||
                var img = div1.getElementsByTagName("img")[0];
 | 
						||
                var imgWidth = img.style.width;
 | 
						||
                var imgHeight = img.style.height;
 | 
						||
                var imgW = null,imgH = null;
 | 
						||
                if(imgWidth!=null||imgWidth!=""){
 | 
						||
                    imgW = parseInt(imgWidth.replace(/px/,""));
 | 
						||
                }
 | 
						||
                if(imgHeight!=null||imgHeight!=""){
 | 
						||
                    imgH = parseInt(imgHeight.replace(/px/,""));
 | 
						||
                }
 | 
						||
                if(imgW!=null&&imgH!=null){
 | 
						||
                    ctx.drawImage(img,left+offsetX,top+offsetY,imgW,imgH);
 | 
						||
                }
 | 
						||
                else{
 | 
						||
                    ctx.drawImage(img,left+offsetX,top+offsetY);
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        var imageUrl = canvas.toDataURL("image/png");
 | 
						||
        var img = new Image();
 | 
						||
        img.src = imageUrl;
 | 
						||
        return img;
 | 
						||
    }
 | 
						||
    //截取canvas图层
 | 
						||
    function getCanvasLayerData(layer){
 | 
						||
        var div = layer.div;
 | 
						||
        var canvas0 = div.getElementsByTagName("canvas")[0];
 | 
						||
        var imageUrl = canvas0.toDataURL("image/png");
 | 
						||
        var img = new Image();
 | 
						||
        img.src = imageUrl;
 | 
						||
 | 
						||
        return img;
 | 
						||
    }
 | 
						||
    //截取Vector图层
 | 
						||
    function getVectorLayerData(layer,map,callback){
 | 
						||
        var printLayer,
 | 
						||
            strategies = [],
 | 
						||
            features1 = [],
 | 
						||
            features = layer.features,
 | 
						||
            layerStrategies = layer.strategies;
 | 
						||
        //GeoText无法截图问题修复
 | 
						||
        if(layerStrategies){
 | 
						||
            for(var i = 0; i<layerStrategies.length; i++){
 | 
						||
                if (layerStrategies[i].CLASS_NAME === "SuperMap.Strategy.GeoText"){
 | 
						||
                    strategies.push(layerStrategies[i].clone());
 | 
						||
                }else{
 | 
						||
                    strategies.push(layerStrategies[i]);
 | 
						||
                }
 | 
						||
            }
 | 
						||
            printLayer = new SuperMap.Layer.Vector("PRINT_LAYER", {strategies: strategies, visibility: true, renderers: ["Canvas"]});
 | 
						||
        }else{
 | 
						||
            printLayer = new SuperMap.Layer.Vector("PRINT_LAYER", {visibility: true, renderers: ["Canvas"]});
 | 
						||
        }
 | 
						||
        map.addLayer(printLayer);
 | 
						||
        for(var j=0;j<features.length;j++){
 | 
						||
            var feature = features[j];
 | 
						||
            var feature1 = new SuperMap.Feature.Vector();
 | 
						||
            feature1.geometry = feature.geometry.clone();
 | 
						||
            feature1.style = feature.style;
 | 
						||
 | 
						||
            features1.push(feature1);
 | 
						||
        }
 | 
						||
        if(layer.style){
 | 
						||
            printLayer.style = layer.style;
 | 
						||
        }
 | 
						||
 | 
						||
        printLayer.setOpacity(0);
 | 
						||
        printLayer.addFeatures(features1);
 | 
						||
 | 
						||
        window.setTimeout(function(printLayer,map,callback){
 | 
						||
            return function(){
 | 
						||
                var div = printLayer.div;
 | 
						||
                var canvas1 = div.getElementsByTagName("canvas")[0];
 | 
						||
                var cxt1 = canvas1.getContext("2d");
 | 
						||
                var imageUrl = canvas1.toDataURL("image/png");
 | 
						||
 | 
						||
                map.removeLayer(printLayer);
 | 
						||
                printLayer.destroy();
 | 
						||
 | 
						||
                var img = new Image();
 | 
						||
                img.src = imageUrl;
 | 
						||
 | 
						||
                callback(img);
 | 
						||
            }
 | 
						||
        }(printLayer,map,callback),30);
 | 
						||
    }
 | 
						||
 | 
						||
    //截取Plotting图层
 | 
						||
    function getPlottingLayerData(layer,map,callback){
 | 
						||
        var printLayer,
 | 
						||
            features1 = [],
 | 
						||
            features = layer.features,
 | 
						||
 | 
						||
        printLayer = new SuperMap.Layer.PlottingLayer("PRINT_LAYER", layer.serverUrl, {visibility: true, renderers: ["Canvas"]});
 | 
						||
        //printLayer.spatialAnalystUrl = layer.spatialAnalystUrl;
 | 
						||
 | 
						||
        map.addLayer(printLayer);
 | 
						||
        for(var j=0;j<features.length;j++){
 | 
						||
            if(features[j].geometry instanceof SuperMap.Geometry.PlottingGeometry){
 | 
						||
                var feature = features[j];
 | 
						||
                var feature1 = SuperMap.Plot.PlottingUtil.copyFeature(feature);
 | 
						||
                features1.push(feature1);
 | 
						||
            } else {
 | 
						||
                var feature1 = new SuperMap.Feature.Vector();
 | 
						||
                feature1.geometry = features[j].geometry.clone();
 | 
						||
                feature1.style = features[j].style;
 | 
						||
                features1.push(feature1);
 | 
						||
            }
 | 
						||
        }
 | 
						||
        if(layer.style){
 | 
						||
            printLayer.style = layer.style;
 | 
						||
        }
 | 
						||
 | 
						||
        printLayer.setOpacity(0);
 | 
						||
        printLayer.addFeatures(features1);
 | 
						||
 | 
						||
        window.setTimeout(function(printLayer,map,callback){
 | 
						||
            return function(){
 | 
						||
                var div = printLayer.div;
 | 
						||
                var canvas1 = div.getElementsByTagName("canvas")[0];
 | 
						||
                var cxt1 = canvas1.getContext("2d");
 | 
						||
                var imageUrl = canvas1.toDataURL("image/png");
 | 
						||
 | 
						||
                map.removeLayer(printLayer);
 | 
						||
                printLayer.destroy();
 | 
						||
 | 
						||
                var img = new Image();
 | 
						||
                img.src = imageUrl;
 | 
						||
 | 
						||
                callback(img);
 | 
						||
            }
 | 
						||
        }(printLayer,map,callback),30);
 | 
						||
    }
 | 
						||
})(); |