MapServer 的核心程序用来根据地理空间数据生成地图, 配置使用 CGI 的功能,给予了其WebGIS的功能。MapServer 使用配置文件来声明生成地图的大小、格式, 用到的数据所有的路径、名称、格式,以及种种更加复杂的控制选项,这个配置文件被称为 Mapfile 。Mapfile 是分多层次的,每个地图文件都会定义大量其它的对象。这些对象包括比例尺、图例、地图配色、地图名称以及地图图层等等。还有更多的对象需要定义,在接下来的章节中会有更详细的讨论。此外,还有专门的 MapServer关键词的综合参考。
第一个应用程序使用了简单的 Mapfile ,实际上不会生成地图,它会生成矩形的图片,显示出来单词“Hello World”。这个应用十分简单,因此配置的问题或错误都会很容易的找到。
使用每个对象时都会进行解释。该程序没有使用到任何的资源,如空间数据、符号以及字体等等。然而,它却需要空间来存储图像。你将看到如何在MapServer中指定图像的目录并确定Apache能够找到这个目录。
SHAPEPATH
的路径。 #
开始,从 #
开始到本行末尾为被注释的部分, 程序执行时将忽略这部分的内容。书写注释是一个良好的习惯,推荐。对你写的 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”。
从 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
变量是可以在 MapFile 文件中被替代的参数(与编程语言中的变量类型,在程序中可以为其赋值等)。在这种情况下,支持 cookie 和 CGI parameter values,这就可以使 MapServer MapFiles 获得用户的 cookies(这样可以实现安全认证),或非 MapServer 的请求参数。
语法: %
+ 变量名
+ %
例 1:安全连接空间数据库
你需要访问 PostGIS 数据库。用户名和密码在以前的操作中被保存在 cookie
中, uid
和 passwd
。那么在 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 定义了制图对象的集合,这些对象对一起决定页面显示的地图的外观和行为。它与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
代码如下,01
至 06
行建立了基本的地图图像参数。关键字 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