|
(五)OpenLayers 數(shù)據(jù)解析—以GML為例
前面也提到過,OpenLayers設(shè)計是符合標準的,有良好的框架結(jié)構(gòu)和實現(xiàn)機制,非常值得學習。OpenLayers支持的格式比較多,有XML、GML、GeoJSON、GeoRSS、JSON、KML、WFS等。這回主要以GML為例來看OpenLayers 數(shù)據(jù)的解析過程。 先來了解一下GML: GML (Geography Markup Language)即地理標識語言,它由OGC(開放式地理信息系統(tǒng)協(xié)會)于1999年提出,目前版本是3.0。GML是XML在地理空間信息領(lǐng)域的應(yīng)用。利用GML可以存儲和發(fā)布各種特征的地理信息,并控制地理信息在Web瀏覽器中的顯示。地理空間互聯(lián)網(wǎng)絡(luò)作為全球信息基礎(chǔ)架構(gòu)的一部分,已成為Internet上技術(shù)追蹤的熱點。許多公司和相關(guān)研究機構(gòu)通過Web將眾多的地理信息源集成在一起,向用戶提供各種層次的應(yīng)用服務(wù),同時支持本地數(shù)據(jù)的開發(fā)和管理。GML可以在地理空間Web領(lǐng)域完成了同樣的任務(wù)。GML技術(shù)的出現(xiàn)是地理空間數(shù)據(jù)管理方法的一次飛躍。 介紹一篇文章:GML3.0的WebGlS研究。 我們從總體上來把握一下OpenLayers對于GML數(shù)據(jù)的解析,首先通過調(diào)用得到GML文本數(shù)據(jù),然后通過Formate.GML類的read方法來解析這個文本,解析得到Geometry對象,然后Geometry對象用相應(yīng)的渲染器畫出來。其實解析得到還是那些基本的Point呀、LineString呀之類的Geometry對象,就是我們在地圖上看到的那些內(nèi)容。 下面看其實現(xiàn)過程: //read()函數(shù)讀取數(shù)據(jù),獲取特征列表 read: function(data) { if(typeof data == "string") { data = OpenLayers.Format.XML.prototype.read.apply(this, [data]); } var featureNodes = this.getElementsByTagNameNS (data.documentElement,this.gmlns, this.featureName); var features = []; for(var i=0; i<featureNodes.length; i++) { var feature = this.parseFeature(featureNodes); if(feature) { features.push(feature); } } return features; } //函數(shù)parseFeature()是OpenLayers中GML數(shù)據(jù)格式解析的核心,就是它創(chuàng)建地理對象 //和其屬性。 //實際上,每一個Foramt 子類都實現(xiàn)了這個成員函數(shù),完成類似的功能。 parseFeature: function(node) { // only accept on geometry per feature - look for highest "order" var order = ["MultiPolygon", "Polygon", "MultiLineString", "LineString", "MultiPoint", "Point"]; var type, nodeList, geometry, parser; for(var i=0; i<order.length; ++i) { type = order; nodeList = this.getElementsByTagNameNS(node, this.gmlns, type); if(nodeList.length > 0) { // only deal with first geometry of this type var parser = this.parseGeometry[type.toLowerCase()]; if(parser) { geometry = parser.apply(this, [nodeList[0]]); } else { OpenLayers.Console.error("Unsupported geometry type: " + type); } // stop looking for different geometry types break; } } // construct feature (optionally with attributes) var attributes; if(this.extractAttributes) { attributes = this.parseAttributes(node); } var feature = new OpenLayers.Feature.Vector(geometry, attributes); // assign fid - this can come from a "fid" or "id" attribute var childNode = node.firstChild; var fid; while(childNode) { if(childNode.nodeType == 1) { fid = childNode.getAttribute("fid") || childNode.getAttribute("id"); if(fid) { break; } } childNode = childNode.nextSibling; } feature.fid = fid; return feature; } 剩下就是由具體的函數(shù)parse and bulid基本的地理對象(還有Attribute),包括point、multipoint、linestring、multilinestring、polygon、multipolygon等,然后在write出來。 結(jié)合前面的“OpenLayers空間數(shù)據(jù)的組織”,我們可以看到OpenLayers在解析獲取GML數(shù)據(jù)的時候,比如涉及到面、線的時候,總是以點為基礎(chǔ)構(gòu)建的。有的朋友做過測試,說這時候,直接用SVG畫出來,性能上會好很多(具體沒測試過,不想多說什么)。 |
|
|
來自: Java修煉館 > 《openlayer》