開源GIS平臺空間數據管理與發佈技術研究

畢業論文(設計)php

 

題目: 開源GIS平臺空間數據管理與發佈技術研究html

2014 年 5 月前端

 

摘要python

    本文系統地分析了網絡地理信息系統(Web GIS)工做原理,闡述了使用免費、開源的GIS平臺的開發模式。介紹了在PostGIS中管理矢量數據的方法,在Quantum GIS中調整地圖樣式並生成Map File文件的方法,介紹了使用MapServer根據Map File文件顯示地圖的方法,在開源Web GIS框架OpenLayers中發佈MapServer和WMS服務的方法,以及使用PHP與PostgreSQL交互的方法。jquery

    本文詳細論述了Web GIS開發過程當中重要的課題,Map File文件的語法和配置問題、數據緩存問題、通信效率問題、最短路徑問題和網絡定位問題,而且給出了相應的解決策略。git

    最後本課題採用B/S結構,使用HTML + CSS + JavaScript + PHP以及Ajax技術,在開源的IDE環境Eclipse中搭建了一個地圖管理髮布系統,並經過Apache服務器發佈供用戶訪問。該系統可以實現了地圖基本操控、量測、編輯、旅行、地點搜索、移動定位等功能,對使用開源GIS平臺作網絡端開發的工做者具備必定的指導意義。web

 

關鍵詞:開源GIS,地圖服務,PostgreSQL/ PostGIS,QGIS,MapServer,OpenLayer算法

 

Abstractsql

    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    網絡後臺語言PHPAjax技術    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

 第一章 緒論

  1. 引言

        無論您是在地圖上標記度假照片,仍是想向客戶展現所採樣的樣例站點,地圖都是一種頗有趣的顯示數據的方式。目前互聯網上各大網站使用地圖的現象也日益常見,而且大衆更喜歡使用免費的服務,好比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)。

        經過使用開源軟件平臺,一些中小型企事業單位能夠有能力創建本身的空間信息系統,發佈共享空間數據。另外,開源軟件的發展對地理信息事業的發展起到了推進做用,而且在必定程度上消除了商業壟斷技術的壁壘。

  2. 國內外發展示狀

        從1998年美國副總統戈爾提出著名的"數字地球"概念到如今十多年爲止,世界各國的專家學者以及衆多的高新技術企業正在積極的研究Web GIS。目前,Web GIS已經深刻到社會各方各面。不管是在交通、旅遊、導遊等民用用途仍是在經濟、環保、天然災害等政府決策中,Web GIS的做用巨大。

        目前國內外地理信息系統公司都生產出了本身的Web GIS 產品,如ESRI公司的ArcGIS Server,MapInfo公司的MapXtreme,以及Autodesk公司的MapGuide。受國家政府重視的緣由,國內的互聯網地理信息系統軟件技術進步也很快。比較著名的有北京超圖公司的SuperMap IS、武漢中地數碼公司的MapGIS IGServer以及國家遙感應用工程研究中心網絡與運行工程部自主研發的GeoBeans。雖然國內有本身的產品,但整體來看,不管是軟件性能仍是功能上與國外的Web GIS都有必定差距。

        開源的平臺由於缺失可視化的用戶管理界面和複雜的開發工做,並未受到國內軟件開發者的普遍重視。本文基於開源軟件,意在研究一種零成本、高效的空間數據管理髮布系統的開發模式。

  3. 本論文研究方向

        本文選擇的開源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通訊,能夠實現對數據庫的輕鬆訪問。

 

地理信息系統平臺體系

 

  1. Web GIS平臺體系架構

    地理信息系統平臺主要由三部分組成:數據源,服務器和客戶端。

    圖2-1. Web GIS 系統架構

    以上示意圖是以本文選擇的開源軟件做爲具體實例進行繪製,並在如下部分進行詳細講解。

  2. 數據層

          數據層包括網絡服務器公共數據和本地數據。數據層中的數據通常採用空間數據庫進行組織管理。空間數據庫是在傳統數據庫基礎上增長了空間信息,將屬性數據和空間數據聯合管理,能夠存儲大量空間數據,能表示複雜的數據模型。

          本文主要採用本地數據,其中柵格數據是全球高清影像做爲地圖背景放置在文件系統中。矢量數據利用經過PostGIS導入PostgreSQL數據庫進行存儲管理。

          數據層中的多種數據源由Map File統一進行組織管理,可將其加載到QGIS中進行配置。

  3. 服務層

          服務層主要包括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支撐庫訪問矢量數據,而且將各類地理要素組織成具備層次關係的對象系統。

  1. 客戶層

          客戶層是基於桌面,也能夠基於瀏覽器網頁的形式展示。本文論述的客戶端是在瀏覽器中運行的客戶端。

          MapServer內置支持客戶端框架,當MapServer動態生成圖片嵌入在Map File的Web標籤中指定的網頁模板,生成HTML文檔並在瀏覽器中顯示。不過,這種開發方式在進行用戶交互設計時是極其複雜的,由於須要在HTML Template文件中大量設置替換變量和CGI變量。使用功能強大的開源客戶端地圖顯示框架OpenLayers將大大簡化開發工做,OpenLayers具備良好的用戶體驗交互界面。

          OpenLayers是一種跨平臺的純JavaScript開源庫,是目前流行的Web GIS前端開發軟件,被國內不少知名公司採用。OpenLayers可構建符合WMS、WFS、WCS等規範的地圖顯示頁面,能輕鬆的實現地圖縮放、平滑拖動、鼠標滾輪控制、比例尺、鷹眼等基本控制操做功能。OpenLayers與MapServer搭配,加之jQuery-ui庫對客戶端界面的渲染,能爲用戶提供豐富多彩的地圖服務。

  2. 數據庫存儲

PostgreSQL簡介

      PostgreSQL是由美國加州大學伯克利分校計算機系開發的對象關係型數據庫管理系統。它在BSD許可證下發行,目前由全球各大公司、編程愛好者及黑客共同開發,對多進程併發支持很好,理論上能運行TB量級的數據,這已經達到了32bit計算機的極限值。故號稱是目前世界上功能最強大、最早進的跨平臺開源數據庫系統。

 

  1. 安裝配置

    1. PostgreSQL安裝:在PostgreSQL官網上下載最新版的已編譯的二進制安裝包。選擇自定義安裝根目錄,設置管理員密碼進行安裝。安裝完畢後,能夠跳過引導安裝程序。
    2. PostGIS + pgRouting安裝:在pgRouting官網上下載已編譯的安裝包,安裝過程輸入與PostgreSQL連接的密碼,將插件附加到數據庫中。
    3. 在提供公共數據的官網上下載Shape File文件,在QGIS中進行投影變換,具體步驟請參閱相關文檔,不在本文研究範圍內。
    4. 打開圖形化界面pgAdmin III,可使用鼠標操做、PSQL Console也能夠用SQL建立系統數據庫。本文使用SQL語句進行闡述。
      1. 建立數據庫:
      CREATE DATABASE OpenWebMapDataService
      1. 建立數據庫擴展以支持PostGIS和pgRouting
      CREATE EXTENSION postgis
      CREATE EXTENSION pgrouting
      CREATE EXTENSION postgis_topology
      CREATE EXTENSION fuzzystrmatch
    5. 打開PostgreSQL圖形化插件PostGIS ShapeFile and DBF loader 2.1添加ShapeFile文件,若ShapeFile屬性中有中文字段,須要將Option中的默認編碼方式UTF-8改爲GBK。

    圖2-3 數據目錄(pgAdmin III界面)

    至此,數據庫空間數據部署完成,能夠供MapFile鏈接使用。

  2. 地理信息系統集成平臺

  3. 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再也不須要從新生成。

  4. OSGeo4W集成軟件簡介

    本節內容將講述在OSGeo4W中集成的軟件與本課題相關的其餘軟件,有QGIS和MapServer。

    1. 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不能解讀,故需修改。

    1. MapServer是美國明尼蘇達大學(University of Minnesota)在上世紀90年代採用C開發的CGI程序,用於空間信息的Web發佈和交互(MapServer 2014)。正如"MapServer 之父"Steve Lime所說的:"MapServer不是一套全能的GIS系統,它擅長於在網絡上發佈空間數據,構建空間網絡應用的開發環境"。如下將介紹MapServer主要特性:
      1. 製圖效率高效

          MapServer是利用C語言編寫的CGI腳本在服務器實時將處理的空間數據發送給服務器。同時MapServer支持FastCGI,該技術是可伸縮架構的CGI開放擴展,其主要做用是使內存駐留CGI進程,避免反覆加載而得到高性能 (高進, 2013)。而且MapServer經過MapScript與其餘服務器端腳本(如PHP、Java、Python和C#)結合,服務器腳本語言能夠調用MapScript,實現複雜的應用。

    1. 地圖服務遵循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

    1. 豐富的支撐庫

    除了MapServer核心的功能模塊外,大部分功能是經過基於其餘開源庫實現的。其中與柵格影像相關的有JPEG library、PNG library、Zlib、GDAL/OGR,與矢量影像有關的是GD library,還有支持TrueType字體庫,地圖投影庫PROJ.4支持一千多種投影的實時轉化。這些支撐庫使得MapServer功能更強大。

    圖2-9 MapServer示例程序

  5. 地圖發佈框架 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);

 

  1. 網絡後臺語言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());

     

  2. 本章小結

          本章對PostgreSQL數據庫、OSGeo4W集成開發包、OpenLayers框架以及PHP後臺語言和Ajax技術進行了簡介,概括總結了主要特色,並介紹了在Windows平臺下的安裝配置和基本操做,系統的闡述了Web GIS開發的基本流程。下一章節中將分析本課題幾個重要的問題,這也是本課題的核心所在,理解下一章節後將能夠順利的開發具備商業用途的Web GIS應用程序。

  3. 系統開發關鍵問題

  4. 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用於指定圖像須要輸出的格式,進行設置前應該考慮以下問題。

    1. 圖像大小對系統性能的表現有很大影響,使用RGB模式生成圖像比使用256色模式生成的圖像大,加載慢;
    2. 根據數據種類的不一樣,應該考慮不一樣圖像的位深。如使用衛星或航拍影像則應該使用RGB三通道模式生成影像,而且使用PNG24生成的圖像比JPEG生成的圖像比要大;
    3. 使用JPEG格式時,設置圖像質量QUALITY可減少圖像大小;
    4. 選擇使用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文件。

  5. 數據緩存問題

          用戶瀏覽系統地圖時,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 就可以看到瓦片地圖。

  6. 通信效率問題

          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。

  7. 最短路徑問題

          pgRouting最初命名爲pgDijkstra,由於最初開源包中只包含Dijkstra算法,後來又加入其餘算法故將其命名爲pgRouting。

    1. 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屬性也能夠用消耗時間、距離或者其餘代替。

    1. 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指定選擇該邊代價;x一、y一、x二、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中比對這二者的算法時差異不是很大。

    1. 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數據庫,查詢並返回最短路徑結果。

  8. 網絡定位問題

          地理位置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;
    }

     

  9. 本章小結

          本章節重點介紹了在Web系統開發時應該解決的重要問題,MapFile文件是服務器中間件MapServer的核心配置文件,該文件配置正確與否直接影響地圖顯示;數據緩存問題關係系統響應效率問題,該問題若不能解決則在大量用戶訪問系統時會影響用戶體驗,甚至致使服務器崩潰;最短路徑問題在地圖導航應用中很是廣泛,缺失該功能則對其餘功能模塊產生影響;網絡定位問題是客戶最爲關心的問題,大部分用戶使用Web系統緣由之一即是查找本身的位置以及周邊的環境。

          在下一章節中本文將闡述在開源的IDE集成開發環境Eclipse中構建本系統OpenWebMap公共地圖服務網站,系統中HTML、CSS、JavaScript和PHP採用不一樣文件進行組織,這種方式有利於維護和擴展。

    本系統還會採用jquery –ui開源庫渲染客戶端界面而且能加速開發進程,好比selector支持快速訪問文檔對象,使用$('#active').removeClass('active')代替繁瑣的document.getElementsByClassName("#active")函數檢索到的對象進行循環。

  10. 系統實現

      1. 系統架構

    圖4-1 系統架構

          Kernel模塊主要功能是管理地圖對象、地圖投影、當前經緯度信息、縮放級別和地圖控制等,其提供的全局變量可用於其餘各個模塊,是系統的內核部分。

          Layers模塊主要功能是加載其餘矢量地圖(如不一樣區域內的地圖)、標註圖層和圖片圖層等,爲系統提供除了基本底圖之外的其餘疊加圖層的功能,該模塊是由圖層堆棧統一管理,堆棧中記錄着每一個圖層的名稱、對象、類型的信息的結構體。

          Module模塊提供了系統菜單欄中各個模塊的功能,如地圖基本控制、地圖量測、地圖編輯、生活服務、小工具、移動定位等。

          Resource模塊提供了系統菜單欄資源管理的功能,Module模塊中會提供的釋放自身申請的系統資源的內置函數,這些函數由Resource模塊統一管理,不一樣模塊切換時會釋放之前功能所佔用的資源。這樣才能使系統有條不紊的工做,菜單欄中各個模塊由Resource聯繫起來組成了完整的系統,資源操做不當會使系統各個功能分崩離析。

          Frame模塊提供了系統框架樣式函數,如菜單欄的"魚眼"顯示特效、按鈕特效、進度條、LOGO拖拽特效;同時該模塊還負責處理系統錯誤與異常,並提供基本函數功能。Frame模塊中有兩種初始化系統的狀態:document ready狀態和initialize kernel狀態,前者響應時間晚於後者,是在瀏覽器加載DOM完畢後運行,對於系統框架樣式可使用此狀態;後者隨瀏覽器運行時便開始響應,爲地圖繪製贏得時間。

          User模塊提供了用戶權限功能,該模塊中有負責訪問數據庫驗證用戶信息的功能,有註冊新用戶功能。系統經過驗證該模塊得知當前操做系統用戶所具備的權限從而開放不一樣的功能。

          Message模塊提供了系統通訊機制的功能,提供了系統訪問經常使用數據的優化機制和與數據庫交互的功能,該部分已經在第三章通信效率問題中作了詳細論述。

    各個模塊各司其職,協調合做,是系統有機組成部分。

    1. 系統功能

          以下圖所示是系統在Google Chrome瀏覽器的界面。本系統使用OpenLayers開源框架調用MapServer響應的地圖,並以地圖最爲整個瀏覽器的背景。本系統實現了用戶註冊登陸功能,註冊用戶信息表位於PostgreSQL數據庫中。系統權限主要分爲普通用戶、註冊用戶和管理員,不一樣用戶享有不一樣的權限。

    圖4-2 系統界面

          系統分爲七大模塊:操控(Control)、量測(Measure)、分析(Analyses)、旅遊(Travel)、工具(Tools)、位置(Position)和網絡(Network)。

  11. 控制 Control

          以下圖所示爲地圖控制工具條。第一個圖標爲放大功能,能夠對地圖拉框放大、雙擊放大和鼠標滾輪放大;第二個圖標爲縮小圖標,能夠對地圖拉框縮小,鼠標滾動縮小;第三個圖標爲移動功能,點擊後鼠標能夠拖動地圖;第四個圖標,能夠將地圖縮放到最小縮放率;第五個圖標爲復位功能,點擊系統將返回初始的經緯度和縮放級別。同時,鼠標移動到圖標時,鼠標指針發生相應的變化,而且在圖標下方顯示相應的幫助信息。

    圖4-3 地圖控制工具條

          以下圖所示爲菜單欄,該工具條採用Magic Dock特效,鼠標移動到圖標時,響應圖標放大,並帶動其餘圖標放大,而且圖標縮放時其透明度也會發生相應變化,特效優美。點擊相應圖標,系統會顯示相應模塊的工具條信息。

    圖4-4 菜單欄

          激活圖片圖層,能夠查看各省會的簡介。該功能實現的原理是經過PHP檢索PostgreSQL數據庫並生成XML文件,該文件經過Ajax技術返回JavaScript。

    圖4-5 圖片圖層

    圖4-6 PHP訪問PostgreSQL生成的XML文件

          鑑於系統訪問文件系統中的文件比訪問數據庫系統中的錶速度快,系統會自動生成XML文件,當用戶再次訪問時直接讀取該文件,該部分詳細內容詳見3.3章節。

    註冊用戶能夠添加本身的照片經管理員審覈可發佈,最終造成相似谷歌地球圖片圖層的功能。

  12. 量測 Measure

          用戶可使用量測工具來測量地圖上的距離和麪積。須要注意的是須要在Map File中指定的單位必定要與OpenLayers中設置的單位一致,不然會產生錯誤結果。第三個圖標是統計世界各個國家的面積餅狀圖,鑑於方便展現起見,本系統僅展現國土面積在500萬平方千米的國家。

    圖4-7 量測工具條

          下圖展現了從中國地質大學東正門到光谷廣場的直線距離約爲1.4千米。

    圖4-8 距離量測效果

          下圖展現了國土面積在500萬平萬千米的國家的面積所佔比例餅狀圖。

    圖4-9 國土面積餅狀圖

  13. 編輯 Editor

          用戶可使用編輯模塊工具條建立點、線、面圖層,並能夠拖動圖層中的實體。而且能夠經過圖層數據庫刪除已經建立的圖層。

    圖4-10 分析模塊工具條

    圖4-11添加圖層對話框

    圖4-12 編輯效果

  14. 旅行 Travel

          該模塊提供了最短路徑查詢功能、地名檢索功能和區域地圖查看功能。最短路徑功能是用戶設置起始點和終止點後,系統會提供兩點之間的最短路徑。地名檢索功能是用戶輸入地名首字母或第一個漢字,搜索界面會動態的提供按鈕樣式的聯想關鍵字,用戶點擊關鍵字,點擊Search按鈕可查詢地名詳細地理信息,點擊GO按鈕系統會平移到相應位置。

    圖4-13 旅行工具條

    圖4-14 查詢效果

  15. 工具 Tools

          該模塊經過日曆記事功能和放大鏡功能,用戶可使用日曆功能記錄生活信息,而且能夠在地圖上標註。

    圖4-15 小工具

  16. 位置 Position

          用戶可使用該模塊肯定當前位置,具體實現詳見3.4章節。在聯網狀況下,系統顯示本機所在地點爲中國地質大學西區,定位精度爲60米,用戶能夠在對話框中選擇精肯定位,但這樣在移動設備上會增長耗電,同時用戶能夠設置當前位置失效時間以及追蹤用戶位置。

    圖4-16 位置工具條

    圖4-17 定位功能

          用戶能夠在高級模塊中設定本身的出行計劃,系統將繪製線路。鼠標點擊地圖時系統會自動獲取點擊位置的經緯度並記錄。

    圖4-12 Position模塊高級應用

    圖4-12 歷史瀏覽

  17. 網絡 Network

          用戶能夠在該模塊中爲管理員留言矯正系統中的錯誤。

  18. 本章小結

          本章主要介紹了基於開源GIS平臺開發的地圖服務系統。系統中的大部分功能偏重在學術研究方面,離生活應用服務還有必定的距離。這須要在將來的業務中豐富拓展本系統。

  19. 總結展望

          因爲商業軟件都具備強大的配置、編輯和管理界面,其在市場上佔有主導地位。本文以開源的PostGIS + QGIS + MapServer + OpenLayers爲平臺,意在研究開發一種低成本高性能的Web GIS地圖服務系統。一方面能夠加強對網絡地理信息系統理論和技術多樣性的研究,另外一方面爲中小型企事業單位提供了可選方案,促進了GIS推廣。

  20. 論文總結

          本文首先分析了Web GIS原理,在數據層方面,使用PostGIS存儲矢量數據,創建道路網拓撲關係,在QGIS中調整空間數據顯示樣式,並生成Map File文件。在服務層中闡述了系統配置問題,如何利用MapServer根據Map File文件顯示基本地圖信息。

          在第三章節中論述了Web GIS開發中的關鍵問題。Map File文件是地圖顯示的關鍵,該文件的組織結構、語法知識對於系統配置來講相當重要。數據緩存問題關係到系統響應效率,系統若用做商業用途並供大量用戶訪問,必須解決數據緩存問題。最短路徑算法和網絡定位問題是系統生活化的常見應用。

          在第四章節裏描述了本課題根據以上章節的研究使用了開源軟件搭建地圖服務平臺。首先闡述了系統的基本架構,包括各個模塊的做用,而後介紹了系統實現的功能,如地圖基本控制、量測、編輯、生活應用、移動定位等。

  21. 項目展望

          通過對本課題的研究,發現開源GIS開發不管是在學術研究上仍是在商業用途上都具備長遠利益。同時在開發本課題系統時也發現了諸多問題亟待解決。QGIS官方的Export MapFile插件存在圖層順序不一致問題,PostgreSQL數據庫的圖形化界面pgAdmin III中的SQL模塊出現莫名其妙的錯誤重啓服務又能使用的問題,著名的屬性數據列名大小寫混雜出錯問題,利用Ajax技術交換信息時信息的加密問題。本課題只是進行了初步的試探,從此的主要工做須要從如下幾方面展開:

    1. 根據實際的商業用途拓展

          開源GIS平臺並不比商業功能少,大部分功能不多被注意可是在業務中具備重要的價值,須要繼續開發。其次,本課題開發的系統大部分功能偏重在學術方面,距離商用還有必定的距離。從此能夠根據具體的系統需求說明書開發出具備商用價值的系統。

    1. 閱讀並修改開源GIS平臺源代碼

          若能深刻的理解應用開源GIS軟件,必需要閱讀代碼,根據具體的應用定量裁剪,而且修正系統的Bug和優化代碼執行效率。

    1. 移植問題

          本文論述的開發模式是B/S模式,系統須要應用於服務器。目前服務器安裝的操做系統大部分是CentOS,本系統具有移植條件,只需少量改動Apache配置文件。

    1. 安全問題

          須要對系統的通信機制進行加密,不然駭客經過反編譯手段破解數據庫密碼,進而篡改數據庫數據。

    1. 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軟件與開發語言圖標

    OSGeo4W標誌

    PostgreSQL標誌

    QGIS標誌

    MapServer標誌

    Apache標誌

    PHP標誌

    OpenLayers標誌

    jQuery標誌

    相關詞彙

    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

相關文章
相關標籤/搜索