iClient for Flex 为用户提供了地图的打印功能,支持大幅地图的客户端打印和简单排版,但局限于各种图层(特别是用户自定义图层)获取图层信息的url方式、参数各不相同,因此默认只支持包括iClient Flex产品核心库和6R库中的图层。对于用户自定义的扩展图层,用户可以通过非常简单的方式扩展打印功能实现图层对地图打印的支持。
这里对几个相关的接口类简单介绍:
MapPrintContainer 地图打印切图实现类
MapInfo 打印范围等的信息存储类
根据图层是否分块分两大类:
1、不分块图层
指的是服务端根据客户端请求,每次都动态的切出指定大小范围和分辨率的地图。
针对这样的图层,用户只需要在扩展中覆盖已有的接口getDynamicURL,返回对应的服务端请求url字串即可
protected function getDynamicURL(layer:Layer, mapInfo:MapInfo):String;
layer 需要切图的具体图层对象,提供获取url的主要信息
mapInfo 提供当前所需的地图bounds,宽高等信息(都由内部计算分割好,用户只需负责直接使用)
2、分块图层
分块图是实际应用的最常见图层,针对不同图层服务端需求的信息有所不同,除了图层基础信息外,一般包含有图块行列号、分辨率/比例尺、(分辨率/比例尺)级别等。
针对这样的图层,用户需要扩展覆盖如下接口:
protected function getTiledURL(layer:Layer, mapInfo:MapInfo, row:Number, col:Number, level:int):String;
layer 需要切图打印的具体图层对象,提供获取url的主要信息
mapinfo 提供当前所需的地图bounds,宽高等信息
row 当前图块的行
col 当前图块的列
level 当前图块对应的分辨率级别
另外出图所需的resolution分辨率信息可以通过属性this.resolution来获取
(上书接口信息只是为了适应更多场景,用户可以根据需要自行选择,而不一定需要所有的信息)
3、示例。
这里我们用天地图的扩展为例来说明接口的具体使用,代码在SampleCode中有示范,相关代码:
src/applications/PrintMap.mxml src/com/supermap/samples/printMap/*.*;
上述代码为打印功能提供了相应的参考界面和使用方式,以供用户参考。
扩展代码主要参见CustomMapPrintContainer.as:接口复写代码如下
overrideprotectedfunctiongetTiledURL(layer:Layer, mapinfo:MapInfo, row:Number, col:Number, level:int):String
{
if(layer isTiledTDTLayer)
{
if( -1 == level)
{
return"";
}
vartdtLayer:TiledTDTLayer = layer asTiledTDTLayer;
level += 2;
varserverURL:String;
switch(tdtLayer.mapType)
{
caseTiledTDTLayer.MAP_TYPE_VECTOR:
if(level<=10)
{
if(tdtLayer.isLabel)
serverURL = tdtLayer.VECTOR_URL_WORLD_LABEL;
else
serverURL = tdtLayer.VECTOR_URL_WORLD;
}
elseif(level>10 && level <= 12)
serverURL = tdtLayer.VECTOR_URL_CHINA_1;
elseif(level>12 && level <= 18)
serverURL = tdtLayer.VECTOR_URL_CHINA_2;
break;
caseTiledTDTLayer.MAP_TYPE_AERIAL:
if(level<=10)
{
if(tdtLayer.isLabel)
serverURL = tdtLayer.AE_URL_LABEL_1;
else
serverURL = tdtLayer.AE_URL_1;
}
else
{
switch(level)
{
case 11:
if(tdtLayer.isLabel)
serverURL = tdtLayer.AE_URL_LABEL_1113;
else
serverURL = tdtLayer.AE_URL_11;
break;
case 12:
if(tdtLayer.isLabel)
serverURL = tdtLayer.AE_URL_LABEL_1113;
else
serverURL = tdtLayer.AE_URL_12;
break;
case 13:
if(tdtLayer.isLabel)
serverURL = tdtLayer.AE_URL_LABEL_1113;
else
serverURL = tdtLayer.AE_URL_13;
break;
case 14:
if(tdtLayer.isLabel)
serverURL = tdtLayer.AE_URL_LABEL_2;
else
serverURL = tdtLayer.AE_URL_14;
break;
default:
if(tdtLayer.isLabel)
serverURL = tdtLayer.AE_URL_LABEL_2;
else
serverURL = tdtLayer.AE_URL_2;
break;
}
}
}
serverURL = serverURL.replace("{subdomain}", Math.round(Math.random() * 5).toString());
serverURL = serverURL.replace("{tileX}", col.toString());
serverURL = serverURL.replace("{tileY}", row.toString());
serverURL = serverURL.replace("{level}", level.toString());
returnserverURL;
}
returnsuper.getTiledURL(layer, mapinfo, row, col, level);
}
A、代码解释和注意事项:
a) 针对不同图层只需实现对应的getXXXURL()接口。
b) 接口最后返回的是URL字符串,区别于扩展图层时候的URLRequest对象
c) 两者的代码逻辑内容基本相似,注意原来用this.XX获取的属性信息现在统一使用layer.XX代替,resolution则用this.resolution来获取
d) 注意最后的returnsuper.getTiledURL(layer, mapinfo, row, col, level);确保这行代码有效执行到,否则会影响原支持图层的打印实现。
B、修改完成后的部署使用
覆盖PrintWindow中的MapPrintContainer用CustomMapPrintContainer代替,检查代码结构无误后在printMap.mxml中添加自定的图层。启动代码则可以实现自定义图层的打印扩展。