1.3. 开始使用 Mapfile#
MapServer的核心程序用于根据地理空间数据生成地图。配置使用CGI的功能,赋予其WebGIS的功能。MapServer使用配置文件来声明生成的地图的大小和格式、所有路径、名称、使用的数据格式以及各种更复杂的控制选项。此配置文件称为映射文件。 Mapfile 是多层的,每个 Mapfile 定义了大量的其他对象。这些对象包括比例尺、图例、地图颜色、地图名称、地图层等。还有更多的对象需要定义,并将在以下各节中更详细地讨论。此外,还有专门的MapServer关键字的全面参考。
第一个应用程序使用一个简单的 Mapfile ,并不实际生成地图,它生成一个显示单词“Hello World”的矩形图片。这个应用程序非常简单,所以很容易发现配置问题或错误。
每一件物品在使用时都有说明。该程序不使用任何资源,如空间数据、符号、字体等。然而,它需要空间来存储图像。您将看到如何在MapServer中指定图像的目录,并确保Apache可以找到该目录。
1.3.1. 文法#
MapFile files ignore letter case
非字母字符串或包含MapServer关键字的字符串必须用引号引起来。建议将所有字符串括在双引号中。
MapFile中的文件路径可以使用绝对路径或相对路径,其中相对路径是相对于
SHAPEPATH
。MapFile has a specific hierarchy, Map Object is the “root” of MapFile, and other objects are under it.
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参数值,这允许MapServer MapFiles获取用户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="https://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的基本用法#
A Mapfile defines a collection of cartographic objects, which together
determine the appearance and behavior of the map displayed on the page.
It functions similarly to Apache’s httpd.conf
configuration file.
Based on the same geographic data, mapping applications can use
different Mapfiles to present maps with different characteristics,
corresponding to different user behaviors.
看起来静态配置文件的功能有限,但MapServer的设计使得使用MapFiles可以生成非常强大的应用程序。
映射文件的定义由键-值对组成。列出的一些值由空格分隔,必须用括号括起来。单括号和双括号都可以。
必须将包含空格的关键字值括起来,这对所有字符串都是很好的做法。
同时需要注意的是,MapServer关键字不区分大小写,但某些数据库检索方法区分大小写。
在MapServer中,要生成上面的图片,映射文件代码为:
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
第一个映射文件
代码如下,行 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