MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.1 A map with single layer
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》)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<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="" />
</handlers>
<caching enabled="true" enableKernelCache="true" />
</system.webServer>
</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文件,内容如下:
MAP
IMAGETYPE PNG
EXTENT -97.238976 41.619778 -82.122902 49.385620
SIZE 400 300
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
IMAGECOLOR 255 255 255 LAYER
NAME states
DATA states_ugl
STATUS OFF
TYPE POLYGON CLASS
NAME "The Upper Great Lakes States" STYLE
COLOR 232 232 232
OUTLINECOLOR 32 32 32
END
END
END
DEBUG 5
CONFIG "MS_ERRORFILE" "logs\ms.log"
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显得比较安全,毕竟没有路径盘符信息了。
后记
在写此案例的过程中,遇到了一些相对路径的问题。修修改改,总算完成,其中也有很多不懂的知识,但是就像做题一样,做错了,就能马上知道自己错了。然后找答案,查询知识点。就能一一解决。
下一篇按照大纲接续写。
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.1 A map with single layer的更多相关文章
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.7 Adding a wms layer
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.7 Adding a wms layer 前言 Add OGC WMS Layers( ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.6 Defining Projections and Extents
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.6 Defining Projections and Extents 一.前言 当在m ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.5 Adding a raster layer
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.5 Adding a raster layer 一.前言 MapServer不仅支持 ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example 1.4 Labeling the Map
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example 1.4 Labeling the Map 一.前言 MapServer拥有非常灵活的标签 ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer 一.前言 关于第一节的 ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.2 Static Map with Two Layers
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.2 Static Map with Two Layers 一.前言 上一篇博客< ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件
MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件 前言 万事开头难,有了<MapSer ...
- MapServer Tutorial——MapServer7.2.1教程学习(大纲)
MapServer Tutorial——MapServer7.2.1教程学习(大纲) 前言 最近在学习Gis方面的知识,因为电脑硬件配置偏低,顾选择MapServer入手.网上搜索MapServer系 ...
- MapServer Tutorial——MapServer7.2.1教程学习——教程背景
MapServer Tutorial——MapServer7.2.1教程学习——教程背景 一.前言 目前处于MapServer学习入门阶段,所以每一步都需要打下扎实基础.尽自己最大的努力,去学习知识的 ...
随机推荐
- 【UML】NO.47.EBook.5.UML.1.007-【UML 大战需求分析】- 部署图(Deployment Diagram)
1.0.0 Summary Tittle:[UML]NO.47.EBook.1.UML.1.007-[UML 大战需求分析]- 部署图(Deployment Diagram) Style:Design ...
- linux 单次定时任务
使用at =======查看当前任务========= at -l 或者atq =======查看任务执行什么===== at -c =======配置任务========= at 02:00 ...
- upload-labs
upload-labs是一个和sqli-labs类似的靶场平台,只不过是一个专门学习文件上传的.整理的很好,虽然并不能将服务器解析漏洞考虑进去,但毕竟一个靶场不可能多个web容器吧,关键是思路很重要, ...
- JavaScript知识精简
JS单线程,同步,一次执行某一段代码,等到前一个程序执行完毕再执行.,阻塞,安全. 多线程,异步,不用等到前一个程序执行完毕就执行. 数据类型 JavaScript 是 弱类型 语言,但并不是没有 ...
- Oracle 26表空间的管理
一.查看用户表空间 熟悉与表空间相关的数据字典 查看用户的表空间 相关的数据字典:(用于查询数据库信息的数据库表)dba_tablespaces (管理员级别的表空间的描述信息) User_table ...
- apache多站点vhost.conf配置
#第1个站点的配置 <VirtualHost *:80> DocumentRoot "D:/phpStudy/WWW" ServerName localhost < ...
- 修复svn hook导致的字符集错误
修改pre-commit钩子,如果返回中文信息,可能会报如下错误: Error output could not be translated from the native locale to UTF ...
- 使用hector-slam和Kinect V1建图
一.建图实际操作 下载源码测试源码,depthimage_to_laserscan,参考https://blog.csdn.net/u010925447/article/details/5649468 ...
- HTML基础(1)——样式表
样式表按出现的位置可以分为:行间(内联)样式表,内部样式表,外部样式表. 行间(内联)样式表:由于要将表现和内容混杂在一起,内联样式会损失掉样式表的许多优势. <div style=" ...
- 【Entity Framework】Model First Approach
EF中的model first 所谓mf, 就是使用vs提供的edm designer去设计model,然后将设计好的model使用vs在指定的数据库中生成数据库即可. 当你的项目既没有数据库也没有c ...