发布一个矢量图层

这一节开始在 MapServer 中使用矢量数据。矢量数据与CAD软件,或 Illustrator 中的矢量数据类似,除了有地理空间位置的差别,还有一个重要的方面就是 GIS 中的矢量数据是没有样式的信息的。CAD 或 Illustrator 以绘制为主,所采用的矢量数据,需要使用宽度、颜色、样式等来进行区分与美化,在 GIS 中,则将这些工作交由地图制图阶段来完成,同样的数据,可以在不同的专题图中,不同的应用场景中使用不同的样式来绘制。

在 Mapfile 中定义矢量图层

Mapserver可以创建一个图像并保存到一个当地目录,或者直接输送到要求的 Web 浏览器(正如这个例子)。注意上面地图,它是由WebGIS服务器在服务器端后台生成,然后传送到客户端的。在网页后面的代码是:

 <img alt="" border="1"
 src="http://webgis.cn/cgi-bin/mapserv?map=/owg/mfa1.map&layer=world-country&mode=map"
 />

你可以不在HTML页面浏览它,仅仅输入这个网址:

http://webgis.cn/cgi-bin/mapserv?map=/owg/example1-1.map&layer=world-country&mode=map

(记住替换主机名或者IP地址;例如使用本地主机名 localhost,或者直接使用 IP 地址,如 "127.0.0.1"

01 MAP
02     IMAGETYPE "PNG"
03     EXTENT -180 -90 180 90
04     SIZE 600 300
05     SHAPEPATH "/gdata"
06     IMAGECOLOR 255 255 255
07     LAYER
08         NAME "world-country"
09         DATA "wcountry.shp"
10         STATUS OFF
11         TYPE POLYGON
12         CLASS
13             NAME "World Countries"
14             STYLE
15                 COLOR 232 232 232
16                 OUTLINECOLOR 32 32 32
17             END
18         END
19     END
20 END

下面看一下这个 Mapfile 。0719 行,定义地图的第一层。

该层开始关键字为 LAYER ,结束关键字为 END 。根据 wcountry.shp1 的空间数据,多边形层渲染了全球的行政区划数据。NAME 关键字指定层的名称。这个名称本身是可选的,但如果你使用一个,它必须是不超过20个字符。该层的名称是用来在HTML模板层作为一个 CGI 引用。如果想从 HTML 表单交互层能够打开和关闭的情况下必须指定一个名称,。

STATUS 关键字决定该层是否渲染,是否可以改变其状态。 STATUS 默认的层总是渲染,同时可以改变状态。

1218 行指定这一层唯一的类对象参数。一个类对象的由关键字 class 开始和关键字 END终止( 18 行)。虽然这个应用程序将比以前的地图使用类更广泛,这一层,你只需要指定一个单一的默认类将包括shapefile中的每一个要素。一类的名称将出现在与地图相关的图例上。如果一个类没有名字,它依然会被渲染,但它不会出现在图例中。样式对象关键字 COLOR 指定绘制的颜色,OUTLINECOLOR 指定绘制边界的颜色。 因为这层是一个多边形,它会被指定的颜色填充。注意,如果图层是线状图层,COLOR 值将指定线的颜色。

URL参数说明

这个URL可以被分解成三个部分:

第一部分,http://webgis.cn/cgi-bin/mapserv? ,调用MapServer的CGI程序。在不同的系统上,可能是 mapservmapserv.exe ,也有可能是其他名称。如果直接调用打开上面的网址,会得到这个消息:

No query information to decode. QUERY_STRING is set, but empty.

要得到正确的信息,需要添加额外的参数。

接下来的三个部分是查询字符串。查询字符串包含CGI参数(变量和它们的值),与被符号(&)分隔的每个参数。

现在来看看查询字符串,第一个参数 map 有一个值 : /owg/mfa1.map

这告诉MapServer的CGI的程序需要处理/解析的地图文件。当然这里的路径是服务器上的路径。

下一个参数 layer=states,告诉 mapserv 使用 states 图层。我们在 Mapfile 中命名为图层对象 states

最后一个参数, mode=map ,告诉 mapserv 做什么以模式输出 MapFile 。在这种情况下,它告诉 mapserv 转储图像直接到Web浏览器(客户端) ,无需先创建一个临时图像在服务器上。

TYPE 的值 可以为: 'chart', 'circle', 'line', 'point', 'polygon', 'raster', 'query', 'annotation'.

地图范围

在 Mapfile 中,需要设置好正确的范围才能显示数据。比如中国范围的数据,设置的范围为: EXTENT 73 8 136 53,效果如下:

完整的 Mapfile 为:

01 MAP
02     IMAGETYPE "PNG"
03     EXTENT -12 25 43 50
04     SIZE 550 250
05     SHAPEPATH "/gdata"
06     IMAGECOLOR 255 255 255
07     LAYER
08         NAME "topo"
09         DATA "land_shallow_topo_8192.tif"
10         STATUS OFF
11         TYPE RASTER
12     END
13 END

MapServer 查看的不同模式

注意上面的 mode=map ,这是 MapServer 支持的查看的模式。MapServer 的 mode 的CGI变量可以使用 map 以外的其他值。除了 map 模式之外,还有 browse 模式。例如,如果你使用 map=browse, MapServer的将转储影像到服务器上的临时目录。使用 browse 模式需要指定 template 参数。一般需要先定义一个模板文件,没有模板文件的情况下 browse 模式无法正常工作,这个在后面会说明。而在MapServer 6.x中,template 参数允许使用 OpenLayers 关键词,可以使用 OpenLayers 来查看 MapServer 的结果。

下面直接使用OpenLayers的缺省配置来查看地图。注意,要调用 MapServer 网站的 OpenLayers 类库,所以初次会比较慢一点。

http://webgis.cn/cgi-bin/mapserv?map=/owg/mfa1.map&layer=states&mode=browse&template=OpenLayers

关于 OpenLayers 模式,可查看:

https://mapserver.org/uk/cgi/openlayers.html

可以尝试修改 MapFile 中的关键字的值并查看结果。这些实验会帮助了解这些关键字。