欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap 谈天说地
   您现在位于: 首页技术专栏开源GIS → 正文
OpenLayers教程之空间数据的组织与实现
08-01-10 00:00:00 作者:liulin 出处:3sNews
提到数据,先思考几个问题:

  GIS,核心是什么?数据?平台?服务?  

  空间数据的特征、表达方式?

  地理数据的模型(结构)?

  在OpenLayers空间数据的实现主要存在 OpenLayers. Geometry类及其子类中。我们先看下面的 两个图片,表现了这些类的继承关系。从图上可以清楚的看出MultiPoint、Polygon和MultiLineString 这三个类实现了多重继承,即直接继承于Geometry类,又继承于Collection类(为什么要这样实现?)。

   OpenLyers对于Geometry对象的组织是这样的,其实最 基础 的就是点,然后MultiPoint由点构成,继承自Openlayers.Geometry.Collection,而LinearRing,LineString均由Point构 成,

Polygon由OpenLayers.Geometry.LinearRing构成。OpenLyers在解析数据时候,将所有的面、线包含的点全部都对象化为Openlayers.Geometry.Point。有人测试这里面存在问题:解析矢量数据慢,甚至在点数多的情况下,会使浏览器“崩溃”掉。想想是有道理的:OpenLyers在解析数据时候,将所有的面、线包含的点全部都对象化为点对象t,并首先将所有的对象读取到内存,得到一个Feature的集合,然后将这个集合提交给渲染器进行渲染。这样渲染起来当然慢了。至于为什么要这样,可能是 OpenLayers项目本身在标准上,在框架结构上做的比较好,更细部的东西还得优化呀。可话又说回来,OpenLayers作为一个优秀的开源JS框架,学习借鉴的意义要比应用的意义大吧。  
下面以Point和Collection为例来说明其内部实现过程,先看Point。

  我们知道一个点就是一个坐标对(x,y)嘛,当然它得有两个属性x,y。在point类里,提供了六个成员函数,分别是 clone、distanceTo、equals、move、rotate和resize。看看计算两点距离的函数是怎么写的:

distanceTo: function(point) {

        var distance = 0.0;

        if ( (this.x != null) && (this.y != null) && 

             (point != null) && (point.x != null) && (point.y != null) ) {             

             var dx2 = Math.pow(this.x - point.x, 2);

             var dy2 = Math.pow(this.y - point.y, 2);

             distance = Math.sqrt( dx2 + dy2 );

        }

        return distance;

    }

  在collection集合对象中,可以存放同一类型的地理对象,也可以放不同的地理对象。定义了一个属性 component ,以数组对象的形式存储组成 collection对象的“组件”。别的不说了,看一个获取集合大小的函数 getLength

    getLength: function() {

        var length = 0.0;

        for (var i = 0; i < this.components.length; i++) {

            length += this.components[i].getLength();

        }

        return length;

    }

   细心的朋友也许会发现,每一个基类都有一个 destroy 函数。它是 OpenLayers实现的垃圾回收机制,以防止内存泄露,优化性能:

    /* APIMethod: destroy

     * Destroy this geometry.

     */

    destroy: function () {

        this.components.length = 0;

        this.components = null;

    }

  我们知道一个点就是一个坐标对(x,y)嘛,当然它得有两个属性x,y。在point类里,提供了六个成员函数,分别是 clone、distanceTo、equals、move、rotate和resize。看看计算两点距离的函数是怎么写的:

distanceTo: function(point) {

        var distance = 0.0;

        if ( (this.x != null) && (this.y != null) && 

             (point != null) && (point.x != null) && (point.y != null) ) {             

             var dx2 = Math.pow(this.x - point.x, 2);

             var dy2 = Math.pow(this.y - point.y, 2);

             distance = Math.sqrt( dx2 + dy2 );

        }

        return distance;

    }

  在collection集合对象中,可以存放同一类型的地理对象,也可以放不同的地理对象。定义了一个属性 component ,以数组对象的形式存储组成 collection对象的“组件”。别的不说了,看一个获取集合大小的函数 getLength

    getLength: function() {

        var length = 0.0;

        for (var i = 0; i < this.components.length; i++) {

            length += this.components[i].getLength();

        }

        return length;

    }

   细心的朋友也许会发现,每一个基类都有一个 destroy 函数。它是 OpenLayers实现的垃圾回收机制,以防止内存泄露,优化性能:

    /* APIMethod: destroy

     * Destroy this geometry.

     */

    destroy: function () {

        this.components.length = 0;

        this.components = null;

    }


(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  
    OpenLayers教程之解析GML文件
    OpenLayers教程之OpenLayers的WMS调用
    OpenLayers教程之OpenLayers中的类介绍

    关于我们 友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.

                   滇ICP备05006901号