1.1. MapServer简介¶
MapServer是一个基于胖服务器/瘦客户端模式的实时地图发布系统。当客户端发送数据请求时,服务器实时处理空间数据,并将生成的数据发送给客户端。MapServer的核心部分是用C语言编写的地图操作模块,MapServer本身的许多功能的实现都依赖于一些开源或自由库。
MapServer的核心部分是用C语言编写的地图操纵模块,它的许多功能都依赖于一些开放源码或自由库。利用GEOS和OGR/GDAL对各种矢量和栅格数据的支持,通过Proj.4共享库实时进行投影变换。MapServer遵循OGC系列规范,可以集成PostGIS和开源数据库PostgreSQL,并对地理空间数据进行存储和SQL查询。基于ka-map、MapLab、Caroweb、Chameleon等一系列客户端JAVASCRIPT API,支持地理空间数据的传输和表达,并遵循OGC规范制定的一系列WMS、WFS、WCS、WMC、SLD、GML和Filter编码。
1.1.1. MapServer的发展历史¶
MapServer是一个用C语言编写的开源地理空间数据渲染引擎。它起源于20世纪90年代中期的明尼苏达大学(UMN)、美国国家航空航天局(NASA)和明尼苏达州自然资源部(MNDNR)。其中一个协作项目为ForNet,以及后来的TerrSIP项目。政府的支持在MapServer的早期开发中发挥了重要作用。
这是一款在麻省理工学院风格的许可下发布的开源软件,用于在Web上发布空间数据和交互地图应用程序,支持所有主要操作系统,包括Windows、Linux、Mac OS X等。它的定位不是实现一个功能齐全的GIS,而是为Web应用程序提供大部分核心的GIS功能。
1994年,MapServer的父亲Steve Lime和他的MapServer为更多的人所熟悉。MapServer在其发展和增长中并不是孤立的,而是得到了许多开源社区和开源爱好者的支持。2005年11月,MapServer基金会成立,其宗旨是“促进一个专业的开源网络地图开发环境和社区。即使它最初只专注于网络地图项目,但它希望能为其他开源地理信息项目提供资金“,不仅促进MapServer的专业发展,也促进整个开源网络地图技术的发展。
随着开源地理信息系统软件的进一步开发和开源网络地图环境的进一步优化,2006年2月,MapServer基金会正式更名为开源地理空间基金会(OSGeo),Autodesk将MapGuide作为开源代码加入基金会。这将进一步推动MapServer的发展。
1.1.2. MapServer的特点¶
MapServer是一个流行的开源项目,用于在Internet上显示动态空间地图。它具有以下特点:
支持显示和查询数百种网格、矢量和数据库格式。支持的矢量格式:Esri shapefile、PostGIS、ESRI的ArcSDE等(由OGR库实现)。支持的网格格式:TIFF/GeoTIFF、EPPL7等(通过GDAL库实现)。对于shapefile文件,可以构建四叉树空间索引。
能够在多种不同的系统(Windows、Linux、Mac OS X等)上运行
有两种方式可用:CGI(适用于CGI、AJAX、Flex开发人员)和MapScript(适用于PHP、Java、C#开发人员),原生CGI是最高效的
支持流行的脚本语言和开发环境(PHP、Python、Perl、Ruby、Java、.NET)
即时投影
高质量渲染模型
完全支持自定义模板输出。
许多现成的开源应用程序环境
Mapfile 是地图服务的核心。它将各种地图元素组织成一个分层的对象系统,并定义了数据源、使用的数据格式、用户交互以及对OGC协议的支持。
支持微软和苹果联合开发的字体标准TrueType。
支持块(平铺)矢量和栅格数据。
自动控制地图元素(如比例、图例、参考等)。
图像比例是自动调整的。
使用逻辑或正则表达式生成专题地图。
特征标注(包括尺寸冲突解决)。
可以通过URL动态配置MapServer。
支持动态投影变换。
支持多种开放地理空间联盟网络规范:WMS(客户端/服务器)、非事务性WFS(客户端/服务器)、WCS(仅服务器)、WMC、SLD、GML和过滤器编码。
在其最基本的形式中,MapServer是Web服务器上的非活动CGI程序。当请求被发送到MapServer时,它使用在请求的URL中传递的信息和Mapfile。创建所请求地图的图像,请求可以返回由CGI传递的图例、标尺、参考地图和变量值。
与商业企业提供的众多WebGIS解决方案相比,MapServer是一个开源项目,这意味着可免费使用MapServer,并有权自行修改、复制和重新分发,MapServer也有许多优势:
MapServer是一个开源的基于胖服务器/瘦客户端模式的实时地图发布系统。当客户端发送数据请求时,服务器实时处理空间数据,并将生成的数据发送给客户端。MapServer的核心部分是用C语言编写的地图操作模块,它的许多功能都依赖于一些开源或自由库。
使用GEOS、OGR/GDAL来支持各种矢量和栅格数据,通过Proj.4共享库进行实时投影变换。同时,它还集成了PostGIS和开源数据库PostgreSQL来存储和查询地理空间数据,并基于ka-map、MapLab、Caroweb、Chameleon等一系列客户端Java API支持地理空间数据的传输和表达。OGC制定的WMS、WFS、WCS、WMC、SLD、GML和Filter Ending等一系列规范。
MapServer基于以数字格式存储的空间信息创建地图图像。它可以处理矢量和栅格数据。MapServer可以渲染20多种不同的矢量数据格式,包括Shapefile、PostGIS和ArcSDE几何要素OPeNDAP、Arc/Info Coverage和人口普查TIGER文件。
并不是地图上显示的所有信息都必须是矢量格式。例如,一个地区的航空或卫星照片可以显示在渲染的矢量数据后面,以更清楚地了解这些矢量元素如何与现实世界的特征相关。MapServer本机读取两种网格格式:GeoTIFF和EPPL7。然而,可通过GDAL包读取20多种格式(包括Windows位图、GIF和JPEG),尽管MapServer理解并可以渲染这些网格类型,但它不能使用空间信息标记图像。
1.1.3. MapServer的组件¶
WebGIS的实现方法之一是使用公共网关接口(CGI)技术。在服务器端,WebServer与地理信息系统空间数据库通过CGI应用程序连接,客户端只需使用浏览器即可对空间数据进行查询和分析 [2] 。美国明尼苏达大学提供了一种WebGIS解决方案:MapServer,它使用CGI技术。
MapServer是一个用C语言开发的开源WebGIS项目。它是一个基于胖服务器/瘦客户端模式的实时地图发布系统。当客户端发送数据请求时,服务器实时处理空间数据,并将生成的数据发送给客户端。
MapServer支持三层架构:
应用层:客户端浏览器
中间层:MapServer CGI模块/脚本语言+MapScrip、Web服务器
存储层:地理信息系统空间数据库
一个简单的MapServer由如下几部分组成,如图所示:
MapFile
MapServer应用程序的结构化文本配置文件。它定义地图的字段,并用于告诉MapServer数据在哪里以及输出图像的位置。它还定义了地图层,包括它们的数据来源、投影和记法。它必须具有.map扩展名,否则MapServer将无法识别它。Mapfile 将各种地图元素组织成具有层次关系的对象系统。数据来源、使用的数据格式、用户交互以及对OGC协议的支持也在MapFile中定义。 Mapfile 中包含的对象及其层次关系:
地理数据
MapServer可以利用多种类型的地理信息数据源。默认为ESRI数据格式,也支持其他数据格式。
HTMLPages
它是用户和MapServer之间的接口,通常位于Web根目录。在其最简单的形式中,可以调用MapServer将静态地图图像放置在一个HTML页面上。要使地图具有互动性,需要将图像放置在页面上的一个HTML表单上。
MapServer CGI
二进制可执行文件。它可以接收返回位于Web服务器的cgi-bin或脚本目录中的图像、数据等的请求。Web服务器的用户必须对这些目录具有执行权限。出于安全原因,它们不能位于Web的根目录中。默认情况下,此程序名为mapserv。
Web/HTTP服务器
当用户的浏览器被点击时,就会提供该HTML页面,此时需要一个工作正常的Web(HTTP)服务器。例如,Apache或Microsoft’s IIS,它们位于安装MapServer的同一台计算机上。
1.1.4. MapServer的两种模式¶
MapServer可以看作是两个独立模块的总称:MapServer CGI模块和MapScrip模块。在服务器端,任何模块都可以用来编写WebGIS程序。但是,它们使用相同的配置文件MapFile。
MapServer可以在两种不同的模式下运行:CGI和MapScrip。在CGI模式下,MapServer在Web服务器环境中作为CGI脚本运行。这很容易设置和生成快速、直接的应用程序。在MapScrip模式下,可从Perl、Python或PHP访问MapServerAPI。MapScript接口允许灵活、功能丰富的应用程序仍然可以利用MapServer的模板工具。
1.1.5. MapServer与Geoserver的比较¶
MapServer和Geoserver都是广泛使用的开源WebGIS工具。两者都通过互联网发布地图,并经常被比较。MAPSERVER也是符合OGC的WMS和非事务性WFS,基于CGI并用C++编写;Geoserver是用Java编写(需要安装JavaSDK(而不是JRE)才能运行它),基于Servlet并使用Struts框架。
功能上:MapServer弱于Geoserver、QGIS,强于UDIG。
效率:MapServer对WMS(Web地图服务)的支持更高效,而Geoserver更擅长结合WFS(Web Feature Service)规范进行属性查询。
除了功能比较外,在开发过程中还应特别注意技术选择。MapServer专注于地图服务功能,可以作为项目组件(甚至核心组件),但其他功能大部分时间需要开发者来实现;Geoserver是一个相对完整的套装,部署安装后基本可以作为产品使用。
MapServer不是一个功能齐全的地理信息系统,它没有提供集成的DBMS(数据库管理系统)工具,它的分析能力有限,并且没有地理配准工具。
哪种更好些呢?很难说,这取决于您想要如何发布数据,以及更擅长使用什么语言。这两个网站都很出色,都有出色的文档和用户基础。Geoserver能够在线编辑空间数据和生成专题地图。地图以XML文件形式发布。MAPSERVER擅长生成专题地图,比以往任何时候都更加成熟。地图通过文本配置文件发布。
哪一个更合适呢?我主张使用MapServer,如果只发布地图,不允许修改,它更容易维护。选择Geoserver是因为想要更好的功能,如在线编辑和数据库支持,如PostgreSQL或Oracle空间数据库,Geoserver的另一个优势是有一个免费的客户端软件UDIG。
MapServer的特点¶
提供了两种工作方式,CGI方式(适用于CGI、AJAX、Flex开发人员)和MapScrip方式(适用于PHP、Java、C#、Python开发人员)。原生CGI方法是最高效的,使用TileCache可以快速生成大比例的地图切片数据。与基于.Net和J2EE的商业或开源平台相比,MapServer更适合于高负载的大规模互联网地图应用。MapServer是一个基于C语言编写的地图服务软件,速度比用Java编写的Geoserver要快。此外,MapServer的历史比Geoserver要长,甚至在性能上也可以与商业ArcIMS相媲美。
GeoServer的特点¶
Geoserver(http://geoserver.org/)是一个符合J2EE规范的,实现了WCS、WMS和WFS规范,支持Transaction WFS(WFS-T),其技术核心是集成了著名的JAVA开发的地理信息系统工具GeoTools。
对于空间信息存储,它支持ESRI shapefile和空间数据库,如PostGIS、Oracle和ArcSDE,输出的GML文件符合GML2.1的要求。
由于其纯Java技术和开源特点,它更适合于复杂的环境需求,开发组织可以基于Geoserver灵活地实现特定的目标需求,这是商业GIS组件所缺乏的。
作为一种纯Java实现,Geoserver部署在Tomcat等应用服务器上;其WMS和WFS组件响应浏览器或uDig的请求来访问已配置的空间数据库,如PostGIS、OracleSpace等,并生成地图和GML文档传输到客户端。
Geoserver具有以下优势:
用Java语言编写,标准的J2EE框架,基于Servlet和Struts框架,支持高效的Spring框架开发;
兼容WMS和WFS功能,支持WFS-T规范;
高效的数据库支持PostGIS、Shapefile、ArcSDE、Oracle、MySQL等。
支持数百个投影;
能够将网络地图输出为jpeg、gif、png等格式;