地理信息門戶可以幫助人們更容易地發現、訪問和使用地理空間信息, 是地理信息發布、服務和共享的重要環節。許多國家都很重視地理信息門戶的 建設,把它作為國家空間數據基礎設施(spatial data infrastructure,SDI)的重要組成部分。
GISLite 是地理數據發布的一個項目,使用了本書前面章節中的一些地理信息與互聯網方面的一些技術, 做的一個功能簡單的 GIS 數據發布系統,以形成一個小型的靜態網站,方便地理空間數據的查看與管理。本書兩位作者負責與參與的數據中心與知識服務項目的工作,很多數據就通過這種方式發布出來。
由于 GISLite 實現之初寫的比較匆忙,沒有經過好的設計;而且其處理的內容也比較簡單,后面也沒有再經過仔細的修改。而且隨著使用,代碼也在更新之中。在這一章進行說明時,會對設計的思想與涉及的代碼進行一些說明, 但不會太詳細,以避免代碼更新之后與書的內容對應不起來。發布一個版本也許是一種解決的方法,但隨時使用最新的代碼可能更好一點。
項目的地址為 https://www.osgeo.cn/gislite/?, 這個功能也集成到本書的配套網站中, 通過 http://webgis.cn/gislite-index.html 訪問。
先來了解一下開發的背景與設計。
11.1.1.?開發背景
在數據中心工作,經常會有一些地理空間數據需要通過 WebGIS 技術發布出來 。前面提到過數據共享。現在數據共享的工作越來越多。在數據共享中,很多的內容需要充分公開地向用戶發布出來。
元數據是了解數據的一種方式,它包含了數據的大小, 各個方面的屬性,以及空間范圍。科學數據一般也都有縮略圖,縮略圖也是一個可視化的方式。地理信息方面的一些數據,就是這種方式來快速了解。使用 WebGIS 技術可視化效果更好一些, 而且也是一個管理的一個方式,因為所有的數據能看見,當用的時候,查找更加方便。
在實際使用 WebGIS 技術發布數據時,存在有以下的問題:
有大量發布的需求,需要經常進行配置。也需要進行重新的轉換;
Mapfile 的編輯修改需要較多專業的知識;
發布后需要進行查看,以進行檢查;
數據發布過程需要的步驟較多,需要通過程序工具集成到一起。
11.1.2.?設計的基本思路
基于以上背景,建立了 GISLite 項目,基本設計思路如下。
GISLite是一個基于開源GIS技術開發,使用了靜態網站形式的GIS數據發布的應用程序。基于 MapServer 的服務器端 GIS 數據圖層發布管理系統。用于解決發布較多數量的地圖時的數據更新、樣式修改,以及不同樣式組合應用的問題。解決辦法是使用 XLSX 文件定義樣式,利用MapServer、MapProxy實現GIS數據圖層發布管理。主要面向GIS開發人員、學生以及GIS愛好者。
使用 XLSX 是工程實踐的妥協。作為一種二進制的文件形式,XLSX 的修改無法使用 Git 等代碼管理工具進行歷史的記錄, 也就無法進行回溯與比較,所以并不能算是一種好的記錄方式。在定義 Mapfile 時,其實也可以使用 XML 或 YAML 。YAML 已經比較容易編輯修改,但是依然容易出錯。而使用 XLSX 建立好模板,則不需要進行太多的說明,普通的工作人員就可以使用其來修改與更新地圖的樣式。考慮到地圖的樣式可能不必需要太多的代碼級別的仔細核對,所以最終決定了使用這種方式。
盡量實現數據源唯一性,使用 XLSX 文件定義樣式。主要實現 GIS 數據圖層的發布,但也實現了多源數據發布為單個地圖瓦片, 以及多個圖層發布為圖層分組的功能。主要有以下特點:
基于 MapServer 、 MapProxy ;
使用開放電子表格格式 XLSX 定義樣式 ;
可用于團隊地理信息數據快速發布管理 。
11.1.3.?靜態網站的優點
在 GISLite 設計中,參考了靜態網站程序的方案。
近年來,作為傳統動態網站基礎架構的替代方案,現代靜態網站生成器日漸盛行。許多導致靜態網站失敗的限制已不復存在。現在,每周都會有新的靜態網站生成器發布。簡單來說,靜態網站生成器就是一個由輕量的標記語言以及模版語言和元數據以及 CSS 預處理器, 加上可以編譯成 JavaScript 的語言構成的用來生成靜態 HTML , CSS 和 JS 文件的程序。
以 PHP 應用為例,PHP 項目得到廣泛應用的一個原因,就是易于部署。項目整體打包在一起,拷貝到約定的目錄下,配置好相關的一些參數,就可以運行起來。將數據與程序獨立出來,程序提供了功能的接口。
靜態網站有以下優點:
訪問速度快
即使是優化最好的動態網站,其性能也無法同靜態網站相比。并且,對于動態網站而言,緩存失效非常難以恢復,尤其是需要充分利用 CDN 的分布式緩存。靜態網站所有內容都儲存在 html 里面,不需要后臺服務器對內容進行渲染, 避免了查詢數據庫等操作,而且可以充分利用緩存和 CDN 。
非常安全
動態網站容易遭受蠕蟲攻擊。據保守估計,超過 70% 的 WordPress 部署容易因為已知漏洞遭受攻擊 (超過23%的 WEB 網站以 WordPress 為基礎構建)。網站安全兩大威脅 SQL 注入和 XSS(cross-site scritpting)攻擊, 靜態站點都可以很好的避免。
易于部署
靜態網站沒有后端要求,想部署在哪兒就部署在哪兒。服務器端配置簡單。只需要一個 web 服務器程序(apache、nginx)。
利于版本控制
靜態網站是由靜態文件組成,所以非常容易使用 Git 等工具進行版本控制,非常容易維護。
? ? ?5.易于集成
另外還有一點就是易于集成。在本書的配套網站中就集成了 GISLite 發布的數據, 見 http://webgis.cn/gislite-index.html 。
基于以上靜態網站的特點,適合地圖發布服務的應用。因為在用戶使用過程中只是瀏覽、查看,不需要更新、刪除等操作, 沒有動態網站的需求。
11.1.4.?程序配置
GISLite 基于 MIT 協議開源發布,托管在 github,下載程序, 源代碼網址為:https://github.com/bukun/GISLite.git 。
在開始之前,首先下載部署 GISLite 的實例,來了解一下。以下的操作都 以 Ubuntu/Debian 為例。
服務器端的安裝配置
程序的運行需要操作系統與應用程序的支持。服務器端的基本環境包括本書涉及的 Apache 、 Python3 、MapServer ;Python 語言所需要的環境包括本書前面章節介紹的 mappyfile 、 MapProxy , 以及 GDAL 、 Markdown、OpenpyXL 等模塊。
OpenpyXL 是一個Python庫,用于讀取/寫入Excel xlsx / xlsm / xltx / xltm文件。
Markdown 是一種標志語言,Python-Markdown 則用來進行解析處理。
GDAL 是柵格和矢量地理空間數據格式的轉換器庫,作為一個庫, 它為調用的應用程序提供了所有支持的格式的單個柵格抽象數據模型和單個矢量抽象數據模型。它還帶有用于數據轉換和處理的各種有用的命令行實用程序。
GISLite 綜合使用了本書介紹的技術,在安裝使用時首先需要基本的 WebGIS 運行環境。在操作系統中運行如下命令安裝基本的環境,由于 mappyfile 未包括在 Debian 源中, 需要使用 Python 的 pip 命令安裝。
sudo apt install -y apache2 php libapache2-mod-fcgid cgi-mapserver mapserver-bin libapache2-mod-phpsudo apt install -y python3-openpyxl python3-mapproxy python3-markdownsudo apt install -y build-essential python3-gdal python3-pippip3 install mappyfile
程序安裝與配置
為了進行說明,先將 GISLite 配置安裝一下。
首先獲取源代碼, 使用命令:
git?clone?https://github.com/bukun/GISLite/
GISLite 運行需要有數據支持,可以到 http://webgis.cn 網站將示例數據下載下來。
有了數據之后,需要使用配置文件將說明項目的地址、數據的位置等信息。由于 Python 語言的特征,直接將配置信息寫到 .py 文件中。cfg_demo.py 文件是一個包括配置信息的模板文件, 程序運行時需要 cfg.py 文件。將 cfg_demo.py 文件復制為 cfg.py , 并進行相應的修改。
下面是一個基本的例子,進行一下簡要說明。
TILE_SVR = '192.168.56.1:8011'GIS_BASE = '/home/bk/opt/geodemo'SITE_WS = '/home/bk/github/GISLite'USER = 'bk'
這幾個變量是必須要定義的。
TILE_SVR?聲明服務器端瓦片服務的地址與接口,
GIS_BASE?聲明地理空間數據庫所在的目錄,
SITE_WS?聲明項目(即代碼庫)的目錄,
USER 聲明進行操作的用戶名,這個用戶需要在 sudo 組內。
cfg.py 中的定義是比較靈活的。如果要使用遠程部署,可以將服務器登陸的信息放到這里:
machines = { 'aliyun3': {'u': 'bk', 'h': '192.168.56.1', 'p': 'passwd', 'ws': 'workspace'},}mach = machines['aliyun3']
現在可以在代碼倉庫下運行:
python3?build_gislite.py
運行后會生成地圖圖層的 Mapfile ,網站 HTML 文件,以及運行 MapProxy 需要的文件。這會生成一個靜態的網站。其中 Mapfile 是由主文件與各圖層定義的 Mapfile 組成。
文件生成后,需要使用下面命令將 MapProxy 服務運行起來:
cd wcs_imgmap/usr/lib/python3-mapproxy/mapproxy-util serve-develop ./mapproxy.yaml -b 0.0.0.0:8013
在 Web 瀏覽器內打開就可以瀏覽發布的 GIS 數據了 。
以上就是《開源WebGIS》教程系列——11.1 GISLite 的開發背景與設計的