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中, 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的基本用法。下图显示了效果:

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

上图所示代码为:

<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

代码如下,行 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