这一节开始在 MapServer 中使用矢量数据。矢量数据与CAD软件,或 Illustrator 中的矢量数据类似,除了有地理空间位置的差别,还有一个重要的方面就是 GIS 中的矢量数据是没有样式的信息的。CAD 或 Illustrator 以绘制为主,所采用的矢量数据,需要使用宽度、颜色、样式等来进行区分与美化,在 GIS 中,则将这些工作交由地图制图阶段来完成,同样的数据,可以在不同的专题图中,不同的应用场景中使用不同的样式来绘制。
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 。07
至 19
行,定义地图的第一层。
该层开始关键字为 LAYER
,结束关键字为 END
。根据 wcountry.shp1
的空间数据,多边形层渲染了全球的行政区划数据。NAME
关键字指定层的名称。这个名称本身是可选的,但如果你使用一个,它必须是不超过20个字符。该层的名称是用来在HTML模板层作为一个 CGI
引用。如果想从 HTML 表单交互层能够打开和关闭的情况下必须指定一个名称,。
STATUS
关键字决定该层是否渲染,是否可以改变其状态。
STATUS
默认的层总是渲染,同时可以改变状态。
12
至 18
行指定这一层唯一的类对象参数。一个类对象的由关键字 class
开始和关键字 END
终止( 18
行)。虽然这个应用程序将比以前的地图使用类更广泛,这一层,你只需要指定一个单一的默认类将包括shapefile中的每一个要素。一类的名称将出现在与地图相关的图例上。如果一个类没有名字,它依然会被渲染,但它不会出现在图例中。样式对象关键字 COLOR
指定绘制的颜色,OUTLINECOLOR
指定绘制边界的颜色。
因为这层是一个多边形,它会被指定的颜色填充。注意,如果图层是线状图层,COLOR
值将指定线的颜色。
这个URL可以被分解成三个部分:
第一部分,http://webgis.cn/cgi-bin/mapserv?
,调用MapServer的CGI程序。在不同的系统上,可能是 mapserv
或 mapserv.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
注意上面的 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 中的关键字的值并查看结果。这些实验会帮助了解这些关键字。