123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- (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);
- }
- })();
|