1.3. 开始使用 Mapfile¶
MapServer的核心程序用于根据地理空间数据生成地图。配置使用CGI的功能,赋予其WebGIS的功能。MapServer使用配置文件来声明生成的地图的大小和格式、所有路径、名称、使用的数据格式以及各种更复杂的控制选项。此配置文件称为Mapfile。Mapfile 是多层的,每个 Mapfile 定义了大量的其他对象。这些对象包括比例尺、图例、地图颜色、地图名称、地图层等。还有更多的对象需要定义,并将在以下各节中更详细地讨论。此外,还有专门的MapServer关键字的全面参考。
第一个应用程序使用一个简单的 Mapfile ,并不实际生成地图,它生成一个显示单词“Hello World”的矩形图片。这个应用程序非常简单,所以很容易发现配置问题或错误。
每一件物品在使用时都有说明。该程序不使用任何资源,如空间数据、符号、字体等。然而,它需要空间来存储图像。您将看到如何在MapServer中指定图像的目录,并确保Apache可以找到该目录。
1.3.1. 语法¶
Mapfile 忽略字母大小写
非字母字符串或包含MapServer关键字的字符串必须用引号引起来,建议将所有字符串括在双引号中。
MapFile中的文件路径可以使用绝对路径或相对路径,其中相对路径是相对于
SHAPEPATH
。Mapfile 有一个特定的层次结构,地图对象是 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¶
从MapServer5.0开始,可以使用 INCLUDE
命令时,这些文件在逻辑上形成单个文件。
示例:在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参数值,这允许MapServerMapFiles获取用户Cookie(启用安全身份验证)或非MapServer请求参数。
语法: %
+ variable name
+ %
示例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中使用,如果使用MapScrip,则需要拿出相应的逻辑来实现这一功能。
1.3.2. 不使用数据的“地图”¶
让我们来看看在不使用任何GIS数据的情况下MapServer的基本用法。下图显示了效果:
上图所示代码为:
<img border="1" src="http://webgis.cn/cgi-bin/mapserv?map=/owg/mfa0.map&mode=map&format=jpeg" />
上面的代码是在HTML中声明图像的基本用法,但是 src
不是常见的图像格式,如Jpeg、PNG、GIF,而是MapServer的CGI程序和一些参数。这里您需要知道的是,MapServer CGI程序将根据这些参数返回一个图像,因此上面的HTML图像声明实际上并没有什么特别之处;其机制将在后面解释。
1.3.3. Mapfile的基本用法¶
Mapfile 定义了一组地图对象,这些对象共同决定了页面上显示的地图的外观和行为。它的功能类似于Apache的 httpd.conf
配置文件。基于相同的地理数据,地图应用程序可以使用不同的 Mapfile 来呈现具有不同特征的地图,对应于不同的用户行为。
静态配置文件的功能可能有限,但MapServer的设计是为了使用Mapfile可以生成非常强大的应用程序。
地图文件的定义由键值对组成。列出的一些值由空格分隔,必须用括号括起来,单括号和双括号都可以。
必须将包含空格的关键字值括起来,这对所有字符串都是很好的做法。
同时需要注意的是,MapServer关键字不区分大小写,但某些数据库检索方法区分大小写。
在MapServer中,要生成上面的图片,Mapfile代码为:
1MAP
2 NAME "Hello World"
3 SIZE 400 200
4 IMAGECOLOR 249 245 186
5 IMAGETYPE "png"
6 EXTENT -1.0 -1.0 1.0 1.0
7 LAYER
8 STATUS DEFAULT
9 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
25END
第一个Mapfile
代码如下,行 01
至 06
建立基本的地图影像参数。关键字 NAME
定义创建的任何图像的基本名称。每次调用MapServer时,它通过连接系统时间(即,自1/1/1970 00:00:00以来的秒数)和进程ID来创建唯一的标识符。该唯一的标识符会附加到基名以形成文件名。两个或三个字符扩展(取决于文件类型),并追加。在某些情况下,在地图服务器的基本名称之后插入另一个字符串,以将参考地图图像或图例图像与地图图像本身区分开来。
关键字 SIZE
指定地图图像的像素大小(宽度×高度)。
IMAGECOLOR
将图像的背景颜色设置为白色(回想一下,在地图服务器上通过指定介于0和255之间的三个整数RGB分量值来选择颜色,白色是255、255、255)。
图像类型设置为 PNG
。它也可以在 Mapfile 中使用 JPEG
,或 GIF
形象。
Layer对象在地图对象下定义。在显示地图之前,需要在 Mapfile 中至少定义一个图层。可以在MapServer中定义任意多个层。在旧版本的MapServer中,层数的上限在源代码中定义 map.h
中等,限制为100;可以通过修改源代码来删除此限制。但是,该限制在常用的Linux发行版中不再可用。
1.3.4. 绘制内容¶
MapServer现在知道要生成什么类型的地图,包括大小和背景颜色,以及如何在网页上显示地图。然而不清楚要绘制什么以及如何绘制工作,这是由LAYER对象完成的。
该层应用单个数据集并包含一系列元素,使用特定的投影(将在本书后面部分包括在内)以特定的比例描述它们。带关键字的层 LAYER
生成,带关键字 END
结束。
关键字 STATUS
确定是否渲染层。默认值 Default
意味着它总是被渲染。
每一层都有一个几何类型。在本例中,该要素是点要素(一对坐标值),并且选择该点要素以简化该示例。
关键字类型的值选择为 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
并以END
。关键字
TYPE
确定标签字体的类型。有两种类型:bitmapped
标准和TrueType
标准。位图字体是在内部生成的,没有外部引用。必须安装TrueType,并且还必须由关键字FONTSET定义的文件中的别名确定。为简单起见,这些示例使用位图字体。
注意,标签的默认颜色是黑色,当然,它可以是不同的颜色,但目前使用默认颜色来简化该示例。
刚刚显示的 Mapfile 的结构非常简单,它生成的地图根本不能称为地图。但它应该绘制一个标记的图像并将其显示在网页上。
1.3.5. 查看结果¶
在MapFile中,可使用以下命令将其呈现为图片。
注: map2img
命令是在MapServer 8.0中引入的。它曾经是 shp2img
。
map2img -m hello.map -o out.png