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中, uidpasswd 在之前的行动中。然后,您可以在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的基本用法。下图显示了效果:

https://webgis.cn/cgi-bin/mapserv?map=/owg/mfa0.map&mode=map&format=jpeg

上图所示代码为:

<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

第一个映射文件

代码如下,行 0106 建立基本的地图影像参数。关键字 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