闪光输出¶
- 作者
杰夫麦克纳
- 联系
jmckenna在gatewaygeomatics.com
- 作者
叶旺沃森阿塞法
- 联系
位于dmsolutions.ca的Assefa
- 最后更新
2008-07-15
介绍¶
警告
自6.0版起不再支持SWF
自MapServer 4.0以来,MapServer可以以SWF格式(或“Shockwave Flash格式”)输出闪存文件。以下文档概述了如何在MapServer中启用闪存输出。
安装支持Flash的MapServer¶
要检查您的mapserv可执行文件是否包含flash支持,请使用“-v”命令行开关并查找“output=swf”。
$ ./mapserv -v
MapServer version 5.2.0-rc1 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP
OUTPUT=PDF OUTPUT=SWF OUTPUT=SVG SUPPORTS=PROJ SUPPORTS=AGG
SUPPORTS=FREETYPE SUPPORTS=ICONV SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT
SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER
SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS
SUPPORTS=GEOS SUPPORTS=RGBA_PNG INPUT=JPEG INPUT=POSTGIS
INPUT=ORACLESPATIAL INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE
使用预编译的二进制文件¶
Windows用户可以使用 MS4W ,支持SWF输出。
使用Flash支持编译MapServer¶
选择输出SWF文件的库是 Ming library . 明是一个用于生成SWF(“Flash”)格式电影的C库,它包含一组包装器,用于从C++和流行的脚本语言(如PHP、Python和Ruby)使用库。
在窗户上建造¶
下载 Ming library (当前支持的版本为0.2a)
截至ming 0.3,尚未在分发版中提供用于Windows的makefile,但您可以从下载MS VC++makefile(makefile.vc) here (包含makefile和libming.lib)
复制src目录下的makefile.vc(ming-0.2/src)
执行:
nmake /f makefile.vc
此时,您应该有一个libming.lib,它将与mapserver链接。
编辑mapserver目录中的nmake.opt,取消对ming=-duse-ming-u flash标志的注释,并将ming-dir指向ming目录。
像往常一样构建mapserver
在Unix上构建¶
使用“--with ming”配置标志在UNIX上启用ming支持。--使用ming=dir“将尝试在指定目录中查找包含文件和库。
Note: compiling MapServer 4.4.2 with flash support (mingbeta version 0.3) requires
the -DMING_VERSION_03 option otherwise the make fails. This option should be included
in the configure.in after -DUSE_MING_FLASH as below:
MING ENABLED= "-DUSE_MING_FLASH -DMING_VERSION_03"
如何从MapServer输出SWF文件¶
SWF输出通过使用 OUTPUTFORMAT 对象。有两种可能的输出类型:
包含所有图层的栅格输出的单个影片。要启用此功能,请在映射文件中声明以下内容:
OUTPUTFORMAT NAME swf MIMETYPE "application/x-shockwave-flash" DRIVER swf IMAGEMODE PC256 FORMATOPTION "OUTPUT_MOVIE=SINGLE" END
每层的电影(矢量层的矢量电影和栅格层的栅格电影)。要启用此功能,请在映射文件中声明以下内容:
OUTPUTFORMAT NAME swf MIMETYPE "application/x-shockwave-flash" DRIVER swf IMAGEMODE PC256 FORMATOPTION "OUTPUT_MOVIE=MULTIPLE" END
其他输出格式选项¶
格式选项“完全分辨率=假”
全分辨率仅适用于矢量层。如果设置为false,将对向量元素应用过滤。它产生一个较小的SWF文件。默认值为true。
formatOption“自动加载”=off
将此选项设置为“关闭”不会为每个层加载SWF文件。默认值为“开”。
生成的SWF文件的组成¶
几个SWF文件将从一个 Mapfile 中生成: Mapfile 中定义的每个图层将有一个SWF文件,以及一个“主”SWF文件,其中包含 Mapfile 和生成的图层上的关键信息。
“主”SWF文件将包含操作脚本(AS)代码,该代码提供有关映射文件和生成的SWF层的关键信息。基本上会有一个名为mapobj的对象,其中包含高度、宽度、范围、比例、层数等。下面是这部主要电影内容的一个示例(在as中):
mapObj = new Object (); mapObj.name = "DEMO_SWF"; mapObj.width = 400; mapObj.height = 300; mapObj.extent = "-2594561.353333,3467361.353333,3467361.353333,3840000.000000"; ; mapObj.numlayers = 4; mapObj.layers = new Array (); function LayerObj (name, type, fullname, relativename) { this.name = name; this.type = type; this.fullname = fullname; this.relativename = relativename; } mapObj.layers[0] = new LayerObj ("park", "2", "c:/tmp/ms_tmp/102389536132841_layer_0.swf", "102389536132841_layer_0.swf"); mapObj.layers[1] = new LayerObj ("popplace", "4", "c:/tmp/ms_tmp/102389536132841_layer_1.swf", "102389536132841_layer_1.swf"); mapObj.layers[2] = new LayerObj ("rail", "1", "c:/tmp/ms_tmp/102389536132841_layer_2.swf", "102389536132841_layer_2.swf"); mapObj.layers[3] = new LayerObj ("road", "1", "c:/tmp/ms_tmp/102389536132841_layer_3.swf", "102389536132841_layer_3.swf");
这个例子是基于一个映射文件生成的,其中定义了两个层。我们创建一个包含层上有用信息的层类对象。参数为:
名称:在 Mapfile 中找到的名称
类型:图层类型(0=点图层;1=直线;2=多边形;3=栅格;4=注释;6=圆)
全名:包含路径的文件的全名
相对名称:相对名称
例如,可以使用mapobj.layers[0].name提取第一层的名称。
注意:此时不会导出MapServer中的所有映射参数。我们应该列出我们想要输出的信息。请注意,此信息可以在闪存应用程序中用于加载SWF文件、构建图例、构建比例尺等。
每层的SWF文件
映射文件中定义的每个层都将创建一个关联的SWF文件。这些SWF文件的名称基于主文件的名称,并在名称末尾添加“layer_x”(其中x是层索引)。
这些SWF文件将包含矢量和栅格数据以及一些动作脚本,具体取决于图层和 Mapfile 中的某些配置。我们将在下面的部分中详细介绍这些配置。
导出属性¶
导出属性在层的基础上工作(它仅适用于矢量层)。为了能够将属性导出到SWF文件,必须在映射文件的图层部分定义一个名为SWFDumpAttributes的元数据项。下面是一个例子:
...
LAYER
NAME park
METADATA
"DESCRIPTION""Parks"
"RESULT_FIELDS" "NAME_E YEAR_EST AREA_KMSQ"
"SWFDUMPATTRIBUTES" "NAME_E,AREA_KMSQ "
END
TYPE POLYGON
STATUS ON
DATA park.shp
...
在上面的示例中,将为层中的每个元素导出属性name_e和area_kmsq的值。
生成的SWF文件将具有这些属性的值(写在操作脚本中)。下面是与上述层相关的示例:
nAttributes= 2;
Attributes = new Array();
Attributes[0] = "NAME_E";
Attributes[1] = "AREA_KMSQ";
Element = new Array ();
Element[0] = new Array();
Element[0][0] = "Ellesmere Island National Park Reserve";
Element[0][1] = "1500";
Element[1][0] = " Aulavik National park";
Element[1][1] = "1500";
活动和亮点¶
下面是当前实现的关于事件的内容(这里的事件指的是发生在元素上的鼠标事件)。可用事件有mouseup、mousedown、mouseover、mouseout):
事件仅可用于已导出定义属性的层(使用swfdumpattributes)。这就像定义某个层是可查询的。
当鼠标事件在其中一个元素上发生时,会进行一个操作脚本调用:_root.elementselectd(layerID、shapeID、event)。想要接收这些事件的flash应用程序应该定义所选的函数元素,并使用接收到的信息来执行一些操作,比如从指定形状的特定swf中检索属性值并显示它。
为了突出显示,必须在生成SWF时定义它(突出显示基本上意味着使用不同颜色重新绘制形状)。
从MapServer 5.0开始,通过使用映射文件中的querymap对象提取颜色并在mouseover时进行突出显示,可以在可查询层上进行突出显示。当前的实现将使用mapfile中querymap对象中的颜色集突出显示使用swfdumpattributes的层中的所有对象。
在mapserver 5.0之前,使用swfdumpattributes的层中的所有对象都使用红色高亮显示。
字体¶
ming使用一种称为fdb文件的特殊字体。它还不支持TrueType字体。请参阅Ming文档了解如何 produce FDB files .
输出矢量图层的栅格SWF¶
一种机制是使用层对象的元数据来定义矢量层的栅格输出。我们可以使用“swfoutput”“栅格”之类的工具。如果这听起来是可取的,请提交一个增强 ticket 通过这个请求,指定“输出SWF”组件。
当前支持和不支持的内容¶
矢量层
层点(案例ms_layer_point):完成
msdrawmarkersymbol公司
MSDRAW标签
层线(case ms_layer_line):完成
msdrawlineSymbol(msdrawlineSymbol)
MSDRAW标签
层圆(case ms_layer_circle): not done (应容易完成,但缺少测试数据)
omscircledrawlinesymbol(omscircledrawlinesymbol)
omscirledrawshadesymbol公司
层注释(case ms_layer_annotation):完成
OMSDrawmarkers符号
OMSDrawLabel(OMSDrawLabel)
层多边形(ms_shape_polygon):完成
OMSDrawshadesymbol公司
OMSDrawLineSymbol(OMSDrawLineSymbol)
OMSDrawLabel(OMSDrawLabel)
向量低阶函数
带符号的绘图:未完成
OMSDrawshadesymbol公司
案例:实心填充多边形:完成
案例:填充符号:暂时无法实现(尝试创建gd图像以填充形状,但创建的文件很大)
omscircledrawlinesymbol:未完成
omscircledrawshadesymbol:未完成
OMSDrawLabel:完成
omsdrawLabelCache:完成
Obillboard(文本阴影):未完成
栅格层
msdrawrasterlayer:完成
WMS层
msdrawwwmslayer:完成
环绕组件(图例、比例尺):不支持