MapToImg.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. (function(){
  2. var PrintMap = {};
  3. var LAYER_COUNT = 0;
  4. var LAYER_LENGTH = 0;
  5. window.MapToImg = PrintMap;
  6. PrintMap.excute = function(map){
  7. var canvas = document.createElement("canvas");
  8. var broz = SuperMap.Browser.name;
  9. if(!canvas.getContext||(broz=='msie'&&!canvas.msToBlob)){
  10. alert("您的浏览器版本太低,请升级。");
  11. return;
  12. }
  13. if(document.location.toString().match(/file:\/\//)){
  14. alert("该功能需要在服务器中发布出来后,方可使用");
  15. return;
  16. }
  17. LAYER_COUNT = 0;
  18. var layers = map.layers.concat([]);
  19. //layers排序,将markers放到最上边
  20. var layers1 = [];
  21. for(var i=0;i<layers.length;){
  22. if(layers[i].CLASS_NAME == "SuperMap.Layer.Markers"){
  23. var templayer = layers.splice(i,1);
  24. layers1.push(templayer[0]);
  25. } else if(layers[i].CLASS_NAME == "SuperMap.Layer.GOAnimationLayer" ||
  26. layers[i].CLASS_NAME == "SuperMap.Layer.PlottingLayer.Temporary" ||
  27. (layers[i].CLASS_NAME == "SuperMap.Layer.PlottingLayer" && !layers[i].getVisibility()) ||
  28. layers[i].CLASS_NAME == "SuperMap.Layer.PlottingLayer.RootContainer"){
  29. //处理标绘图层的动画图层和图层不显示
  30. layers.splice(i,1);
  31. } else {
  32. i++;
  33. }
  34. }
  35. layers = layers.concat(layers1);
  36. LAYER_LENGTH = layers.length;
  37. var imgUrls = [];
  38. for(var i=0;i<layers.length;i++){
  39. var layer = layers[i];
  40. if(layer.CLASS_NAME == "SuperMap.Layer.TiledDynamicRESTLayer"){
  41. if(layer.useCanvas==false){
  42. draw(getImgLayerData(layer,map),i,imgUrls);
  43. }
  44. else{
  45. draw(getCanvasLayerData(layer),i,imgUrls);
  46. }
  47. }
  48. else if(layer.CLASS_NAME == "SuperMap.Layer.Markers"){
  49. draw(getImgLayerData(layer,map),i,imgUrls);
  50. }
  51. else if(layer.CLASS_NAME == "SuperMap.Layer.Vector"){
  52. getVectorLayerData(layer,map,function(imgUrls,i){
  53. return function(img){
  54. draw(img,i,imgUrls);
  55. }
  56. }(imgUrls,i))
  57. }
  58. else if(layer.CLASS_NAME == "SuperMap.Layer.PlottingLayer"){
  59. getPlottingLayerData(layer,map,function(imgUrls,i){
  60. return function(img){
  61. draw(img,i,imgUrls);
  62. }
  63. }(imgUrls,i))
  64. }
  65. }
  66. };
  67. function draw(img,i,imgUrls){
  68. imgUrls[i] = img;
  69. LAYER_COUNT++;
  70. if(LAYER_COUNT>=LAYER_LENGTH){
  71. var canvas = document.createElement("canvas");
  72. var size = map.getSize();
  73. canvas.height = size.h;
  74. canvas.width = size.w;
  75. var ctx = canvas.getContext("2d");
  76. canvas.style.position = "relative";
  77. canvas.style.border = "1px solid #4c4c4c";
  78. //document.body.appendChild(canvas);
  79. var panel = document.createElement("div");
  80. panel.style.position = "absolute";
  81. panel.style.left = "0px";
  82. panel.style.top = "0px";
  83. panel.style.height = "100%";
  84. panel.style.width = "100%";
  85. // panel.style.background = "#e6e8eb";
  86. panel.style.background = "#ffffff";
  87. document.body.appendChild(panel);
  88. var buttonPanel = document.createElement("div");
  89. buttonPanel.style.position = "relative";
  90. panel.appendChild(buttonPanel);
  91. panel.appendChild(canvas);
  92. window.setTimeout(function(){
  93. for(var i=0;i<imgUrls.length;i++){
  94. ctx.drawImage(imgUrls[i],0,0);
  95. }
  96. if(canvas.msToBlob){
  97. var button = document.createElement("input");
  98. buttonPanel.appendChild(button);
  99. button.type = "button";
  100. button.value = "保存";
  101. button.onclick = function(){
  102. window.navigator.msSaveBlob(canvas.msToBlob(), 'map.png');
  103. }
  104. }
  105. else{
  106. var aa = document.createElement("a");
  107. buttonPanel.appendChild(aa);
  108. aa.target = "_blank";
  109. aa.download="map.png";
  110. aa.href=canvas.toDataURL();
  111. var button = document.createElement("input");
  112. aa.appendChild(button);
  113. button.type = "button";
  114. button.value = "保存";
  115. }
  116. var button = document.createElement("input");
  117. buttonPanel.appendChild(button);
  118. button.type = "button";
  119. button.value = "关闭";
  120. button.onclick = function(){
  121. document.body.removeChild(panel);
  122. }
  123. },30);
  124. }
  125. }
  126. //截取图片图层
  127. function getImgLayerData(layer,map){
  128. var div = layer.div;
  129. var pdiv = div.parentNode;
  130. var offsetX = parseInt(pdiv.style.left.replace(/px/,""));
  131. var offsetY = parseInt(pdiv.style.top.replace(/px/,""));
  132. var canvas = document.createElement("canvas");
  133. var size = map.getSize();
  134. canvas.height = size.h;
  135. canvas.width = size.w;
  136. var ctx = canvas.getContext("2d");
  137. canvas.style.position = "absolute";
  138. canvas.style.left = "5px";
  139. canvas.style.top = "600px";
  140. canvas.style.border = "1px solid #f00";
  141. //document.body.appendChild(canvas);
  142. var divs = div.getElementsByTagName("div");
  143. for(var i=0;i<divs.length;i++){
  144. var div1 = divs[i];
  145. if(div1.style.display!="none"){
  146. var left = parseInt(div1.style.left.replace(/px/,""));
  147. var top = parseInt(div1.style.top.replace(/px/,""));
  148. var img = div1.getElementsByTagName("img")[0];
  149. var imgWidth = img.style.width;
  150. var imgHeight = img.style.height;
  151. var imgW = null,imgH = null;
  152. if(imgWidth!=null||imgWidth!=""){
  153. imgW = parseInt(imgWidth.replace(/px/,""));
  154. }
  155. if(imgHeight!=null||imgHeight!=""){
  156. imgH = parseInt(imgHeight.replace(/px/,""));
  157. }
  158. if(imgW!=null&&imgH!=null){
  159. ctx.drawImage(img,left+offsetX,top+offsetY,imgW,imgH);
  160. }
  161. else{
  162. ctx.drawImage(img,left+offsetX,top+offsetY);
  163. }
  164. }
  165. }
  166. var imageUrl = canvas.toDataURL("image/png");
  167. var img = new Image();
  168. img.src = imageUrl;
  169. return img;
  170. }
  171. //截取canvas图层
  172. function getCanvasLayerData(layer){
  173. var div = layer.div;
  174. var canvas0 = div.getElementsByTagName("canvas")[0];
  175. var imageUrl = canvas0.toDataURL("image/png");
  176. var img = new Image();
  177. img.src = imageUrl;
  178. return img;
  179. }
  180. //截取Vector图层
  181. function getVectorLayerData(layer,map,callback){
  182. var printLayer,
  183. strategies = [],
  184. features1 = [],
  185. features = layer.features,
  186. layerStrategies = layer.strategies;
  187. //GeoText无法截图问题修复
  188. if(layerStrategies){
  189. for(var i = 0; i<layerStrategies.length; i++){
  190. if (layerStrategies[i].CLASS_NAME === "SuperMap.Strategy.GeoText"){
  191. strategies.push(layerStrategies[i].clone());
  192. }else{
  193. strategies.push(layerStrategies[i]);
  194. }
  195. }
  196. printLayer = new SuperMap.Layer.Vector("PRINT_LAYER", {strategies: strategies, visibility: true, renderers: ["Canvas"]});
  197. }else{
  198. printLayer = new SuperMap.Layer.Vector("PRINT_LAYER", {visibility: true, renderers: ["Canvas"]});
  199. }
  200. map.addLayer(printLayer);
  201. for(var j=0;j<features.length;j++){
  202. var feature = features[j];
  203. var feature1 = new SuperMap.Feature.Vector();
  204. feature1.geometry = feature.geometry.clone();
  205. feature1.style = feature.style;
  206. features1.push(feature1);
  207. }
  208. if(layer.style){
  209. printLayer.style = layer.style;
  210. }
  211. printLayer.setOpacity(0);
  212. printLayer.addFeatures(features1);
  213. window.setTimeout(function(printLayer,map,callback){
  214. return function(){
  215. var div = printLayer.div;
  216. var canvas1 = div.getElementsByTagName("canvas")[0];
  217. var cxt1 = canvas1.getContext("2d");
  218. var imageUrl = canvas1.toDataURL("image/png");
  219. map.removeLayer(printLayer);
  220. printLayer.destroy();
  221. var img = new Image();
  222. img.src = imageUrl;
  223. callback(img);
  224. }
  225. }(printLayer,map,callback),30);
  226. }
  227. //截取Plotting图层
  228. function getPlottingLayerData(layer,map,callback){
  229. var printLayer,
  230. features1 = [],
  231. features = layer.features,
  232. printLayer = new SuperMap.Layer.PlottingLayer("PRINT_LAYER", layer.serverUrl, {visibility: true, renderers: ["Canvas"]});
  233. //printLayer.spatialAnalystUrl = layer.spatialAnalystUrl;
  234. map.addLayer(printLayer);
  235. for(var j=0;j<features.length;j++){
  236. if(features[j].geometry instanceof SuperMap.Geometry.PlottingGeometry){
  237. var feature = features[j];
  238. var feature1 = SuperMap.Plot.PlottingUtil.copyFeature(feature);
  239. features1.push(feature1);
  240. } else {
  241. var feature1 = new SuperMap.Feature.Vector();
  242. feature1.geometry = features[j].geometry.clone();
  243. feature1.style = features[j].style;
  244. features1.push(feature1);
  245. }
  246. }
  247. if(layer.style){
  248. printLayer.style = layer.style;
  249. }
  250. printLayer.setOpacity(0);
  251. printLayer.addFeatures(features1);
  252. window.setTimeout(function(printLayer,map,callback){
  253. return function(){
  254. var div = printLayer.div;
  255. var canvas1 = div.getElementsByTagName("canvas")[0];
  256. var cxt1 = canvas1.getContext("2d");
  257. var imageUrl = canvas1.toDataURL("image/png");
  258. map.removeLayer(printLayer);
  259. printLayer.destroy();
  260. var img = new Image();
  261. img.src = imageUrl;
  262. callback(img);
  263. }
  264. }(printLayer,map,callback),30);
  265. }
  266. })();