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. NIO学习资料

    五大IO模型 https://jiges.github.io/2018/02/07/%E4%BA%94%E5%A4%A7IO%E6%A8%A1%E5%9E%8B/ Getting started wi ...

  2. Docker:Docker搭建Redis集群(6)

    国外的公有云实在是太慢了,经常time out 这里搜集几个国内出名的: hub.c.163.com (网易:https://c.163.com/hub#/m/home/) dev.aliyun.co ...

  3. Lambda表达式详解(例子详解)(转自:http://blog.csdn.net/damon316/article/details/51734661)

    Lambda表达式详解(例子详解)     lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 ...

  4. c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.ExitThread(); System.Environment.Exit(0);

    本文实例总结了C#中WinForm程序退出方法技巧.分享给大家供大家参考.具体分析如下: 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit ...

  5. Substring (后缀数组 + 计数)

    题意:求出字符串中包含了某个字符的字符序列不一样的数量. 思路:其实主要的是找出每个被包含字符的数量,假设除了目标字符之外的所有字符都不一样,那么应该就很好求了,但是显然不可能,所以我们可以枚举每一个 ...

  6. "Login failed for user 'NT AUTHORITY\SYSTEM'. 原因: 无法打开明确指定的数据库。"异常处理

    公司一台SQL Server服务器一直报 "Login failed for user 'NT AUTHORITY\SYSTEM'. 原因: 无法打开明确指定的数据库."错误,按网 ...

  7. Linux笔记 #09# Tomcat多开以及Nginx负载均衡简单例子

    索引 Tomcat怎样多开.. 1.添加环境变量(最基础.关键的步骤!) 2.改catalina.sh 3.改相关端口 Nginx负载均衡简单例子 Tomcat怎样多开.. 演示一下如何开两个(开n个 ...

  8. Docker Macvlan 应用部署

    Docker Macvlan 应用部署 MacVLAN有两种桥接模式 Bridge模式:不创建子接口的情况下直接去桥接物理接口.直接桥接到与宿主级的同网段. VLAN Bridge模式:创建子接口去桥 ...

  9. Python socket文件传送md5校验

    soket_server import socket,os,hashlib server = socket.socket() server.bind(('0.0.0.0',9999)) server. ...

  10. IP白名单的实现(PHP)

    有些项目可能会用到一个IP地址的白名单黑名单之类的验证. 比如,只有IP地址在白名单中,才可以访问该系统. 那么此时,白名单的维护,一般是一个文件,里边是一些IP地址(每行一个IP),当然也有的可能是 ...