闪光输出

作者

杰夫麦克纳

联系

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 对象。有两种可能的输出类型:

  1. 包含所有图层的栅格输出的单个影片。要启用此功能,请在映射文件中声明以下内容:

    OUTPUTFORMAT
      NAME swf
      MIMETYPE "application/x-shockwave-flash"
      DRIVER swf
      IMAGEMODE PC256
      FORMATOPTION "OUTPUT_MOVIE=SINGLE"
    END
    
  2. 每层的电影(矢量层的矢量电影和栅格层的栅格电影)。要启用此功能,请在映射文件中声明以下内容:

    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”组件。

当前支持和不支持的内容

  1. 矢量层

    • 层点(案例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)

    • 向量低阶函数

      • OMSDrawmarkers符号

        • case(ms_-symbol_-truetype):完成

        • case(ms_symbol_pixmap):完成

        • 大小写(ms_符号_椭圆):完成

        • 案例(ms_符号_矢量):完成

      • OMSDrawLineSymbol(OMSDrawLineSymbol)

        • 案例:简单行:完成

    • 带符号的绘图:未完成

      • OMSDrawshadesymbol公司

        • 案例:实心填充多边形:完成

        • 案例:填充符号:暂时无法实现(尝试创建gd图像以填充形状,但创建的文件很大)

      • omscircledrawlinesymbol:未完成

      • omscircledrawshadesymbol:未完成

      • OMSDrawLabel:完成

      • omsdrawLabelCache:完成

      • Obillboard(文本阴影):未完成

  2. 栅格层

    • msdrawrasterlayer:完成

  3. WMS层

    • msdrawwwmslayer:完成

  4. 环绕组件(图例、比例尺):不支持