arcgis server jsapi 地图打印:多图层打印(tiled+dynamic地图服务)

本文档介绍了如何使用ArcGIS Server JavaScript API实现包含tiled和dynamic地图服务的多图层地图打印。主要涉及了代理设置、打印代码结构、关键类如PrintableLayer.js和MergeAndOutput.ashx的实现,以及打印页面布局和交互。通过示例代码和步骤,展示了地图打印的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做个地图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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值