开始使用 Mapfile

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

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

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

语法

  • MapFile 文件忽略字母大小写
  • 非字母字符串或者包含 MapServer关键字的字符串必须使用引号包含,推荐对所有的字符串都是有双引号包含。
  • MapFile 中的文件路径可以使用绝对路径,也可以使用相对路径, 其中相对路径是相对于 SHAPEPATH 的路径。
  • MapFile 有特定的层次结构,Map Object 是 MapFile 的“根”,其他的对象都在其下。
  • MapFile 文件中的注释以 # 开始,从 # 开始到本行末尾为被注释的部分, 程序执行时将忽略这部分的内容。书写注释是一个良好的习惯,推荐。

对你写的 MapFile 加上适当的注释,这样可以方便其他人来理解你的文件。如:

# ================================================================
# MapFile for World Map
# Created by Bu Kun 
# Created 2019-4-20
# ----------------------------------------------------------------
# Revision History    
# ----------------------------------------------------------------
  • 属性名使用的语法为 [ATTRIBUTENAME] 。注意:属性名包含在方括号内,并且区分大小写。 在 ESRI 的 ShapeFile 文件(.dbf)中所有的属性名都为大写,而 PostGIS 中的属性名全部为小写。

MapServer 中的正则表达式的使用依赖于你使用的操作系统使用的 C 语言库。了解相关的详细信息,请参考 C 语言库提供的参考文档。Linux 下这个库为 GlibC,在此系统下你可以使用 man 7 regex 。这些正则表达式的是与 POSIX 兼容,所以在 Windows下用户可以在互联网上搜索”man 7 regex”。

INCLUDE

从 MapServer 5.0 开始,可以使用 INCLUDE 命令是多个 MapFile 文件形成逻辑上的单个文件。

例子:在 mymap.map 文件中包含 mylayer.map mymap.map 的内容如下

# ===========================
#mymap.map
# Create By YanMing
#============================ MAP
 „„
    INCLUDE “mylayer.map”
 „„
END

mylayer.map 的内容如下

# ===========================
# mylayer.map
# Create By YanMing
#============================
LAYER
                 NAME mylayer
                 DATA mylayer
 TYPE POLYGON  STATUS ON
END

在这种情况下 mymap.map 逻辑上相当于:

# ===========================
#mymap.map
# Create By YanMing
#============================
MAP
    LAYER
        NAME mylayer
        DATA mylayer
        TYPE POLYGON   STATUS ON
        „„
    END
END

CGI 变量

变量是可以在 MapFile 文件中被替代的参数(与编程语言中的变量类型,在程序中可以为其赋值等)。在这种情况下,支持 cookie 和 CGI parameter values,这就可以使 MapServer MapFiles 获得用户的 cookies(这样可以实现安全认证),或非 MapServer 的请求参数。

语法: % + 变量名 + %

例 1:安全连接空间数据库

你需要访问 PostGIS 数据库。用户名和密码在以前的操作中被保存在 cookie 中, uidpasswd 。那么在 MapFile 中可以这样写:

CONNECTION "user=%uid% password=%passwd% dbname=postgis"

例 2:处理临时文件

一个程序要生成对应的 shapefile 并将生产的数据存放到服务器用户对应的目录中。username 可以从 cookie 中获得,filename 可以从请求参数数获取。

DATA "/home/%username%/tempshp/%filename%"

这样的参数只能在 CGI版本的MapServer中使用,如果你你使用 MapScript,你需要自己出来对应的逻辑来实现这样的功能 。

不使用数据的“地图”

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

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

<img border="1" src="http://webgis.cn/cgi-bin/mapserv?map=/owg/mfa0.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 200
04     IMAGECOLOR 249 245 186
05     IMAGETYPE "png"
06     EXTENT -1.0 -1.0 1.0 1.0
07     LAYER
08         STATUS DEFAULT
09         TYPE POINT
10         FEATURE
11             POINTS
12                 0.0 0.0
13             END
14             TEXT "Hello, MapServer world!"
15         END
16         CLASS
17             STYLE
18                 COLOR 255 0 0
19             END
20             LABEL
21                 TYPE BITMAP
22             END
23         END
24     END
25 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