毕业论文(设计)
题目: 开源GIS平台空间数据管理与发布技术研究
2014 年 5 月
摘要
本文系统地分析了网络地理信息系统(Web GIS)工作原理,阐述了使用免费、开源的GIS平台的开发模式。介绍了在PostGIS中管理矢量数据的方法,在Quantum GIS中调整地图样式并生成Map File文件的方法,介绍了使用MapServer根据Map File文件显示地图的方法,在开源Web GIS框架OpenLayers中发布MapServer和WMS服务的方法,以及使用PHP与PostgreSQL交互的方法。
本文详细论述了Web GIS开发过程中重要的课题,Map File文件的语法和配置问题、数据缓存问题、通讯效率问题、最短路径问题和网络定位问题,并且给出了相应的解决策略。
最后本课题采用B/S结构,使用HTML + CSS + JavaScript + PHP以及Ajax技术,在开源的IDE环境Eclipse中搭建了一个地图管理发布系统,并通过Apache服务器发布供用户访问。该系统能够实现了地图基本操控、量测、编辑、旅行、地点搜索、移动定位等功能,对使用开源GIS平台做网络端开发的工作者具有一定的指导意义。
关键词:开源GIS,地图服务,PostgreSQL/ PostGIS,QGIS,MapServer,OpenLayer
Abstract
The paper provide us the operating principle of the Web GIS comprehensively and the developing model of the free open-source software of graphic information system comprehensively. An introduction on vector data management and the operation in PostGIS to generate Map File document in Quantum GIS by adjusting the Map style are showed. In addition, we can learn about the method of showing Map by Map File document in MapServer, the way to release MapServer service and WMS service in OpenLayers which is a kind of free open-source software of graphic information system, the idea of how to realize the interactive between PHP and PostgreSQL.
The paper also discusses the key point in the development of Web GIS , the grammar and configuration problems of Map File document, the question of data cache of system, the problem of the shortest path and web fixed location ,all these problems are the central part of the Map service.
At last, by using the B/S structure and technique of HTML plus CSS plus JavaScript plus PHP and Ajax to set up a Map system in free environment of IDE and Eclipse which can realize the visit of users through the Apache server. The system provides the function of Map control, measure, Map analysis, tourism application, mobile fixed location etc. The functions are all play an important role in the guidance of web workers who use the free open-source software of graphic information system to develop new systems.
Keywords: PostGIS,PostgreSQL,QGIS,MapServer,OpenLayers,Web GIS
目录
第一章 绪论 1
1.1 引言 1
1.2 国内外发展现状 2
1.3 本论文研究方向 3
第二章 地理信息系统平台体系 4
2.1 Web GIS平台体系架构 4
2.1.1 数据层 5
2.1.2 服务层 5
2.1.3 客户层 7
2.2 数据库存储 8
2.2.1 PostgreSQL简介 8
2.2.2 安装配置 8
2.3 地理信息系统集成平台 10
2.3.1 OSGeo4W简介 10
2.3.2 OSGeo4W集成软件简介 12
2.4 地图发布框架 OpenLayers 14
2.5 网络后台语言PHP和Ajax技术 17
2.6 本章小结 18
第三章 系统开发关键问题 19
3.1 Map File文件组织结构 19
3.2 数据缓存问题 21
3.3 通讯效率问题 25
3.4 最短路径问题 28
3.5 网络定位问题 34
3.6 本章小结 36
第四章 系统实现 37
4.1 系统架构 37
4.2 系统功能 39
4.2.1 控制 Control 40
4.2.2 量测 Measure 41
4.2.3 编辑 Editor 43
4.2.4 旅行 Travel 44
4.2.5 工具 Tools 45
4.2.6 位置 Position 45
4.2.7 网络 Network 47
4.3 本章小结 47
第五章 总结展望 48
5.1 论文总结 48
5.2 项目展望 48
参考文献 50
致谢 51
附录 52
本科期间发表论文 55
第一章 绪论
-
引言
不管您是在地图上标记度假照片,还是想向客户展示所采样的样例站点,地图都是一种很有趣的显示数据的方式。目前互联网上各大网站使用地图的现象也日益常见,并且大众更喜欢使用免费的服务,比如Microsoft Virtual Earth、Google Maps和百度地图等 (Michaelis, 2011)。您可以很快的适应并使用这些主流服务提供商提供的工具处理您的事务。不过它们毕竟是大众产品,除了添加一些标记或者定位查找功能外,不能单独免费地定制个性服务,对于安全性极高需要网络隔离的单位来说,更是无计可施。
传统的开发经验是购买著名的商用软件进行数据采集管理发布,可以考虑使用国外豪华套装ArcGIS + Oracle,或者使用国内优秀软件平台MapGIS / SuperMap。但是其复杂的功能让非专业人士无从下手,并且由于高额的软件购买服务费用,很多中小型公司望而却步。
随着地理信息产业的不断进步,开源软件项目也取得了长足的进步。比如服务器中间件MapServer 作为一款开源的图像渲染软件,在过去的几年里,发展开源社区和吸纳政府资助,并且官方联合商业软件,成立了软件基金会。逐渐被大部分组织机构以及个人广泛的采用。MapServer在软件性能上丝毫不逊色于商业产品。University of North Carolina at Charlotte的Tobin Bradley对MapServer和商用软件ArcIMS进行了对比试验,结果发现前者的运行效率要明显高于后者30%。今日的开源软件MapServer无论是在网络制图领域,还是在整个地理空间信息产业软件中都竖起了一面旗帜,带领着众多开源软件一道发展 (赵博, 2006)。
通过使用开源软件平台,一些中小型企事业单位可以有能力建立自己的空间信息系统,发布共享空间数据。另外,开源软件的发展对地理信息事业的发展起到了推动作用,并且在一定程度上消除了商业垄断技术的壁垒。
-
国内外发展现状
从1998年美国副总统戈尔提出著名的"数字地球"概念到现在十多年为止,世界各国的专家学者以及众多的高新技术企业正在积极的研究Web GIS。目前,Web GIS已经深入到社会各方各面。无论是在交通、旅游、导游等民用用途还是在经济、环保、自然灾害等政府决策中,Web GIS的作用巨大。
目前国内外地理信息系统公司都生产出了自己的Web GIS 产品,如ESRI公司的ArcGIS Server,MapInfo公司的MapXtreme,以及Autodesk公司的MapGuide。受国家政府重视的原因,国内的互联网地理信息系统软件技术进步也很快。比较著名的有北京超图公司的SuperMap IS、武汉中地数码公司的MapGIS IGServer以及国家遥感应用工程研究中心网络与运行工程部自主研发的GeoBeans。虽然国内有自己的产品,但总体来看,无论是软件性能还是功能上与国外的Web GIS都有一定差距。
开源的平台因为缺失可视化的用户管理界面和复杂的开发工作,并未受到国内软件开发者的广泛重视。本文基于开源软件,意在研究一种零成本、高效的空间数据管理发布系统的开发模式。
-
本论文研究方向
本文选择的开源GIS软件平台有: PostgreSQL数据库、Quantum GIS桌面系统(简称QGIS)、MapServer空间服务器中间件、OpenLayers地图框架以及其他开源GIS库。对空间数据管理发布及开发方式做出了研究,对如何应用开源软件动态构建交互式的网络地图应用平台进行探讨。
开源软件平台体系结构和开发方式
分析Web GIS体系架构及原理机制,提出并解决了系统研发的关键问题,在此基础上设计了系统的结构框架。
基于QGIS的数据组织和制图表达
研究QGIS加载Shape File文件,处理地图颜色、比例尺、可视范围等信息,并导出Map File文件,利用Map File文件控制地图的显示样式。
基于PostgreSQL的空间数据管理
研究可储存TB量级大数据的PostgreSQL数据库,使用该数据库的空间数据支持插件PostGIS导入Shape File文件,同时本课题也使用该数据库管理用户登录注册信息。
基于Mapserver的地图渲染可视化
研究MapServer渲染矢量栅格数据原理,分析MapServer通过Map File配置文件访问矢量数据的方式和效率,利用Map File制图表达实现地图各要素类的显示。
基于OpenLayers框架的Web GIS网络端开发
基于交互式设计原则,利用OpenLayers框架设计并实现了Web电子地图服务端架构。实现了地图基本操控(缩放、漫游、复位),并在此基础上实现其他公共服务模块(编辑、旅游、工具、位置等)。
网络后台语言PHP和Ajax技术
使用后台语言使得Web GIS服务更复杂更强大,能够解决前台语言无法解决的问题。前台语言JavaScript通过Ajax技术与后台语言PHP通信,可以实现对数据库的轻松访问。
地理信息系统平台体系
-
Web GIS平台体系架构
地理信息系统平台主要由三部分组成:数据源,服务器和客户端。
图2-1. Web GIS 系统架构
以上示意图是以本文选择的开源软件作为具体实例进行绘制,并在以下部分进行详细讲解。
-
数据层
数据层包括网络服务器公共数据和本地数据。数据层中的数据一般采用空间数据库进行组织管理。空间数据库是在传统数据库基础上增加了空间信息,将属性数据和空间数据联合管理,可以存储大量空间数据,能表示复杂的数据模型。
本文主要采用本地数据,其中栅格数据是全球高清影像作为地图背景放置在文件系统中。矢量数据利用通过PostGIS导入PostgreSQL数据库进行存储管理。
数据层中的多种数据源由Map File统一进行组织管理,可将其加载到QGIS中进行配置。
-
服务层
服务层主要包括MapServer和Apache服务器。
Apache负责发布网站服务,并将用户访问浏览器的参数传递给MapServer。
MapServer接收到Apache服务器传送的参数后,根据Map File的参数从数据层获取相应的属性数据和空间数据,经过投影变换和渲染绘制后 (高进, 2013),调用GD Library(或内置的AGG Library)将矢量数据Shape File转换成geotiff、png、gif或jpg等栅格地图影像。
然后MapServer根据Map File中指定的HTML Template文档,将生成的地图动态嵌入HTML文档中。
最后,Apache服务器接收HTML文档,并将HTML返回浏览器供客户浏览。
图2-2 MapServer响应原理
Map File文件中包含了数据来源、数据格式、HTML Template、地图投影、OGC规范服务等描述信息,它起到了空间数据组织者的作用,是服务器中间件MapServer的核心配置文件。通过加载Map File,MapServer可以访问多种数据源,如MySQL、PostGIS和Oracle Spatial等,并利用GDAL支撑库访问栅格影像,利用OGR支撑库访问矢量数据,并且将各种地理要素组织成具有层次关系的对象系统。
-
客户层
客户层是基于桌面,也可以基于浏览器网页的形式展现。本文论述的客户端是在浏览器中运行的客户端。
MapServer内置支持客户端框架,当MapServer动态生成图片嵌入在Map File的Web标签中指定的网页模板,生成HTML文档并在浏览器中显示。不过,这种开发方式在进行用户交互设计时是极其复杂的,因为需要在HTML Template文件中大量设置替换变量和CGI变量。使用功能强大的开源客户端地图显示框架OpenLayers将大大简化开发工作,OpenLayers具有良好的用户体验交互界面。
OpenLayers是一种跨平台的纯JavaScript开源库,是目前流行的Web GIS前端开发软件,被国内很多知名公司采用。OpenLayers可构建符合WMS、WFS、WCS等规范的地图显示页面,能轻松的实现地图缩放、平滑拖动、鼠标滚轮控制、比例尺、鹰眼等基本控制操作功能。OpenLayers与MapServer搭配,加之jQuery-ui库对客户端界面的渲染,能为用户提供丰富多彩的地图服务。
-
数据库存储
PostgreSQL简介
PostgreSQL是由美国加州大学伯克利分校计算机系开发的对象关系型数据库管理系统。它在BSD许可证下发行,目前由全球各大公司、编程爱好者及黑客共同开发,对多进程并发支持很好,理论上能运行TB量级的数据,这已经达到了32bit计算机的极限值。故号称是目前世界上功能最强大、最先进的跨平台开源数据库系统。
-
安装配置
- PostgreSQL安装:在PostgreSQL官网上下载最新版的已编译的二进制安装包。选择自定义安装根目录,设置管理员密码进行安装。安装完毕后,可以跳过引导安装程序。
- PostGIS + pgRouting安装:在pgRouting官网上下载已编译的安装包,安装过程输入与PostgreSQL链接的密码,将插件附加到数据库中。
- 在提供公共数据的官网上下载Shape File文件,在QGIS中进行投影变换,具体步骤请参阅相关文档,不在本文研究范围内。
-
打开图形化界面pgAdmin III,可以使用鼠标操作、PSQL Console也可以用SQL创建系统数据库。本文使用SQL语句进行阐述。
- 创建数据库:
CREATE DATABASE OpenWebMapDataService
- 创建数据库扩展以支持PostGIS和pgRouting
CREATE EXTENSION postgis CREATE EXTENSION pgrouting CREATE EXTENSION postgis_topology CREATE EXTENSION fuzzystrmatch
- 打开PostgreSQL图形化插件PostGIS ShapeFile and DBF loader 2.1添加ShapeFile文件,若ShapeFile属性中有中文字段,需要将Option中的默认编码方式UTF-8改成GBK。
图2-3 数据目录(pgAdmin III界面)
至此,数据库空间数据部署完成,可以供MapFile连接使用。
-
地理信息系统集成平台
-
OSGeo4W简介
Windows平台下有两种与本课题相关的软件包:ms4w(MapServer for Windows简称)和OSGeo4W(OSGeo for Windows简称),前者主要包含Apache和MapServer,功能过于简单,本课题选择后者。OSGeo4W是开源地理信息机构下的Win 32环境下的二进制分发包,除了本课题需要的Apache、MapServer、GDAL/OGR和QGIS外,还包含了GRASS GIS、OpenEV、 uDig等超过150多种开源软件,功能及其完备。
OSGeo4W包含完整的Web GIS和Desktop GIS,在官网上下载OSGeo4W向导包后进行在线安装,安装时指定Apache占用的端口号。Apache默认端口号为80,若使用80端口但被不明进程占用,在windows cmd中输入"netstat –ano | findstr "80" ",可找到进程号,然后输入"tasklist | findstr "[$pid]""。
本课题选择高级安装,在选择安装软件时,本课题选择稳定版的安装包(需要将libjpeg-ipp 1.0-1去掉,因其与GDAL冲突)。安装结束后,软件向导会自动安装和与MapServer配合的Apache服务器。通过Windows系统的任务管理器将Apache服务由开机自动启动设置为手动启动来减少开机占用时间,可以通过修改Apache下的配置文件httpd.conf修改虚拟主机、域名、端口号和服务根目录等。
OSGeo4W下几个重要的目录:
/OSGeo4W/apache/ : apache所在目录,为Web GIS提供服务器服务,bin目录下是apache执行服务的二进制运行文件httpd.exe所在目录;cgi-bin目录没有任何执行文件,在apache的httpd.conf将/OSGeo4W/bin路径指定为/cgi-bin/(如图2-2所示),故其是bin目录的代称目录;conf目录是前文所讲述的httpd.conf所在目录,该文件设置了Apache所有参数,如访问名称(ServerName)、文档根目录(DocumentRoot)支撑库及访问权限等; htdocs是apache默认的服务所在的文档根目录,考虑到安全及管理方便问题,一般不将应用文档放置在此目录下;logs目录下的access.log记述访问apache服务信息,error.log记述apache错误信息,httpd.pid包含apache进程号;php目录,apache内置集成php,通过该apache服务器可执行php文件。
图2-4 httpd.conf文件中关于/cgi-bin/路径的设置
/OSGeo4W/apps/ : OSGeo4W内置的一些示例应用程序及数据,其中有著名的Web GIS框架fusion,通过指定config.json中MapFile文件所在的目录就能显示基本的地图服务控制框架。此外还有支持数据缓存的ka-Map框架等。
/OSGeo4W/bin/ : OSGeo4W集成的所有开源软件的二进制可执行程序及配置文件。其中,apache-install.bat、apache-restart.bat和apache-uninstall.bat对应的是Apache服务器的开启、重启和关闭。
/OSGeo4W/httpd.d/ :该目录下包含了一系列Apache应用服务的配置文件,每个建立的应用程序都需要在该目录下建立相应的配置文件,这样应用程序之间不会相互干扰并且方便管理。这些文件的命名方式要求是"http_.conf",本课题在此的配置文件命名为http_OpenWebMap.conf,具体配置信息如图2-3所示。这样在浏览器中输入 http://127.0.0.1/OpenWebMap/ 直接能连接程序界面。
图2-5 http_OpenWebMap.conf配置信息
/OSGeo4W/tmp/ : ms_tmp目录,MapServer生成瓦片图缓存的默认路径,可以在该路径中加入Ka-Map或者tilecache实现瓦片预先缓存,这样当访问到已经存在的瓦片时,apache可以直接将结果影像返回而MapServer不再需要重新生成。
-
OSGeo4W集成软件简介
本节内容将讲述在OSGeo4W中集成的软件与本课题相关的其他软件,有QGIS和MapServer。
- QGIS是基于Qt C++开发的用户界面友好的跨平台的开源桌面地理信息系统。源码采用GNU General Public License协议对外发布。
本课题将采用QGIS 2.2版本导入Shape File文件,对地图进行符号、颜色、可见比例尺进行设置,如图2-4所示。
图2-6 QGIS 图层属性设置
下图是本课题配置的地图所有样式(图2-5)。
图2-7 本课题在QGIS配置的地图
配置地图完成后需要生成MapFile文件,MapFile文件可以通过使用文本方式打开编辑,对于复杂的地图配置来说过于复杂,因此使用QGIS的插件RT MapServer Exporter生成MapFile是一种快速方便的方式。但该插件生成的MapFile文件中图层顺序与MapServer解析图层顺序相反,并且其他未设置的参数以[template]代替,MapServer不能解读,故需修改。
-
MapServer是美国明尼苏达大学(University of Minnesota)在上世纪90年代采用C开发的CGI程序,用于空间信息的Web发布和交互(MapServer 2014)。正如"MapServer 之父"Steve Lime所说的:"MapServer不是一套全能的GIS系统,它擅长于在网络上发布空间数据,构建空间网络应用的开发环境"。以下将介绍MapServer主要特性:
- 制图效率高效
MapServer是利用C语言编写的CGI脚本在服务器实时将处理的空间数据发送给服务器。同时MapServer支持FastCGI,该技术是可伸缩架构的CGI开放扩展,其主要作用是使内存驻留CGI进程,避免反复加载而获得高性能 (高进, 2013)。并且MapServer通过MapScript与其他服务器端脚本(如PHP、Java、Python和C#)结合,服务器脚本语言可以调用MapScript,实现复杂的应用。
- 地图服务遵循OGC标准规范
OGC(Open GIS Consortium)是致力于空间地理信息服务共享的组织,并且发布了一系列发布实现Web GIS互操作的实现规范,这主要包括WMS、WFS、WMC、WCS、SLD和GML(高进, 2013-05-01)。。可在Windows cmd中输入"Mapserv.exe –v"查看安装的MapServer是否支持OGC标准服务。
图2-8 MapServer版本号及支持的服务
Fig.2-8 The Version of MapServer and what the service it can support
- 丰富的支撑库
除了MapServer核心的功能模块外,大部分功能是通过基于其他开源库实现的。其中与栅格影像相关的有JPEG library、PNG library、Zlib、GDAL/OGR,与矢量影像有关的是GD library,还有支持TrueType字体库,地图投影库PROJ.4支持一千多种投影的实时转化。这些支撑库使得MapServer功能更强大。
图2-9 MapServer示例程序
-
地图发布框架 OpenLayers
地图发布框架OpenLayers是用于Web Mapping 客户端开发的开源Javascript包,OpenLayers采用采用了Ajax技术实现无刷新动态页面,整合WMS,WFS,GML,KML,Microsoft Virtual Earth,Google Map,Yahoo Map,WorldWind,MapServer等多种数据源,对地图快速实现图层控制、鼠标缩放控制、触摸屏多点触控、概览图、图面注记等并在多种主流的浏览器中运行。
表2-1 OpenLayers控件
控件名称
空间功能
Navigation
导航条
MousePosition
鼠标位置(位于地图的经纬度)
ScaleLine
比例尺
PanZoom
鼠标平移
LayerSwitcher
图层选择
OverviewMap
鹰眼
同时,OpenLayers是一个独立的库,不要求特定的web服务器或服务器端组件,它有一组组织很好的类构成,以实际的地图对象OpenLayers.Map开始,将各层类(如Layers.Google,Layers.MapServer或Layers.ArcIMS)实例化后添加到地图。然后通过Control.Navigation等代替地图控件的类的作用与地图交互。最后,采用用于样式化、数据格式化、坐标存储的各种实用工具类。下图为OpenLayers示例,采用的是OpenStreetMap地图,该示例已具备基本地图基本控制功能。
图2-11 OpenLayers示例程序
OpenLayers作为前端技术可以与MapServer、PostgreSQL完美结合 (高进, 2013-05-01)。在第四章节中本文将阐述利用OpenLayers基于这些开源GIS开发一个基本的浏览器客户端,为客户提供生活地图服务和基本的操作界面。
首先在OpenLayers官网中下载OpenLayers包,将其解压到网站位置的子目录,并将其包含在HTML文件内的如下一行的代码内:
在JavaScript文件中,使用jquery的document ready函数来设置地图。该函数晚于onLoad事件触发,因为并不是所有的图像和DOM元素都可以在onLoad事件触发时加载和准备好,但可以保证在触发该函数时一切都准备好。创建一个地图并将其分配到一个变量。在此构造函数的第二个参数允许传递选项,比如地图的控件、投影以及看查看的最大程度。maxExtents参数限制了用户所能平移的最大程度,并且指定它来避免异常操作。
1 $(document).ready(function () { 2 var Map = new OpenLayers.Map({ 3 div: 'Map', 4 maxExtent: new OpenLayers.Bounds(195.159, 167.305, 1818.495, 1790.64), 5 projection: 'EPSG: 4214', 6 controls: [ 7 new OpenLayers.Control.Attribution(), 8 new OpenLayers.Control.Navigation({ 9 documentDrag : true 10 }),// 鼠标滚轮缩放,拖动等 11 12 new OpenLayers.Control.MousePosition(), // 鼠标地理位置 13 new OpenLayers.Control.OverviewMap(), // 鹰眼 14 15 // 平移缩放工具条 16 new OpenLayers.Control.PanZoomBar({ 17 position : new OpenLayers.Pixel(20, 85) 18 }), 19 20 new OpenLayers.Control.LayerSwitcher(), // 图层选择 21 new OpenLayers.Control.ScaleLine(), 22 new OpenLayers.Control.KeyboardDefaults(), // 键盘控制 23 new OpenLayers.Control.TouchNavigation({ // 支持手机触控 24 dragPanOptions : { 25 enableKinetic : true 26 } 27 }) ], 28 29 numZoomLevels : 5 30 }) 31 });
OpenLayers内的一个地图包含了基础层和叠加层,基础层只能有一个激活,一般用作底图,叠加层通常是用户绘制的矢量层或其他来源的图层,一次可以激活多个叠加层。
本课题中选用MapServer提供的图层作为底图
1 var layer_Mapserver = new OpenLayers.Layer.MapServer({ 2 "MapServer Layer", 3 "http://127.0.0.1/cgi-bin/Mapserv.exe?Map=/OpenWebMap/china.Map", 4 {layers: 'blackground copyright surround_countries citys_admin_div pronvincial_admin_div lakes pronvincial_border rivers canal roads citys' }, 5 {singleTile: "true", ratio: 1, isBaseLayer: true} 6 }); 7 8 Map.addLayer(layer_Mapserver);
-
网络后台语言PHP和Ajax技术
PHP(Hypertext Preprocessor)在1994年由Rasmus Lerdorf创建,是一种创建动态交互性站点的强有力的开源服务器脚本语言 (w3school, 2013-12)。
本课题中主要使用PHP语言连接PostgreSQL数据库。PHP的运行需要Apache服务器的支持,OSGeo4W的Apache服务器的扩展模块中支持PHP,不再需要配置。
下面将本课题中的登录界面作为PHP语言示例做简要介绍。其中PHP与PostgreSQL数据库连接的代码段:
$con = pg_connect("host=localhost dbname=OpenWebMapAppService user=postgres password=violet") or die("Could not connect:" . pg_error());
pg_connect是PHP对PostgreSQL封装的连接函数,需要传递PostgreSQL的url地址,数据库名称,用户名,连接密码。该函数默认端口号为5432,与PostgreSQL默认端口号一致,若PostgreSQL为其他端口号,需要在参数中加入字段"port=【自定义端口号】",后面的die()函数用来处理异常情况。
通过GET方式获得HTML中的input消息的代码是:
$name = $_POST["name"];
$password = $_POST["password"];
标注:涉及到密码等隐私部分应该以POST方式传递最为安全。
查询数据库并比对与用户传递来的参数是否一致,若一致则输出succeed字符串:
$result = pg_query($con, "SELECT * FROM register") or die ("Could not query"); While ($row = pg_fetch_array($result)) { if (strcmp($row["name"], $name) != 0) { return "do not exist this user!"; } // 用户不存在的情况 if (strcmp($row["name"], $name)== 0 && strcmp($row["name"], $name) != 0) { return "password is wrong!"; } // 密码输入错误情况 if(strcmp($row["name"], $name)== 0 && strcmp($row["name"], $name)== 0) { return "success"; } // 登录成功
pg_query( )函数用来查询注册用户表,该函数返回一长串字符串,pg_fetch_array( )函数将该长字符串转换成数据存储。strcmp( )为字符串比对函数,匹配成功返回0。PHP返回的字符串是一种信号,通过Ajax技术传递到Javascript函数处理,从而实现登录。将在下面介绍。
在数据库中进行查询操作后需要关闭数据库。虽然该话题一直存在争议,认为一个用户登录该数据库后还会进行其他操作,关闭和打开数据库的代价都是相当可观的,这样可能会影响用户体验。但是,即便一位用户登录数据库后中途进行其他操作,该连接也是一直存在的,毕竟服务器的资源有限,对于大量用户访问的情况,服务器的资源会大量占用甚至崩溃。故本课题更倾向于后者,用户操作完成后数据库需要关闭。
pg_close($con) or die("Could not close database:" . pg_error());
-
本章小结
本章对PostgreSQL数据库、OSGeo4W集成开发包、OpenLayers框架以及PHP后台语言和Ajax技术进行了简介,归纳总结了主要特点,并介绍了在Windows平台下的安装配置和基本操作,系统的阐述了Web GIS开发的基本流程。下一章节中将分析本课题几个重要的问题,这也是本课题的核心所在,理解下一章节后将可以顺利的开发具有商业用途的Web GIS应用程序。
-
系统开发关键问题
-
Map File文件组织结构
Map File是服务器中间件组织地图的核心,了解Map File的语法是制图表达和本课题研究重点之一。本课题首先介绍Map File文件层级结构,然后探讨符合标准的地图符号设置,最后介绍使用QGIS插件生成Map File。
Map对象是Map File文件的根节点,其他子节点描述了地图的各种参数信息,如Projection指定整幅地图的投影方式,Scale bar描述比例尺,Web指定显示网页模板 (高进, 2013)。
图3-1 MapFile对象层次结构
下面将介绍MapFile中几个重要的对象设置:
Outputformat: Outputformat用于指定图像需要输出的格式,进行设置前应该考虑如下问题。
- 图像大小对系统性能的表现有很大影响,使用RGB模式生成图像比使用256色模式生成的图像大,加载慢;
- 根据数据种类的不同,应该考虑不同图像的位深。如使用卫星或航拍影像则应该使用RGB三通道模式生成影像,并且使用PNG24生成的图像比JPEG生成的图像比要大;
- 使用JPEG格式时,设置图像质量QUALITY可减小图像大小;
- 选择使用GD或AGG图像库渲染。
MapServer 5.0以后版本中内置支持AGG(一个使用C++开发的高质量的二维图像渲染库。具有抗锯齿和sub-pixel分辨率)。如下图3-2是本课题Outputformat参数设置。
图3-2 OpenWebMap系统的MapFile中Outputformat参数设置
Web : IMAGEPATH指定MapServer生成影像所在的文件系统路径,IMAGEURL指定Apache服务器读取MapServer生成影像的URL路径,METADATA中是用于发布WMS、WFS等的重要对象,ows_onlineresource指定MapServer加载MapFile服务,""ows_enable_request" ''*''"必不可少,否则WMS服务不能显示地图。
图3-3 OpenWebMap系统的MapFile中Web参数设置
Layer: MapServer绘制影像时,将自上至下的读取Layer对象定义的图层信息,故Layer中第一个图层作为底图。Layer中的Name指定图层名称,可显示在Legent图例中,STATUS指定图层状态:默认打开状态DEFAULT、打开状态ON和关闭状态OFF。需要注意的是TYPE的三种状态定义,其中Point用于描述地图数据的兴趣点(本系统中主要是省会、县城等),Line是将一系列顺序相关的点绘制成特定大小颜色的线(本系统中主要是河流、铁路、公路及国界省界等)。Polygon是面积需要用特定颜色的像素点填充(本系统中主要包括背景图、周边国家、省管辖区、县管辖区等)。
DATA属性需要指定数据的绝对路径,可直接指定不带后缀名的ShapeFile文件名。本系统中部分矢量数据通过PostGIS插件导入到PostgreSQL中,在MapFile的Layer对象中需要设置CONNECT属性来调用。CONNECTIONTYPE指定连接数据库名称(CONNECTION postgis),CONNECTION用于连接PostgreSQL中本系统建立的数据库(CONNECTION "user=postgres password=123 dbname=OpenWebMapDataService host=localhost port=5432")。在连接PostgreSQL中,需要查看导入到数据库中具有地理属性列的列名称(本系统中是geom,故DATA的设置项为DATA "geom from surround_countries")。
METADATA中需要指定该图层在WMS服务的名称("ows_title" "sourround_counries");在MapFile中设置LABEL对象和TEXT对象能显示图层某一字段的备注信息。LABEL对象中包含COLOR、SIZE、FONT、ENCODING、POSITION等属性,通过设置LABELITEM选择要显示备注的属性列。需要注意的是若显示中文备注,需要指定ENCODING "gb2312",并在FONTSET包含的字体文件中指定中文字体所在的路径。
图3-4 地图显示初步效果
MapFile是服务器中间件MapServer的核心文件,是数据组织和数据显示的样式文件,对于商业需要快速准确生成、快速部署来说,手动编写MapFile文件效率低下且易出错,往往不能满足要求。在开源软件QGIS中可以进行MapFile的图形化配置,在视图窗口中等到满意的效果后再导出MapFile文件。
-
数据缓存问题
用户浏览系统地图时,MapServer实时根据MapFile文件解析绘制并切割生成影像返回客户端显示。在小规模的本地数据量时响应时间可以接受,但是当本地数据量很大并且有大量用户访问时,其响应时间将难以忍受。本课题将利用开源的tilecache技术实现地图瓦片的缓存,利用缓存机制提高系统响应效率。
地图瓦片思想来自层次细节模型,可以将整幅影像切分成大量分辨率相同的小幅影像。用户查看影像时,一般一次仅对少量瓦片进行操作,服务器放送相应的瓦片即可满足用户需求。这样,在减少网络数据量减轻带宽的同时,再利用Ajax技术使瓦片自行在服务器异步下载,可大大减少系统响应时间,改善用户体验。
地图瓦片采用金字塔结构(四叉树)按比例进行分组组织和存储。每提高一个浏览级别,就是用四张较高分辨率的影像代替较低分辨率的1张影像。
金字塔模型中每个瓦片被赋予唯一的ID号,利用编号索引,结合用户操作地图所需要的分辨率,能够确定需要哪一编号的瓦片。
tilecache是一个地图瓦片缓冲器,由MetaCarta Labs开发,用来缓存地图的软件,只有当请求地图不在tilecache缓冲文件中,才会与服务交互请求地图(李振华, 刘鹏, 王真, & 高承夏, 2009),配合OpenLayers使地图显示更快。Tilecache支持多种OGC服务标准和多种服务器,并且支持多种请求格式和方式。
图3-6 tilecache缓存机制
在tilecache官网或者是Maptools官网上下载tilecache开源包。安装mod_python安装包。同样,也需要在/OSGeo4W/httpd.f/下添加相应的配置文件。修改tilecache.cgi,将第一行改成系统中python路径(如图3-7所示),之后将其后缀改成.py。
图3-7 tilecache.cgi中python路径设置
修改tilecache.cfg文件中tilecache指示的缓存瓦片。
图3-8 tilecache.cfg中文件缓存路径
最后,修改tilecache目录下的index.html文件,
Layer = new OpenLayers.Layer.WMS("VMap0", "tilecache.py?", {layers: 'basic',
format: 'image/png'});(李振华,刘鹏,王真, 2009)通过浏览器访问 http://127.0.0.1/tilecache/index.html 就能够看到瓦片地图。
-
通讯效率问题
Ajax是时序异步的Javascript和XML的接合体,是一种创建动态网页的技术。与传统的网页更新需要重新加载整个页面相比,Ajax通过在后台与服务器进行少量的数据交换,使网页实现异步更新 (田建华, 2011) (李玉龙, 2012),即不重新加载整个网页与服务器交换数据并更新部分网页。Ajax不是新的编程语言,而是一种使用现有标准的新方法。
在2005年,Google公司通过搜索栏中的Google Suggest使Ajax技术流行起来,该项技术能够创造出动态性极强的Web界面。当使用者在Google的搜索框中输入关键字时,Javascript会把该字符发送到网络端服务器,然后服务器会产生搜索建议的列表 (李双武, 2013)。
现在所有的浏览器均支持XMLHttpRequest对象,该对象在后台与服务器交换数据。但Internet Explorer使用ActiveX对象,为保证兼容性,需要封装一个函数获得XMLHttpRequest对象。
获得XMLHttpRequest对象后,就可以向服务器发送请求。可以使用XMLHttpRequest对象的open( )和send( )方法发送请求。这两个函数的参数列表如下表所示。
表3-1 XMLHttpRequest对象的open()和send()方法说明
现在可以将参数以url地址方式传递给open函数。为避免反复请求获得的是缓冲区中的数据,可以在url字符串中添加随机数。
若实现异步Javascript和XML,要求open( )方法的async参数必须设置成true。对于Web程序来说,发送异步请求是一项具有革命意义的技术,Ajax技术出现之后,Javascript脚本不再需要等待服务器的响应,而是在等待期间执行其他脚本,等到响应就绪后再处理 (李玉龙, 2012)。
最后需要获得服务器响应,这时需要使用XMLHttpRequest对象中的responseText获得字符串而responseXML属性前获得XML形式的响应数据(李玉龙, 2012)。
当请求发送到服务器时,需要判断服务器何时能够响应并完成系统发出的请服务。当XMLHttpRequest的readyState属性状态信息改变时,会触发onreadystatechange事件 (李玉龙, 2012)。
XMLHttpRequest对象重要属性:
表3-2 XMLHttpRequest对象的重要属性
当readyState等于4或者200时,表明响应已经就绪:
1 xmlHttp.onloadend = function ( ) { 2 if (xmlHttp.status == 200 || xmlHttp.readyStatus == 4) { 3 // 加入消息响应结束后应该执行的代码 4 } 5 }
衔接到本文论述PHP访问数据库验证用户信息时返回success字符串,证明验证成功。
本系统大部分功能与数据库紧密相连,这样用户进行操作时会大量打开关闭数据库,虽然通过Ajax技术实现异步操作在一定程度上减轻了系统压力,但在大量用户访问时却难以应付。本系统将常用数据以xml文件的方式缓存。下对比图为使用该思想的效率提升。
图3-9. 访问数据库获得信息时间829ms
图3-10. 访问数据缓存xml文件时间4ms
通过在Chrome浏览器上对比,仅在该项功能就节省了829ms – 4ms = 825ms。
-
最短路径问题
pgRouting最初命名为pgDijkstra,因为最初开源包中只包含Dijkstra算法,后来又加入其他算法故将其命名为pgRouting。
- Dijkstra算法
Dijkstra是最先加入到pgRouting的,该算法除了需要字段source、target、id和cost外,不需要其他的属性字段。该算法能够计算有向图和无向图,还可以接受reverse cost等字段来标明反向行走的代价。
准备工作:为roads表添加source、target和cost字段
ALTER TABLE roads ADD COLUMN source integer, ADD COLUMA target integer, ADD COLUMN cost double precision;
本课题将cost设置为道路长度:UPDATE roads SET cost = length;
建立拓扑关系:SELECT pgr_createTopology('roads', 0.000001, 'geom', 'gid');
使用pgr_dijkstra()函数求得两点之间的最短路径。
pgr_costResult [ ] pgr_dijkstra( text sql, integer source, integer target, Boolean direted, Boolean has_rcost);
pgr_dijkstra( )函数参数说明:
表3-3 pgr_dijkstra( )函数参数说明
参数
说明
sql
SQL查询语句的格式"SELECT id, source, target, cost [, reverse_cost] FROM edge_table"。其中id是用来标明边号;source是指明起始点的编号;target是指明终止点的编号cost指行走该边的代价;reverse_cost是可选项,指反向行走该边的代价,前提是该道路网是有向图,并且has_rcost字段设置为true
source
起始点的点编号
target
终止点的点编号
directed
是否为有向图
has_rcost
若设置为true的话,需要在SQL查询语句中添加reverse_cost
_dijkstra函数返回值说明
表3-4 pgr_dijkstra( )函数返回值参数
参数
说明
seq
行编号
id1
节点ID
id2
边ID(-1代表最后一行)
cost
从id1走id2路径的代价
下图3-9所示是在PostgreSQL中使用pgr_dijkstra函数查找6号节点到12号节点的最近距离
图3-11 查询从节点6到节点12最短路径的SQL语句
图3-12 pgr_dijkstra( )函数查询结果
标注:用复杂的SQL语句(如JOINs等)查询的结果顺序可能是错的。这时候需要用ORDER BY seq排序结果;cost属性代表选择该路径的代价,本示例是以length作为代价,单位为"kilometers",cost属性也可以用消耗时间、距离或者其他代替。
- A-Star算法
A-Star是另一个著名的最短路径算法,该算法为每条连接网络起始点和终止点加入了地理信息,这使得查询的结果比较接近于最短路径。
准备工作:在道路网中添加经纬度属性列(x1, y1 和 x2, y2)并计算他们的值。
1 ALTER TABLE roads ADD COLUMN x1 double precision; 2 ALTER TABLE roads ADD COLUMN y1 double precision; 3 ALTER TABLE roads ADD COLUMN x2 double precision; 4 ALTER TABLE roads ADD COLUMN y2 double precision; 5 UPDATE roads SET x1 = ST_x(ST_PointN(the_geom, 1)); 6 UPDATE roads SET y1 = ST_y(ST_PointN(the_geom, 1)); 7 UPDATE roads SET x2 = ST_x(ST_PointN(the_geom, ST_NumPoints(the_geom))); 8 UPDATE roads SET y2 = ST_y(ST_PointN(the_geom, ST_NumPoints(the_geom)));
标注:在PostGIS旧版本中不允许使用ST_startpoint或者ST_endpoint函数求经纬度坐标点。从PostGIS 2.0版本以后,ST_startpoint和ST_endpoint函数仅能够用在地理属性字段中为LINESTRING的属性列,不能用在MULTILININESTING的情况。
A-Star最短路径算法跟Dijkstra算法很相似,但是该算法更接近现实中的最短路径搜索,比Dijkstra更准确。这种启发式搜索是预定义的,如果修改这种启发式的搜索方法的话需要重新编译pgRouting。
A-Star函数定义:
pgr_costResult [ ] pgr_astar(sql text, source integer, target integer, directed boolean, has_rcost boolean)
pgr_astar( )参数设置
表3-5 pgr_astar( )函数参数
参数
说明
sql
SQL语句查询格式:SELECT id, source, target, cost, x1, y1, x2, y2 [, reverse_cost] FROM edge_table。其中,id指定边号;source指定起始点编号;target指定终止点编号;cost指定选择该边代价;x1、y1、x2、y2指定起始点和终止点横纵坐标;reverse_cost是可选项,指反向行走该边的代价,前提是该道路网是有向图,并且has_rcost字段设置为true
source
起始点编号
target
终止点编号
directed
是否为有向图
has_rcost
若设置为true的话,需要在SQL查询语句中添加reverse_cost
pgr_astar( )函数返回值与pgr_Dijkstra函数一致,不再赘述。
下图3-10所示是在PostgreSQL中使用pgr_astar函数查找6号节点到12号节点的最近距离
图3-13 从节点6到节点12的最短路径(A-Star算法)
备注:随着图的数据量越来越大,A-Star的执行效率高于Dijkstra。但这些在pgRouting中比对这两者的算法时差别不是很大。
- kDijkstra算法
kDijkstra与前两种算法不同的是该算法允许设置多个目的地,其调用形式与Dijkstra算法相似,并且不需要在Dijkstra算法上添加新的属性列。
如果主要目的是计算总体的代价,比如说计算一段复杂的道路网,函数pgr_kdijkstraCost( )能返回合适的结果;若路程的距离是最重要的,则函数pgr_kdijkstra( )返回的结果与A-Star和Dijkstra到每一个目的地的算法是一致的。
两个函数的调用方式
pgr_costResult [ ] pgr_kdijkstraCost(text sql, integer source, integer [ ] targets, boolean directed, boolean has_rcost );
pgr_costResult [ ] pgr_kdijkstraPath(text sql, integer source, integer [ ] targets, boolean directed, boolean has_rcost);
这两个函数的参数基本上与Dijkstra函数参数一致,不再赘述。值得注意的是targets是指一系列终点的数组。
pgr_kdijkstraCost( )函数的返回值列表
表3-6 pgr_kdijkstraCost( )函数的返回值列表
参数
说明
seq
行号
id1
起始点编号(在队列中该列总是起始点编号)
id2
终止点编号
cost
从id1到id2的代价。若无通路,则该值为-1
pgr_kdijkstraPath( )函数的返回值列表
表3-7 pgr_kdijkstraPath( )函数返回值列表
参数
说明
seq
行号
id1
路径所经过节点编号
id2
边编号
cost
选择id2边代价,若不连通该值为-1
图3-14 在SQL语句中使用函数pgr_kijkstraCost( )
图3-15 pgr_kdijkstraCost( )函数查询结果
图3-16 在SQL语句中使用pgr_kdijkstraPath( )函数
图3-17 pgr_kdijkstraPath( )函数查询结果
本课题使用Ajax技术,使用PHP语言访问PostgreSQL数据库,查询并返回最短路径结果。
-
网络定位问题
地理位置API(http://www.w3.org/TR/geolocation-API/)允许Javascript程序向浏览器询问用户当前具体的地理位置。识别了地理位置对于显示地图、导航和以他一些用户信息具有重要意义。考虑到用户隐私问题,支持地理位置API的浏览器在Javascript获取用户位置信息前总是询问用户是否同意 (Flanagan, 2012)。
支持地理位置API的浏览器会定义navigatior.geolocation。该对象具有如下三种方法:
getCurrentPosition( ) 获取用户当前的位置
watchPosition( ) 获取当前用户的位置,同时不断的监视用户位置,一旦用户位置变动,该方法会调用指定的回调函数。
clearWatch( ) 停止监视用户位置,传递此方法的参数应该是调用watchPosition方法获得的返回值。
在包含GPS的硬件设备上,通过GPS可以获得精确的位置信息。但是大部分情况是根据Web获得。当浏览器提交IP地址给一个Web服务时,服务器能够基于网络提供商(IPS)记录知道IP属于哪个城市。浏览器还可以请求操作系统获取无线网络列表中和信号量强度获得更精确的位置信息 (Flanagan, 2012-01)。
这些地理位置相关的技术都包含在网络的数据交换或者和多颗卫星之间的通信。因此地理位置的API是异步的:getCurrentPosition( )方法和watchPosition( )方法需要一个回调函数作为参数,在判断用书的位置信息改变时,浏览器会回调该函数 (Flanagan, 2012)。如下展示了一个获取地理位置的例子.
navigation.geolocation.getCurrentPosition(function (pos) { var lat = pos.coords.latitude; var lon = pos.coords.longitude; window.alert("now my position:" + lat + lon); }); //除了获得经纬度外,还可以获得以米为单位的地理位置精度值,若使用者的设备传感器支撑强大,系统能够求得用户所在的海拨高度、移动速度等更加详细信息。 function whereami(elt) { var potions = { // 设置为true 的话可以提高定位精度,但在移动设备上非常耗电 enableHighAccuracy: false, // 设置检查更新当前位置的时间 maxmumAge: 300000, // 设置当前位置的有效时间 timeout: 15000 }; // 检测浏览器是否支持定位 if (navigator.geolocaction) { navigator.geolocation.getCurrentPosition(success, error, options); } else { elt.innerHTML = "该浏览器不支持Geolocation对象!"; } // 错误处理函数 function error(e) { // 1: 用户不允许分享个人地理位置信息 // 2:浏览器无法确定位置 // 3:发生超时 elt.innerHTML = "Geolocation error: " + e.code + ":" + e.massage; } // 获取位置成功时,会调用此函数 function success(pos) { var msg = "Alt " + new Date(pos.timestamp).toLocationString( ) + "you were within " + pos.coords.accuracy + "meters of latitude " + pos.coords.accuracy + "longitude " + pos.coords.longitude + "."; // 若设备还返回海拔信息,添加进列表 if (pos.coords.altitude) { msg += "You are " + pos.coords.altitude + "+(-)" + pos.coords.altitudeAccurancy + "meters above sea level."; } // 若设备还返回了速度和航向信息,添加到列表 if (pos.coords.speed) { msg += "You are traveling at " + pos.coords.speed + "m/s on heading" + pos.coords.heading + "."; } elt.innerHTML = msg; }
-
本章小结
本章节重点介绍了在Web系统开发时应该解决的重要问题,MapFile文件是服务器中间件MapServer的核心配置文件,该文件配置正确与否直接影响地图显示;数据缓存问题关系系统响应效率问题,该问题若不能解决则在大量用户访问系统时会影响用户体验,甚至导致服务器崩溃;最短路径问题在地图导航应用中非常普遍,缺失该功能则对其他功能模块产生影响;网络定位问题是客户最为关心的问题,大部分用户使用Web系统原因之一便是查找自己的位置以及周边的环境。
在下一章节中本文将阐述在开源的IDE集成开发环境Eclipse中构建本系统OpenWebMap公共地图服务网站,系统中HTML、CSS、JavaScript和PHP采用不同文件进行组织,这种方式有利于维护和扩展。
本系统还会采用jquery –ui开源库渲染客户端界面并且能加速开发进程,比如selector支持快速访问文档对象,使用$('#active').removeClass('active')代替繁琐的document.getElementsByClassName("#active")函数检索到的对象进行循环。
-
系统实现
-
-
系统架构
-
图4-1 系统架构
Kernel模块主要功能是管理地图对象、地图投影、当前经纬度信息、缩放级别和地图控制等,其提供的全局变量可用于其他各个模块,是系统的内核部分。
Layers模块主要功能是加载其他矢量地图(如不同区域内的地图)、标注图层和图片图层等,为系统提供除了基本底图以外的其他叠加图层的功能,该模块是由图层堆栈统一管理,堆栈中记录着每个图层的名称、对象、类型的信息的结构体。
Module模块提供了系统菜单栏中各个模块的功能,如地图基本控制、地图量测、地图编辑、生活服务、小工具、移动定位等。
Resource模块提供了系统菜单栏资源管理的功能,Module模块中会提供的释放自身申请的系统资源的内置函数,这些函数由Resource模块统一管理,不同模块切换时会释放以前功能所占用的资源。这样才能使系统有条不紊的工作,菜单栏中各个模块由Resource联系起来组成了完整的系统,资源操作不当会使系统各个功能分崩离析。
Frame模块提供了系统框架样式函数,如菜单栏的"鱼眼"显示特效、按钮特效、进度条、LOGO拖拽特效;同时该模块还负责处理系统错误与异常,并提供基本函数功能。Frame模块中有两种初始化系统的状态:document ready状态和initialize kernel状态,前者响应时间晚于后者,是在浏览器加载DOM完毕后运行,对于系统框架样式可以使用此状态;后者随浏览器运行时便开始响应,为地图绘制赢得时间。
User模块提供了用户权限功能,该模块中有负责访问数据库验证用户信息的功能,有注册新用户功能。系统通过验证该模块得知当前操作系统用户所具有的权限从而开放不同的功能。
Message模块提供了系统通信机制的功能,提供了系统访问常用数据的优化机制和与数据库交互的功能,该部分已经在第三章通讯效率问题中做了详细论述。
各个模块各司其职,协调合作,是系统有机组成部分。
-
系统功能
如下图所示是系统在Google Chrome浏览器的界面。本系统使用OpenLayers开源框架调用MapServer响应的地图,并以地图最为整个浏览器的背景。本系统实现了用户注册登录功能,注册用户信息表位于PostgreSQL数据库中。系统权限主要分为普通用户、注册用户和管理员,不同用户享有不同的权限。
图4-2 系统界面
系统分为七大模块:操控(Control)、量测(Measure)、分析(Analyses)、旅游(Travel)、工具(Tools)、位置(Position)和网络(Network)。
-
-
控制 Control
如下图所示为地图控制工具条。第一个图标为放大功能,可以对地图拉框放大、双击放大和鼠标滚轮放大;第二个图标为缩小图标,可以对地图拉框缩小,鼠标滚动缩小;第三个图标为移动功能,点击后鼠标可以拖动地图;第四个图标,可以将地图缩放到最小缩放率;第五个图标为复位功能,点击系统将返回初始的经纬度和缩放级别。同时,鼠标移动到图标时,鼠标指针发生相应的变化,并且在图标下方显示相应的帮助信息。
图4-3 地图控制工具条
如下图所示为菜单栏,该工具条采用Magic Dock特效,鼠标移动到图标时,响应图标放大,并带动其他图标放大,并且图标缩放时其透明度也会发生相应变化,特效优美。点击相应图标,系统会显示相应模块的工具条信息。
图4-4 菜单栏
激活图片图层,可以查看各省会的简介。该功能实现的原理是通过PHP检索PostgreSQL数据库并生成XML文件,该文件通过Ajax技术返回JavaScript。
图4-5 图片图层
图4-6 PHP访问PostgreSQL生成的XML文件
鉴于系统访问文件系统中的文件比访问数据库系统中的表速度快,系统会自动生成XML文件,当用户再次访问时直接读取该文件,该部分详细内容详见3.3章节。
注册用户可以添加自己的照片经管理员审核可发布,最终形成类似谷歌地球图片图层的功能。
-
量测 Measure
用户可以使用量测工具来测量地图上的距离和面积。需要注意的是需要在Map File中指定的单位一定要与OpenLayers中设置的单位一致,否则会产生错误结果。第三个图标是统计世界各个国家的面积饼状图,鉴于方便展示起见,本系统仅展示国土面积在500万平方公里的国家。
图4-7 量测工具条
下图展示了从中国地质大学东正门到光谷广场的直线距离约为1.4公里。
图4-8 距离量测效果
下图展示了国土面积在500万平万公里的国家的面积所占比例饼状图。
图4-9 国土面积饼状图
-
编辑 Editor
用户可以使用编辑模块工具条创建点、线、面图层,并可以拖动图层中的实体。并且可以通过图层数据库删除已经创建的图层。
图4-10 分析模块工具条
图4-11添加图层对话框
图4-12 编辑效果
-
旅行 Travel
该模块提供了最短路径查询功能、地名检索功能和区域地图查看功能。最短路径功能是用户设置起始点和终止点后,系统会提供两点之间的最短路径。地名检索功能是用户输入地名首字母或第一个汉字,搜索界面会动态的提供按钮样式的联想关键字,用户点击关键字,点击Search按钮可查询地名详细地理信息,点击GO按钮系统会平移到相应位置。
图4-13 旅行工具条
图4-14 查询效果
-
工具 Tools
该模块通过日历记事功能和放大镜功能,用户可以使用日历功能记录生活信息,并且可以在地图上标注。
图4-15 小工具
-
位置 Position
用户可以使用该模块确定当前位置,具体实现详见3.4章节。在联网情况下,系统显示本机所在地点为中国地质大学西区,定位精度为60米,用户可以在对话框中选择精确定位,但这样在移动设备上会增加耗电,同时用户可以设置当前位置失效时间以及追踪用户位置。
图4-16 位置工具条
图4-17 定位功能
用户可以在高级模块中设定自己的出行计划,系统将绘制线路。鼠标点击地图时系统会自动获取点击位置的经纬度并记录。
图4-12 Position模块高级应用
图4-12 历史浏览
-
网络 Network
用户可以在该模块中为管理员留言矫正系统中的错误。
-
本章小结
本章主要介绍了基于开源GIS平台开发的地图服务系统。系统中的大部分功能偏重在学术研究方面,离生活应用服务还有一定的距离。这需要在未来的业务中丰富拓展本系统。
-
总结展望
由于商业软件都具有强大的配置、编辑和管理界面,其在市场上占有主导地位。本文以开源的PostGIS + QGIS + MapServer + OpenLayers为平台,意在研究开发一种低成本高性能的Web GIS地图服务系统。一方面可以增强对网络地理信息系统理论和技术多样性的研究,另一方面为中小型企事业单位提供了可选方案,促进了GIS推广。
-
论文总结
本文首先分析了Web GIS原理,在数据层方面,使用PostGIS存储矢量数据,建立道路网拓扑关系,在QGIS中调整空间数据显示样式,并生成Map File文件。在服务层中阐述了系统配置问题,如何利用MapServer根据Map File文件显示基本地图信息。
在第三章节中论述了Web GIS开发中的关键问题。Map File文件是地图显示的关键,该文件的组织结构、语法知识对于系统配置来说至关重要。数据缓存问题关系到系统响应效率,系统若用作商业用途并供大量用户访问,必须解决数据缓存问题。最短路径算法和网络定位问题是系统生活化的常见应用。
在第四章节里描述了本课题根据以上章节的研究使用了开源软件搭建地图服务平台。首先阐述了系统的基本架构,包括各个模块的作用,然后介绍了系统实现的功能,如地图基本控制、量测、编辑、生活应用、移动定位等。
-
项目展望
经过对本课题的研究,发现开源GIS开发无论是在学术研究上还是在商业用途上都具有长远利益。同时在开发本课题系统时也发现了诸多问题亟待解决。QGIS官方的Export MapFile插件存在图层顺序不一致问题,PostgreSQL数据库的图形化界面pgAdmin III中的SQL模块出现莫名其妙的错误重启服务又能使用的问题,著名的属性数据列名大小写混杂出错问题,利用Ajax技术交换信息时信息的加密问题。本课题只是进行了初步的试探,今后的主要工作需要从以下几方面展开:
- 根据实际的商业用途拓展
开源GIS平台并不比商业功能少,大部分功能很少被注意但是在业务中具有重要的价值,需要继续开发。其次,本课题开发的系统大部分功能偏重在学术方面,距离商用还有一定的距离。今后可以根据具体的系统需求说明书开发出具有商用价值的系统。
- 阅读并修改开源GIS平台源代码
若能深入的理解应用开源GIS软件,必须要阅读代码,根据具体的应用定量裁剪,并且修正系统的Bug和优化代码执行效率。
- 移植问题
本文论述的开发模式是B/S模式,系统需要应用于服务器。目前服务器安装的操作系统大部分是CentOS,本系统具备移植条件,只需少许改动Apache配置文件。
- 安全问题
需要对系统的通讯机制进行加密,否则骇客通过反编译手段破解数据库密码,进而篡改数据库数据。
- 3D需求问题
在OpenLayers 3.0中已经引进3D地图展示,目前属于开发版,开源库不稳定,暂不采用。待出现稳定版本时,需要考虑使用OpenLayers 3替换本文采用的OpenLayers 2。
参考文献
[1] 赵博. 软件世界-GIS利刃MapServer. 2006-10
[2] 高进. 基于MapServer的电子海图服务系统研究[D]. 大连海事大学, 2013.
[3] 开源空间信息软件. http://www.docin.com
[4] 田建华. 富客户端技术在软件项目中的应用[J]. 硅谷, 2012 (22): 154.
[5] 李玉龙. 基于Linux的家庭网关配置系统的设计与实现. 2012-04
[6] 李双龙. 合同管理系统的设计与实现. 2013-06
[7] w3school. http://www.w3school
[8] 李振华, 刘鹏, 王真, 等. WMS 服务的缓存策略研究[J]. 计算机与现代化, 2009 (5): 5-8.
[9] David Flanagan. JavaScript权威指南. 2012-01. 559-662
[10] MapServer. http://www.Mapserver.org
[11] PHP. http://www.php.org
[12] OpenLayers. http://www.openlayers.org
[13] PostgreSQL. http://www.postgresql.org
[14] QGIS. http://www.qgis.org
[15] GeoTools. http://www.geotools.org
[16] Christopher Michaelis. http://www.ibm.com/developerworks/cn/opensource/os-openlayers/
致谢
时光如白驹过隙,转眼四年间,大学时光即将结束。在这四年的求学时光里,我向给予我帮助的导师,以及师长、同学们表示诚挚的谢意。
大学的最后一年里我得到了尊敬的导师刘教授的悉心指导。刘老师是本校资深的老师,他治学态度严谨、宽以待人、谦逊随和,在学术上以及做人方面都对我产生了深刻的影响,这为我以后的工作打好了坚实的基础。在本课题的研究期间,刘老师给了我很多指导性的意见和建议,在此致以深深的敬意并表示由衷的感谢。
在这里我还要感谢徐老师和张学长,徐老师在编程技术研究方法方面给我启到了引领作用,张学长让我知道知识是次要的,学习的能力才是最重要的。
此外,还要特意感谢杨老师,杨老师为人谦逊,有很多创新想法。在我大二时杨老师对我指导很多,教给我很多解决问题的思路,并逐渐使我热爱编程。
同时还需要感谢OpenLayers、MapServer、PHP、PostgreSQL官网以及开发人员。每当问题出现时,我都详详细细的阅读开发者邮件列表,并从中找到解决方案。同时还要感谢这些开源平台的相关群,是群里很多编程大牛的帮助促成了本系统的顺利开发完成。
感谢我的父母,感谢他们多年的养育之恩。
感谢舍友,在我开发系统时与我一起探讨技术性问题。
感谢好友李悦康,她详细阅读了本文,提出了论述思路并且给出若干指导意见。
最后,再将最诚挚的祝福送给以上所有人。
附录
开源GIS图谱
开源GIS软件与开发语言图标
相关词汇
Ajax Asynchronous JavaScript And XML 异步时序技术
GDAL Geospatial Data Abstraction Library 栅格数据转换库
GIS Geographic Information System 地理信息系统
OGC Open GIS Consortium 开放地理信息系统协会
W3C World Wide Web Consortium 万维网联盟
WCS Web Coverage Service 网络覆盖服务
WFS Web Feature Service 网络要素服务
Web GIS 网络地理信息系统
WMS Web Map Service 网络地图服务
本科期间发表论文
[1] 杨乃,李悦康,陈玉成. 室内地理信息系统的设计与实现方法. 测绘通报. 2014.7