开始使用 Mapfile

MapServer 的核心程序用来根据地理空间数据生成地图, 配置使用 CGI 的功能,给予了其WebGIS的功能。MapServer 使用配置文件来声明生成地图的大小、格式, 用到的数据所有的路径、名称、格式,以及种种更加复杂的控制选项,这个配置文件被称为 Mapfile 。Mapfile 是分多层次的,每个地图文件都会定义大量其它的对象。这些对象包括比例尺、图例、地图配色、地图名称以及地图图层等等。还有更多的对象需要定义,在接下来的章节中会有更详细的讨论。此外,还有专门的 MapServer关键词的综合参考。

第一个应用程序使用了简单的 Mapfile ,实际上不会生成地图,它会生成矩形的图片,显示出来单词“Hello World”。这个应用十分简单,因此配置的问题或错误都会很容易的找到。

使用每个对象时都会进行解释。该程序没有使用到任何的资源,如空间数据、符号以及字体等等。然而,它却需要空间来存储图像。你将看到如何在MapServer中指定图像的目录并确定Apache能够找到这个目录。

不使用数据的“地图”

先来看一下 MapServer 的基本用法,不使用任何的GIS数据。下图即为效果:

上面显示的是图片,用的代码是:

<img border="1" src="http://www.osgeo.cn/webgis/cgi-bin/mapserv?map=/oswebgis/xmfa0.map&mode=map"/>

上面代码是 HTML 中声明图片的基本用法,不过 src 的参数并不是常见的 Jpeg, PNG, GIF等图片格式,而是 MapServer CGI 程序,以及一些参数。这里只需要知道 MapServer CGI程序会根据这些参数来返回一幅图片,因此上面的 HTML 图片声明其实没有什么特别;在稍后会对其机理进行阐述。

Mapfile 的基本用法

Mapfile 定义了制图对象的集合,这些对象对一起决定页面显示的地图的外观和行为。它与Apache的 httpd.conf 配置文件的功能类似。基于同一地理数据,制图应用使用不同的 Mapfile 能够呈现不同特点的地图,对应着用户的不同行为。

可能看起来静态配置文件的功能会有限,但是 MapServer 的设计使得使用 Mapfile 可以生成十分强大的应用程序。

地图文件的定义由关键值对组成。所列的一些值被空格隔开,所列的这些值必须用括号括起来。单括号和双括号都可以。

含有嵌入空格的关键字值必须括起来,对所有的字符串括起来都是很好的习惯。

同时要注意MapServer的关键字不区分大小写,但是一些数据库获取的方法对大小写敏感。

在MapServer中,要生成上面的图片,使用的 Mapfile 代码为:

01 MAP
02     NAME "Hello World"
03     SIZE 400 300
04     IMAGECOLOR 249 245 186
05     IMAGETYPE "png"
06     EXTENT -1.0 -1.0 1.0 1.0
07     WEB
08         TEMPLATE "/oswebgis/beg_hello.html"
09         IMAGEPATH "/oswebgis/ms_tmp/"
10         IMAGEURL "/ms_tmp/"
11     END
12     LAYER
13         STATUS DEFAULT
14         TYPE POINT
15         FEATURE
16             POINTS
17                 0.0 0.0
18             END
19             TEXT "Hello, MapServer world!"
20         END
21         CLASS
22             STYLE
23                 COLOR 255 0 0
24             END
25             LABEL
26                 TYPE BITMAP
27             END
28         END
29     END
30 END

第一个 Mapfile

代码如下,0106 行建立了基本的地图图像参数。关键字 NAME 定义创建的任何图像的基本名称。MapServer每次调用时,它会创建一个唯一的标识符,通过连接系统时间(即自1970年1月1日00:00:00的秒数)和进程ID。这种独特的标识符被附加到的基本名称上,形成的文件名。两或三个字符扩展(这取决于文件类型),然后追加。在某些情况下,地图服务器的基本名称后插入另一个字符串,区分从地图图像本身的参考地图图像或图例图像。

关键字 SIZE 指定地图图像的像素尺寸(宽×高)。

IMAGECOLOR 设置的背景色为白色的图像(回想一下,颜色的选择在地图服务器通过指定三个整数的RGB分量值0和255之间,白色为255,255,255)。

图像类型设置为 PNG 。在 Mapfile 中也可以使用 JPEG , 或 GIF 图像。

图层对象在地图对象之下定义。在展示一个地图之前,至少需要在你的地图文件中定义一个图层。在 MapServer 中可以定义任意多的图层。在旧版本的 MapServer 中图层的数目上限定义在 源代码 map.h 中,限制为100个;可以通过修改源代码来解除这种限制。但在目前常用 Linux 发行版中已经没有此限制。

绘制内容

MapServer现在已经知道要生产什么样的地图,包括大小和背景颜色,以及怎样在网络页面中显示地图。但是现在还不清楚画什么以及怎样画-这些工作由LAYER对象负责。

图层应用单个的数据集并包含了一系列的元素,使用特定的投影(本书后面部分将包括投影的内容)可以把这些内容在特定的尺度上描绘出来。图层以关键字 LAYER 生成,以关键字 END 结束。

关键字 STATUS 决定了图层是否被渲染。默认值Default 意味着总是被渲染。

每个图层都拥有一个几何类型。在这个例子中,要素是点要素(一对坐标值),选用点要素是为了简化例子。

关键字TYPE的值选为 POINT (下一章中将会对图层类型进行更为详尽的描述)。

为了能够生成地图,MapServer必须拥有空间数据。不是使用真实世界复杂的数据来描述杂乱的“Hello World”地图,而是用人工坐标点(0.0,0.0)进行构建。

往hello.map添加下面内容。

  • 关键字 FEATURE 指定了联系的地理要素。 不是从空间数据库中读取记录,FEATURE允许快速的创建“要素”。
  • 关键字 FEATURE 仅能在LAYER对象内部使用,必须以关键字 END 结束。 通过坐标点再来指定要素。
  • 关键字 POINTS 描述了列出的坐标点对。数值由空格分开。 很明显,数值的数量必须是偶数。 列出的值代表单个的点(如果仅仅是一个坐标对的话),可以代表线(如果多于一对)。
  • 如果第一对坐标与最后一对相同,那么列出的值就是多边形(等于第一个点和最有一个点闭合了图形)。 关键字 END 作为结束。
  • 关键字 TEXT 指定了文本字符串,用于标注该要素。再次强调,如果有空格的话,必须放在引号内。

往hello.map添加下面内容。

  • 在每一层中,需要定义一个或多个类( CLASS )。 默认的类别没有特定的选择将会把数据集中所有的元素进行描绘。 如果指定了选择标准,那么只有满足选择标准的内容才会被描绘。
  • 标签,线的形状,注记类型,以及描绘要素的颜色等 都会在类的水平上进行定义。
  • STYLE 对象定义了符号的特性,符号在类中用于绘制要素。为了简化,本案例中值定义了颜色。 STYLE 对象由关键字 END 最为结束。
  • 关键字 COLOR 决定了要素的颜色,通过设置 RGB 组分来决定颜色。 数值在 0-255 之间。这里,要素被设置为红色的点,默认大小 为1像素。
  • CLASS 同时还包括 LABEL 对象。 LABEL对象在类内进行描述,并指定了标签的字体类型、大小和颜色。 标签的相关内容远比这复杂的多,本书后面部分将进行更为详尽的讨论。 标签由关键字 LABEL 开始,由 END 作为结束。
  • 关键字 TYPE 决定了标签字体的类型。 有两种类型: bitmapped 标准和 TrueType 标准。 Bitmapped字体由内部生成不需要外部的参考。 TrueType必须安装,还必须通过关键字FONTSET定义的文件中的别名来确定。 为了简化,例子使用bitmapped字体。

需要注意的是标签默认的颜色是黑色-当然也可以是其它不同的颜色,但是现在使用默认值是为了简化例子。

刚才展现的地图文件结构十分简单,它生成的地图根本就不能称之为地图。但是它应该描绘一幅带有标签的图像并在网络页面进行展示。

查看结果

有了 MapFile,可以使用下面命令将其渲染成为图片。

shp2img  -m hello.map  -o out.png