小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

【轉(zhuǎn)載】OpenLayers項目分析——(五) 數(shù)據(jù)解析——以GML為例 Openlaye...

 Java修煉館 2011-05-03
(五)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畫出來,性能上會好很多(具體沒測試過,不想多說什么)。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多