李冬
(長江大學地球科學學院,湖北 武漢430100)
城市發展加速,需要大量的物質介質傳輸,城市管路空間的合理規劃利用已經成為城市基礎設施規劃的重要研究部分。目前,Java 語言平臺實現管道主題的GIS 應用中,多數為使用JavaApplet 實現C/S 客戶端模式,缺乏靈活性和跨平臺能力不足。隨著計算機網絡技術的發展,輕量化的WebGIS 城市管網系統逐漸成為主流。
當前國內外學者對Spring 框架同GeoTools 工具整合開發GIS 應用的研究并不多,注重研究管網系統設計更是風毛鱗角。其中馮亦參[1]于2006 年提出基于GeoTools 實現WebGIS 應用讀取shp 數據的解決方案;張詠新[2]等提出基于Spring 框架的WebGIS 應用整合研究;趙衛平[3]等在2017 年實現基于GeoTools 的地圖服務快速發布系統研究;
本文以解決中小型城市間管道網路應用為出發點,使用開源GIS 工具包GeoTools 基于成熟SSM架構實現高效開發。GeoTools 代碼庫迭代多年,功能豐富,并支持OGIS 接口規范,而SSM框架穩定成熟,兩者的結合是順應GIS 應用開發的潮流。
本系統使用Java 語言開發,采用Spring+Mybatis+SpringMVC的框架進行分布式開發;調用GeoTools 的jar 包來實現對地圖服務層的模塊化開發。前端地圖的顯示服務由openlayers 提供支持,web 端服務器由Nginx+Tomcat 來實現管道數據的發布與展示。服務器端部署在Liunx 系統下,通過docker 容器統一管理,而客戶端可通過瀏覽器實現全平臺兼容運行;
整個架構由下至上分別為表現層、邏輯層和數據層。在邏輯層的內三層體系中:持久層聯系數據庫的數據編輯、讀取以及并發操作;服務層指明數據的組織管理模式,是控制層和持久層聯系的樞紐;控制層則說明功能劃分,提供接口同時進行命令分配。用戶將請求傳遞給邏輯層,邏輯層完成的結果通過表現層進行展示。
表現層即為客戶端(瀏覽器端),是用戶操作的實際界面,也是功能發起方,也是最終結果的顯示平臺。
數據層是由數據庫為主體的數據持久化存儲的平臺,也是對邏輯層的功能發起的反饋數據處理層(圖1)。

圖1 系統架構
在此體系架構下,數據層包含管線數據的讀存編輯功能,負責對數據庫的增刪查改與維護;邏輯層則服務整個系統應用功能的處理;表現層通過Ajax 實現同客戶端的通信,并啟用地圖服務的調用。典型的三層結構設計實現系統的低耦合性,高可用性和高維護性,實現組件式開發。
數據庫使用開源的MySQL 數據庫,數據層中所需要的空間數據放置于網絡服務器中,通過GeoTools 來調用;屬性數據資源包括像管道編號,時間,坐標等數據存放在MySQL 屬性庫中;管線專題數據主要分為測區數據、管線數據和節點數據這三大類型,其中線結構設計主要由管線編號、物探號、起終點坐標、控制點,流向、旋轉角、材質和日期等屬性組成,并通過外鍵或非空約束來保證數據完整性。
1.4.1 覆土深度的分析功能
可以對地圖上的任意管線進行覆土深度的探測,并且將探測結果與國家規范對比,將不符合標準的管線進行預警標注。
1.4.2 道路擴建分析
通過對某一條道路進行擴建的寬度值的設置預見可能受到影響的管線的情況,使用緩沖區分析可以較好實現(圖2)。
1.4.3 碰撞檢測分析功能
可以對管線和其周圍的管線進行水平和垂直方向的凈距分析,找出存在安全隱患的地下管線或者避免在設計階段的不合理施工。在進行碰撞分析時,首先需要確定管線間的空間關系,是否存在相交關系等等,通過計算其兩者之間的垂直或水平凈距,來確定其管線間的空間位置關系。

圖2 碰撞分析和斷面分析技術流程

圖3 爆管分析技術流程
1.4.4 橫斷面分析功能
通過對某一管線的屬性信息和管線與其周圍管線的關系進行分析,以橫切圖的形式再現地下管線的空間分布情況,為管理施工提供決策依據;
1.4.5 爆管分析功能
當某一管線發生爆管現象的時候,系統要迅速確定發生爆管的位置,提供最佳的關閥方案。爆管分析是一種管道事故分析功能,在更多的時候應避免出現爆管現象,但爆管分析可以及時減輕意外事故造成的經濟損失和社會危害,通過系統的預警能力將事故發生率降至最低。
爆管分析的基本算法思想是:從爆裂的管點出發,尋找與之關聯的管點,在管網系統內通過關聯關系,遍歷所有管線和管點,準確尋找可以阻止工質流向的點(控制點)。值得注意的是,爆管分析是一種對節點數量不易控制的分析方法,使用廣度優先遍歷算法占用內存較大,溢出風險高,故使用深度優先遍歷會更加合適,算法的具體思想流程如圖3 所示。
2.1.1 構建圖形向量的實現
一 種 是 通 過 GeometryFactory 工 廠 類 中 的SimpleFeatureBuilder 來進行實現:首先是創建點要素Point,然后按照SimpleFeatureType 給的字段順序進行屬性賦值,最后使用simpleFeatureBuilder 對象的buildFeature()方法來構建向量;第二中進行向量構建的方式是通過ShapefileDataStore 類中getFeatureWriter()方法進行添加的:首先通過類型轉化創建出ShapefileDataStore,其次是設置寫入Writer 流為自動寫入后,循環寫入要素即可。
2.1.2 空間信息檢索的實現
通過GeoTools 中提供類似于MyBatis 框架的sql 語句封裝機制,可以通過經緯度圖形來檢索相似的地理要素,通過GetFeatureInfo 操作通過坐標方位對要素集進行查詢并返回指定的屬性信息;先計算出點選范圍的地圖坐標并轉化,隨后遍歷圖層來查找對象,獲取并轉化為Geometry 類型,然后通過getFeatures()方法獲取特征向量,循環獲取地形元素geom 來實現空間信息的檢索。
客戶端界面通過OpenLayers 來調用地圖服務,通過GeoTools 和ArgGISforJS 的接口來定制系統復雜的功能,結果如圖所示,可以實現地圖的多級縮放和精確量算,并實現空間檢索和編輯的功能。
本文使用GIS 工具包GeoTools 基于SSM 架構實現高效開發,兩者在WebGIS 系統中的應用并不多見,通過對城市管路網絡主題的GIS 應用的設計來推廣開發者對與GeoTools 的使用,并為廣大讀者提供應用SSM 框架搭建WebGIS 應用的設計參考。