MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.1 A map with single layer
一、前言
开始MapServer用例实践之旅,做项目算是可以比喻为考试,但是考试之前,还是以做练习题模拟考为主。下面实践一下官网的第一个例子:Example1.1 A map with single layer(官网地址:https://www.mapserver.org/tutorial/example1-1.html#example1-1)
二、简介
1.打开案例相关介绍
1.1.MapServer能够创建图像并投影到本地目录或者直接的投影到你所使用请求的浏览器上面。本用例你可以通过浏览器直接打开:http://localhost/cgi-bin/mapserv?map=/ms4w/apps/tutorial/htdocs/example1-1.map&layer=states&mode=map查看。
注意:这个位置的地址是按照官网上面翻译的地址,如果是根据自己的个人安装环境以及建站配置等设置的,需要修改。
1.2.当前URL分为两个部分
第一部分:"http://localhost/cgi-bin/mapserv?"部分,调用MapServer CGI进程。如果你在浏览器中打开http://localhost/cgi-bin/mapserv?,会出现“No query information to decode. QUERY_STRING is set, but empty”。
第二部分:URL中的三个参数 map、layer、mode
map=/ms4w/apps/tutorial/htdocs/example1-1.map:此处表示告诉MapServer的CGI进程去解析哪一个map文件。可以是绝对路径,也可以是相对路径(相对路径是针对mapserv.exe而言的)。
layer=states:此处告诉MapServer“打开”layer状态,回调时,我们命名layer对象为“states”
mode=map:告诉MapServer对mapfile文件的输出格式,这里是告诉MapServer直接将图像投影到浏览器,无需先在服务器端创建零时的图像。
注意:mapserver模式cgi变量采用的值不是map。例如,如果使用mode=browse,mapserver将把映像转储到服务器上的临时目录。浏览模式现在不起作用,但稍后我们将再次实践。
2.mapfile的文件结构
官网用例“Example1.1 A map with single layer”的mapfile文件结构请查看此链接:https://www.mapserver.org/tutorial/example1-1-map.html#example1-1-map
MapFile文件介绍请查看此链接:https://www.mapserver.org/mapfile/index.html#mapfile
后续再添加一篇文章,对MapFile做详细介绍。
Mapefile是MapServer的基础配置机制(个人理解就是告诉MapServer的站点是如何运行的)。它有对象组成,如:LAYERT。每个对象有自己的关键之,并可以包含其他对象。它包含的对象有一定的层次结构,如:LAYER对象中包含CLASS,CLASS是属于LAYER的。
当前是一个非常简单的文件结构,当学习完其他用例时,你会了解更复杂的mapfile层次结构。
我们定义mapfile中的内容时,以对象名称开头,END结尾;#表示注释。
目前的层次结构为:
MAP
|----LAYER
|----CLASS
|----STYLE
3.Mapfile中的对象解释
3.1Map对象
MAP:每个mapfile均以MAP开头,END结尾。只有这样格式的文件才会被识别为mapfile文件。
IMAGETYPE:图片类型,imagetype为mapserver的CGI定义输出图片格式。当前样例使用PNG作为输出格式(老版本用GIF)。如果需要使用GIF,在编译源码时,需要开启GIF,WBMP或 JPEG 支持(在cmd里面输入mapserv -v可以查看输出的格式支持)。
当然也能够指定输出其他格式,如:PDF、SWF、GeoTIFF等。只要编译的时候在OUTPUTFORMAT加上相关的支持即可。输出支持详见:https://mapserver.org/documentation.html#output
EXTENT:此参数指定地图的输出范围-初始地图的边界框。范围值的格式如:<Lower Left X> <Lower Left Y> <Upper Right X> <Upper Right Y>
每个值用空格分开。这需要与数据使用相同的单位,或者,如果指定了不同的输出投影,则需要与输出投影使用相同的单位。
在这个例子中,我们的数据是地理投影的,所以单位是十进制的。
你可以使用ogrinfo(官网:http://gdal.org/ogrinfo.html)提供的工具,其作为GDAL/OGR二级制包的一部分,作为shapefile数据集的一部分(或者其他支持向量格式数据集)。
使用cmd命令定位到.shp文件所在目录,输入:ogrinfo -al -so states_ugl.shp 查看 states_ugl.shp 文件信息(红色部分根据实际查看文件信息填写)
运行此命令的先决条件是,你安装了MapServer,同时环境变量中添加了GDAL
当然,你也可以使用ArcView或者其他开元GIS软件查看,比如QGIS、Thuban 等。请随意更改范围的值,以便更好地了解范围如何更改地图。
SIZE:表示MapServer生成map图片的大小,但是为像素。当前例子是宽400像素,高300像素。在mapfile中修改这个值,可以查看在地图中的变化。
SHAPEPATH:图层数据的路径。可以是绝对路径,也可以是mapfile的相对路径(如:../data 或 E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\Example1.1\data)。
此路径不需要通过web访问,通常根本不需要对其访问,除非你愿意提供给别人下载你的原始数据。在web浏览器上面,它没有任何作用,所以不要考虑提供下载此源文件的URL。
只需要保证你的应用程序池可以访问到此shape文件(在Unix上面,是“nobdy”或“Apache”用户组),并对其读取权限。
IMAGECOLOR:地图的背景颜色。使用RGB值组成。
3.2 LAYER对象
LAYER:map对象图层的开始标签,详见:https://www.mapserver.org/mapfile/layer.html#layer。你可以指定多个layer对象。
NAME:NAME是LAYER对象的唯一标识符。MapServer通过NAME控制LAYER的开关。这个案例中LAYER的STATUS为默认值,所以NAME是无法控制工作的。后续案例中再做详细介绍。
DATA:数据的名称(当前案例中是shape文件的数据名称)。MapServer通过OGR(GDAL库的一部分)库支持ESRI的shapefile格式以及以外的矢量数据解析。你可以通过访问GDAL数据支持学习MapServer所支持的不同的矢量数据格式(http://gdal.org/ogr_formats.html)。
然后官网上面也有相关的数据支持文档guide to using vector data for MapServer.
TYPE:数据是什么类型的?如果是矢量数据,你可以指定为POLYGON(多边形),LINE(线)(即使是POLYLINE在技术上也可以使用LINE),或者POINT(点)。你也可以指定为RASTER(栅格)或ANNOTATION(标注)数据。当前案例是POLYGON(多边形)。
STATUS:层级(layers)是通过他们的STATUS来设置开关的。DEFAULT 状态默认是打开的。层级(layers)的开关控制是通过URL中LAYER的名称参数控制的。
3.3 CLASS 对象
CLASS:在LAYER对象中,以CLASS标签开始,END结尾。你可以在一个layer中指定多个CLASS。
NAME:CLASS对象的唯一标识符。一个layer对象可以有多个class对象,就像一个MAP对象可以有多个layer对象一样。MapServer通过CLASS对象的NAME标记命名CLASS等对象,所以最好给每个CLASS对象有一个适当的名称描述。
3.4 STYLE 对象
STYLE:一个CLASS对象中可以定义多个style对象。可以通过一个style覆盖或重载其他style。
CLOLR:多边形的填充颜色。如果是线形(TYPE值为LINE),则表示线的颜色。COLOR是一个RGB格式颜色值。
OUTLINECOLOR:多边形的边线颜色。RGB颜色值格式。默认情况下,MapServer不会绘制多边形(TYPE值为POLYGON)的边线。如果你想查看多边形的边界,你需要在mapfile中定义OUTLINECOLOR参数。
最后,你可以在mapfile中修改相关参数值,以便让你更加轻松的学习相关关键之的用法。
三、根据用例创建自己实际运行的站点应用
1. 观察URL根据自己的实际情况加以调整
1.1 新建一个自己的 Example1.1 A map with single layer 站点
根据map参数的相对路径是基于mapserv.exe的相对路径所决定的。我建议将站点建立在E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps目录下。
这样发布站点时,URL中的map参数可以为相对路径。mapfile中SHAPEPATH也使用相对路径比较方便。
后续所有的案例均放在apps文件夹下面,每个案例的命名规则为Example + section + 编号 + . + 案例编号。所以第一节第一个案例的目录名称为:Example1.1
在cmd中输入:cd /d E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps
在cmd中输入:md Example1.1
在cmd中输入:cd Example1.1
在cmd中输入:cd.>web.config
以上操作是创建相关文件夹以及web.config文件。
在web.config文件呢中天下如下内容,配置FastCGI指向。(详情请参考《MapServer Configuring with IIS》)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <configuration> 3 <system.webServer> 4 <handlers> 5 <add name="MapServerFastCgi" path="*" verb="*" type="" modules="FastCgiModule" scriptProcessor="E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\bin\mapserv.exe" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="" /> 6 </handlers> 7 <caching enabled="true" enableKernelCache="true" /> 8 </system.webServer> 9 </configuration>
其中“scriptProcessor”的实际路径根据你安装的MapServer填写。
站点的物理文件路径为:E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\Example1.1
端口为:8011
应用程序池名称为:Example1.1
1.2 配置当前 Example1.1 站点
其中,当前站点需要运行,涉及到:mapfile文件、shape文件等存放。
在cmd中输入:cd /d E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\Example1.1
在cmd中输入:md data
在cmd中输入:md logs
在cmd中输入:cd.>example1_1.map
创建相关文件夹和数据存放文件夹,日志记录文件夹,以及Example1.1站点运行时调用MapServer的mapfile文件。
将tutorial\data文件夹里面的states_ugl.dbf、states_ugl.shp、states_ugl.shx拷贝到“E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\Example1.1\data”文件夹下面。
输入文件详见:https://www.mapserver.org/input/vector/format_types.html。这里解释了上个文件的类型。
修改example1_1.map文件,内容如下:
1 MAP 2 IMAGETYPE PNG 3 EXTENT -97.238976 41.619778 -82.122902 49.385620 4 SIZE 400 300 5 SHAPEPATH "./data" #可以使exmaple1_1.map的相对路径,也可以是绝对路径 E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\Example1.1\data 6 IMAGECOLOR 255 255 255 7 8 LAYER 9 NAME states 10 DATA states_ugl 11 STATUS OFF 12 TYPE POLYGON 13 14 CLASS 15 NAME "The Upper Great Lakes States" 16 17 STYLE 18 COLOR 232 232 232 19 OUTLINECOLOR 32 32 32 20 END 21 END 22 END 23 DEBUG 5 24 CONFIG "MS_ERRORFILE" "logs\ms.log" 25 END
配置web站点程序池对日志文件读写权限
在cmd中输入:icacls "E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\Example1.1\logs" /grant "IIS AppPool\Example1.1":(OI)(CI)RW
测试站点能否访问,在浏览器中输入:http://localhost:8011/mapserv?map=../apps/Example1.1/example1_1.map&layer=states&mode=map
map=../apps/Example1.1/example1_1.map 表示 MapServer 与 mapfile (example1_1.map)的相对路径
mapfile (example1_1.map)中 SHAPEPATH "./data" 也是使用的相对路径。
两处均使用了相对路径。这样URL显得比较安全,毕竟没有路径盘符信息了。
后记
在写此案例的过程中,遇到了一些相对路径的问题。修修改改,总算完成,其中也有很多不懂的知识,但是就像做题一样,做错了,就能马上知道自己错了。然后找答案,查询知识点。就能一一解决。
下一篇按照大纲接续写。
原文地址:https://www.cnblogs.com/eshinex/p/10276449.html