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软件查看,比如QGISThuban 等。请随意更改范围的值,以便更好地了解范围如何更改地图。

      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的更多相关文章

  1. 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( ...

  2. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.6 Defining Projections and Extents

    MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.6 Defining Projections and Extents 一.前言 当在m ...

  3. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.5 Adding a raster layer

    MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.5 Adding a  raster layer 一.前言 MapServer不仅支持 ...

  4. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example 1.4 Labeling the Map

    MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example 1.4 Labeling the Map 一.前言 MapServer拥有非常灵活的标签 ...

  5. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer

    MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer 一.前言 关于第一节的 ...

  6. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.2 Static Map with Two Layers

    MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.2 Static Map with Two Layers 一.前言 上一篇博客< ...

  7. MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件

    MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件 前言 万事开头难,有了<MapSer ...

  8. MapServer Tutorial——MapServer7.2.1教程学习(大纲)

    MapServer Tutorial——MapServer7.2.1教程学习(大纲) 前言 最近在学习Gis方面的知识,因为电脑硬件配置偏低,顾选择MapServer入手.网上搜索MapServer系 ...

  9. MapServer Tutorial——MapServer7.2.1教程学习——教程背景

    MapServer Tutorial——MapServer7.2.1教程学习——教程背景 一.前言 目前处于MapServer学习入门阶段,所以每一步都需要打下扎实基础.尽自己最大的努力,去学习知识的 ...

随机推荐

  1. 从Joda-Time反观Java语言利弊

    基本上每个企业应用系统都涉及到时间处理.我们知道,以前用java原生的Date+Calendar非常的不方便.后来Joda-Time诞生,这个专门处理日期/时间的库提供了DateTime类型,用它可以 ...

  2. Vue疑难杂症

    安装Vue脚手架的时候 指令:npm install vue-cli -g Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corpor ...

  3. 《linux就该这么学》第四节课笔记,三章和四章开始!

    第三章 (根据课本和在线培训视频排版总结,借鉴请改动)         右键可打开终端练习             3.1:输入输出重定向 输入重定向:符号 "<" ,是一种 ...

  4. STM32的型号的命名规则

    每种STM32的产品都由16个字母或数字构成的编号标示,用户向ST订货时必须使用这个编号指定需要的产品.这16个字符分为8个部分,下面通过一个例子说明它们的意义: STM32 F C T xxx ST ...

  5. 在vue项目中引入jquery

    在vue项目中引入jquerycnpm install jquery --save在main.js中引入,加入下面这行代码:import 'jquery'注:有些项目是按需加载的,在main.js里面 ...

  6. K8S学习笔记之kubernetes 日志架构

    0x00 概述 应用程序和系统日志可以帮助我们了解集群内部的运行情况,日志对于我们调试问题和监视集群情况也是非常有用的.而且大部分的应用都会有日志记录,对于传统的应用大部分都会写入到本地的日志文件之中 ...

  7. K8S学习笔记之Kubernetes数据持久化方案

    在开始介绍k8s持久化存储前,我们有必要了解一下k8s的emptydir和hostpath.configmap以及secret的机制和用途. 0x00 Emptydir EmptyDir是一个空目录, ...

  8. Shell 脚本格式注意事项

    if 条件判断格式 if [ ! -f file.txt ];then cmd else cmd fi 注1:! 代表非.不存在文件就成功. 注2:再有参数 变量 需要 [] 阔起 1 运算书写写格式 ...

  9. 剑指offer(40)数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目分析 第一种方法:使用js中的indexOf()和lastIndexOf(),只要两个相等, ...

  10. RabbitMQ&RocketMQ动态添加Queue参考

    Kafka重复消费与消息丢失参考: https://www.cnblogs.com/kaleidoscope/p/9763053.html https://blog.csdn.net/qingqing ...