打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【转载】OpenLayers项目分析——(六)数据渲染分析|Openlayers - Ge...

【转载】OpenLayers项目分析——(六)数据渲染分析

管理提醒: 本帖被 rchlz 设置为精华(2009-08-15)
(六)数据渲染分析

  实际上,OpenLayers的整个表现过程是这样的:通过调用获取数据,然后各种格式的解析器解析数据,在用所谓的渲染器渲染后加到图层上,最后再结合相应的控件表现出来,成为一幅我们看到的“动态”地图。
  这里主要讨论 OpenLayers. Renderer这个类及其子类。
  Renderer类提供了一些虚方法,以供其子类继承,像 setExtent 、 drawFeature 、 drawGeometry 、 eraseFeatures 、 eraseGeometry 等。
   Elements 继承 Renderer,具体实现渲染的类又继承Renderer类。之所以这样设计,是因为不同的矢量格式数据需要共享相应的函数,在 Elements 这个类中封装一下。这个类的核心是 drawGeometry 和 drawGeometryNode 两个函数。其中 drawGeometry 调用了 drawGeometryNode ,创建出基本的地理对象。

    drawGeometry: function(geometry, style, featureId) { 
        var className = geometry.CLASS_NAME; 
        if ((className == "OpenLayers.Geometry.Collection") || 
            (className == "OpenLayers.Geometry.MultiPoint") || 
            (className == "OpenLayers.Geometry.MultiLineString") || 
            (className == "OpenLayers.Geometry.MultiPolygon")) { 
            for (var i = 0; i < geometry.components.length; i++) { 
                this.drawGeometry(geometry.components, style, featureId); 
            } 
            return; 
        }; 

        //first we create the basic node and add it to the root 
        var nodeType = this.getNodeType(geometry); 
        var node = this.nodeFactory(geometry.id, nodeType, geometry); 
        node._featureId = featureId; 
        node._geometryClass = geometry.CLASS_NAME; 
        node._style = style; 
        this.root.appendChild(node); 
 
        //now actually draw the node, and style it 
         this.drawGeometryNode(node, geometry); 
    }

  渲染器的继承关系这样的:



  具体实现渲染的方法在 OpenLayers. Renderer.SVG OpenLayers. Renderer.VML两个类中实现的,就是实现 Elements 提供的虚方法,比如 drawPoint 、 drawCircle 、 drawLineString 、 drawLinearRing 、 drawLine 、 drawPolygon 、 drawSurface 等 。以 drawCircle 为例看看具体的实现过程:

    drawCircle: function(node, geometry, radius) { 
        if(!isNaN(geometry.x)&& !isNaN(geometry.y)) { 
            var resolution = this.getResolution();      

            node.style.left = (geometry.x /resolution).toFixed() - radius; 
            node.style.top = (geometry.y /resolution).toFixed() - radius; 

            var diameter = radius * 2; 

            node.style.width = diameter; 
            node.style.height = diameter; 
        } 
    }

转载自:http://www.3snews.net/html/24/10624-17492.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Saving and restoring geometries in OpenLayers
OpenLayers3入门篇
Arcgis for js之WKT和GEOMETRY的相互转换
3D on the Web with three.js
HT for Web整合OpenLayers实现GIS地图应用
使用JS操作页面表格,元素的一些技巧
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服