最近做个地图print,坐了好久,现在终于解决了。
概要:本地图中包含tiled和dynamic的图层,同时输出打印;
首先:要有esri的代理proxy。这个不多说:直接去arcgis server帮助中心http://help.arcgis.com/zh-CN/webapps/sharepoint/help/index.html#//01590000004w000000查看;
注意的是:proxyconfig文件的配置!!!!
其次:代码结构:
TestPage.htm作为主页面,点击主页中的打印会弹出Layout的打印页面。
printing.js用来获取地图服务的url信息;
MergerAndOutput.ashx是一个用于tiled地图服务的切片融合的类文件,
在printableLayer.js中使用MergerAndOutput.ashx,PrintableLayer.js文件是一个创建Dynamic图层的类,将切片的图层融合后,然后加载到这个新的Dynamic图层中;
代码:
----------------------------------------------
PrintTableLayer.js
dojo.require("esri.utils");
dojo.declare("geoweb2book.PrintableLayer", esri.layers.DynamicMapServiceLayer,
{
constructor: function(url, options)
{
this.layers = options.layers;
this.initialExtent = this.fullExtent = options.extent;
this.spatialReference = this.initialExtent.spatialReference;
this.loaded = true;
this.onLoad(this);
},
//call mergeAndOutput.*, pass request JSON.
//process response JSON and return image url
getImageUrl: function(extent, width, height, callback)
{
try
{
var layersJson = [], layerJson;
dojo.forEach(this.layers, function(layer)
{
if (layer.visible)
{
layerJson = { url: layer.url, format: (layersJson.length == 0 ? "jpg" : "png"), opacity: layer.opacity};
if (layer.layers)
{
layerJson.layers = "show:" + layer.layers.join(",");
}
if (layer.layerDefs)
{
var defs = [];
dojo.forEach(layer.layerDefs, function(def, index)
{
if (def)
{
defs.push(index + ":" + def);
}
});
layerJson.layerDefs = defs.join(";");
}
layersJson.push(dojo.toJson(layerJson));
}
});
// JSON格式的请求
var json =
{
"width": width,
"height": height,
"extent": dojo.toJson(extent.toJson()),
"layers": layersJson
};
// 将请求发送到MergeAndOutput.ashx
var request=esri.request
({
url: this.url,
content: json,
handleAs: "json",
load: function(response, io)
{
// 当得到服务器的响应后,调用callback,并传递图像URL
callback(response.href);
},
error: this.onError
});
}
catch (err)
{
this.onError(err);
}
}
});
----------------------------------------------
printing.js
dojo.require("esri.map");
dojo.require("dojo.parser");
dojo.require("dijit.layout.BorderContainer");
dojo.require("dijit.layout.ContentPane");
//serialize the map's state and call layout.* through iframe
function printMap(m) {
var state = {
map: getMapState(m)
};
var printUrl="Layout.aspx?param="+dojo.toJson(state);;
window.open(printUrl);
}
function getMapState(m) {
var layerStates = [], graphicsState = [], graphics = m.graphics.graphics;
//serialize each layer's state
dojo.forEach(m.layerIds, function(layerId) {
layerStates.push(getLayerState(m.getLayer(layerId)));
});
//serialize graphics from last to first to retain graphics drawing order
for (var i = graphics.length - 1; i >= 0; i--) {
graphicsState.push(graphics[i].toJson());
};
return {
extent: m.extent.toJson(),
layers: layerStates,
graphics: graphicsState
};
}
function getLayerState(layer) {
return {
id: layer.id,
type: layer.declaredClass,
url: layer.url,
visible: layer.visible,
opacity: layer.opacity,
layerDefs: layer.layerDefinitions,
layers: layer.visibleLayers
};
}
----------------------------------------------
MergeAndOutput.ashx
<%@ WebHandler Language="C#" Class="MergeAndOutput" %>
using System;
using System.Web;
using System.Text;
using System.Collections.Generic;
using System.Web.Script.Serialization;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web.Extensions;
public class MergeAndOutput : IHttpHandler
{
public void ProcessRequest(HttpContext context)