OpenLayers技术研究参考文档Word文件下载.docx

上传人:b****5 文档编号:18829520 上传时间:2023-01-01 格式:DOCX 页数:31 大小:136.76KB
下载 相关 举报
OpenLayers技术研究参考文档Word文件下载.docx_第1页
第1页 / 共31页
OpenLayers技术研究参考文档Word文件下载.docx_第2页
第2页 / 共31页
OpenLayers技术研究参考文档Word文件下载.docx_第3页
第3页 / 共31页
OpenLayers技术研究参考文档Word文件下载.docx_第4页
第4页 / 共31页
OpenLayers技术研究参考文档Word文件下载.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

OpenLayers技术研究参考文档Word文件下载.docx

《OpenLayers技术研究参考文档Word文件下载.docx》由会员分享,可在线阅读,更多相关《OpenLayers技术研究参考文档Word文件下载.docx(31页珍藏版)》请在冰豆网上搜索。

OpenLayers技术研究参考文档Word文件下载.docx

5;

//x-axis 

coodinate 

in 

map 

units

lat 

40;

//y-axis 

coordinate 

zoom 

//number 

of 

levels

map, 

layer;

    //声明变量map、layer;

等同于 

null;

layer 

new 

OpenLayers.Map('

map'

);

//实例化一个地图类OpenLayers.Map

OpenLayers.Layer.WMS( 

"

OpenLayers 

WMS"

 

{layers:

'

basic'

//以WMS的格式实例化图层类OpenLayers.Layer

map.addLayer(layer);

map.zoomToExtent(newOpenLayers.Bounds(-3.922119,44.335327,

4.866943,49.553833));

    //在Map对象上加载Layer对象,并用map.zoomToExtent函数使地图合适地显示    map.addLayer(new 

OpenLayers.Layer.GML("

GML"

gml/polygon.xml"

));

    //再在刚加载的WMS文件上,加载一GML文件

  剩下的工作就是,加上一些控件OpenLayers.Control之类的东西,比如LayerSwitcher等。

它们会在地图浏览的“窗口”上增加一些工具栏或是“按钮”,增加互动性和功能性。

  当然,Openlayers中的东西远不止这些,至于它的框架分析、APIs实现机制,会在后续文章中说出。

写这个的过程,也是一个学习的过程,其中难免有不妥之处,热烈欢迎大家批评指正,相互交流。

(二)源代码总体结构分析

  通过前面的项目介绍,我们大概已经知道Openlayers是什么,能够做什么,有什么意义。

接下来我们分析它怎么样,以及怎样实现的等问题。

  这个图是从它的文档上截取的,旨在从感官上认识一下OpenLayers的类。

下面分别介绍(文档中的类是按字母顺序排列的,也按这个顺序说吧):

  我们看到在类的顶层“高高在上”的是OpenLayers,它为整个项目实现提供名称空间(JavaScript语言没有名称空间一说,但是它确实有自己的机制实现类似的功能,后面会说明),它直接拥有一常量 

VERSION_NUMBER,以标识版本。

  Ajax:

顾名思义,用于实现Ajax功能,只是OpenLayers的开发者们把它单独写到一个类里了,其中用到了Prototype.js框架里的一些东西。

同时,设计的时候也考虑了跨浏览器的问题。

  BaseTypes:

这里定制了OpenLayers中用到的string,number 

和 

function。

比如,OpenLayers. 

String. 

startsWith,用于测试一个字符串是否一以另一个字符串开头;

OpenLayers. 

Number. 

limitSigDigs,用于限制整数的有效数位;

Function.bind,用于把某一函数绑定于对象等等。

  Console:

OpenLayers.Console,此名称空间用于调试和把错误等输出到“控制台”上,需要结合使用../Firebug/firebug.js。

  Control:

我们通常所说的控件类,它提供各种各样的控件,比如上节中说的图层开关LayerSwitcher,编辑工具条EditingToolbar等等。

加载控件的例子:

class 

controls:

[] 

});

    map.addControl(new 

OpenLayers.Control.PanZoomBar());

OpenLayers.Control.MouseToolbar());

  Events:

用于实现OpenLayers的事件机制。

具体来说,OpenLayers中的事件分为两种,一种是浏览器事件,例如mouseup,mousedown之类的;

另外一种是自定义的,如addLayer之类的。

OpenLayers中的事件机制是非常值得我们学习的,后面将具体讨论。

  Feature:

我们知道:

Feature是geography 

和attributes的集合。

在OpenLayers中,特别地OpenLayers.Feature 

类由一个Feature和一个lonlat组成。

OpenLayers.Feature.WFS与OpenLayers.Feature.Vector继承于它。

  Format:

此类用于读/写各种格式的数据,它的子类都分别创建了各个格式的解析器。

这些格式有:

  Geometry:

怎么翻译呢,几何?

是对地理对象的描述。

它的子类有Collection、Curve、LinearRing、LineString、MultiLineString、MultiPoint、MultiPolygon、Point、Polygon、Rectangle、Surface,正是这些类的实例,构成了我们看到的地图。

需要说明的是,Surface 

类暂时还没有实现。

  Handler:

这个类用于处理序列事件,可被激活和取消。

同时,它也有命名类似于浏览器事件的方法。

当一个handler 

被激活,处理事件的方法就会被注册到浏览器监听器listener 

,以响应相应的事件;

当一个handler被取消,这些方法在事件监听器中也会相应的被取消注册。

Handler通过控件control被创建,而control通过icon表现。

  Icon:

在计算机屏幕上以图标的形式呈现,有url、尺寸size和位置position3个属性。

一般情况,它与 

OpenLayers.Marker结合应用,表现为一个Marker。

  Layer:

图层。

  Map:

网业中动态地图。

它就像容器,可向里面添加图层Layer和控件Control。

实际上,单个Map是毫无意义的,正是Layer和Control成就了它。

  Marker:

它的实例是OpenLayers.LonLat 

和OpenLayers.Icon的集合。

通俗一点儿说,Icon附上一定的经纬度就是Marker。

它们的组合关系是:

  Popup:

地图上一个小巧的层,实现地图“开关”功能。

使用例子:

      Class 

OpenLayers.Popup("

chicken"

OpenLayers.LonLat(5,40),

OpenLayers.Size(200,200),

example 

popup"

true);

      map.addPopup(popup);

  Renderer:

渲染类。

在OpenLayers中,渲染功能是作为矢量图层的一个属性存在的,我们称之为渲染器,矢量图层就是通过这个渲染器提供的方法将矢量数据显示出来。

以SVG和VML为例,继承关系是这样的:

    

至于OpenLayers. 

Renderer. 

Elements为什么要存在,以及它的渲染机制,后面会说。

  Tile:

设计这个类用于指明单个“瓦片”Tile,或者更小的分辨率。

Tiles存储它们自身的信息,比如url和size等。

它的类继承关系如下:

  Util:

“跑龙套”的类。

  写到这里,可以看到OpenLayers 

的类缠绕的挺麻烦的,接下来的文章将从代码部分分析更细部的东西。

(三)BaseTypes 

定义底层类与定制JS内置类  

先说基类型BaseTypes下,OpenLyers构建的“自己”的类。

它们分别是:

OpenLayers.LonLat、OpenLayers.Pixel、OpenLayers.Size、OpenLayers.Element、OpenLayers.Bounds和OpenLayers.Class。

下面分别介绍:

  OpenLayers. 

LonLat:

经纬度类,其实例为地图提供一经度、纬度对,即位置。

有两个属性lon(x-axis 

)和lat(y-axis 

)。

这里说明一下,怎么经纬度又与x轴坐标、y轴坐标纠缠在一起?

是这样:

当地图是在地理坐标投影下,它就是经纬度;

不然就是地图上的x/y轴坐标。

除构造函数外,实现了五个函数:

toShortString:

function() 把坐标转换为字符串;

clone:

function()  复制一个LonLat对象;

Add:

function(lon,lat)  改变现有地图的位置;

  return 

OpenLayers.LonLat(this.lon 

lon, 

this.lat 

lat);

equals:

function(ll)  判断传入的lon,lat对是否与当前的相等;

wrapDateLine:

function(maxExtent)复制下(lon,lat),指定为边界的最大范围。

  OpenLayers.Pixel:

像素类,在显示器上以(x,y)坐标的的形式呈现像素位置。

有两个属性x坐标、y坐标,提供四个成员函数:

function() 

拷贝像素;

function(px) 

判断两像素是否相等;

add:

function(x,y) 

 改变(x,y)使其成为新像素;

return 

OpenLayers.Pixel(this.x 

x, 

this.y 

y);

offset:

function(px)  调用add()使像素位置发生偏移。

  newPx 

this.add(px.x, 

px.y);

  OpenLayers.Size:

也有两个属性,宽度width、高度height。

实现了两个成员函数:

function()和equals:

function(sz)不多说了。

  OpenLayers.Element:

在这个名称空间下,开发者写了好多API,有visible、toggle、hide、show、remove、getHeight、getDimensions和getStyle,以实现元素的显示、隐藏、删除、取得高度,取得范围等功能。

以getHeight函数为例我们看看它的代码:

  /**

APIFunction:

getHeight

Parameters:

element 

{DOMElement}

Returns:

{Integer} 

The 

offset 

height 

the 

passed 

in

*/

getHeight:

function(element) 

{

OpenLayers.Util.getElement(element);

element.offsetHeight;

}

这里涉及到文档对象模型DOM的一些东西,函数本身很简单,最后返回元素的高度。

  OpenLayers.Bounds:

在这个类中,数据以四个浮点型数left, 

bottom, 

right, 

top 

的格式存储,它是一个像盒子一样的范围。

它实现了三个描述一个Bound的函数:

toString、toArray和toBBOX。

其中,toString的代码如下:

  /** 

APIMethod:

toString

{String} 

String 

representation 

bounds 

object. 

(ex.<

i>

left-bottom=(5,42) 

right-top=(10,45)"

/i>

toString:

( 

left-bottom=("

this.left 

"

this.bottom 

)"

right-top=("

this.right 

this.top 

结果类似于"

  三个Bound数据来源函数:

fromString、fromArray和fromSize;

五个获取对象属性的函数:

getWidth、getHeight、getSize、getCenterPixel、getCenterLonLat;

余下还有:

function(x,y),extend:

function(object),containsLonLat,containsPixel,contains,intersectsBounds,containsBounds,determineQuadrant,wrapDateLine。

以函数extend为例,看看源码。

    extend:

function(object) 

if 

(object) 

switch(object.CLASS_NAME) 

case 

OpenLayers.LonLat"

:

OpenLayers.Bounds 

(object.lon, 

object.lat, 

object.lon, 

object.lat);

break;

OpenLayers.Geometry.Point"

OpenLayers.Bounds(object.x, 

object.y,object.x, 

object.y);

OpenLayers.Bounds"

object;

(bounds) 

(this.left 

== 

null) 

|| 

(bounds.left 

thi 

s.left)) 

 

this.left 

bounds.left;

(this.bottom 

(bounds.bottom 

this.bottom) 

) 

bounds.bottom;

(this.right 

(bounds.right 

his.right) 

bounds.right;

(this.top 

(bounds.top 

this. 

top) 

bounds.top;

可以看出,对Bounds的扩展可以有三种形式:

point, 

lonlat, 

或者bounds,计算的条件是零坐标是在屏幕的左上角。

  OpenLayers.Class:

这个类是OpenLayers 

中的“大红人”,只要创建其他类就得用它,同时也实现了多重继承。

用法如下:

  单继承创建:

OpenLayers.Class(prototype);

  多继承创建:

OpenLayers.Class(Class1, 

Class2, 

prototype);

净说底层类了,对js内置类的扩展下回写。

(三)BaseTypes:

OpenLayers中定制JavaScript内置类

  OpenLayers不仅“自己”写了一些底层的类,像上回说的那些都是。

同时也定制了一些JS的一些内置类,即对JS内置类的扩展。

这个扩展主要包含3类:

String,Number,Function,存在于BaseTypes.js文件中。

  String:

OpenLayers对string类型定制了8个方法,分别是startsWith、contains、trim和camelize;

还有另外4个方法:

startsWith、String. 

contains、String.trim和String. 

Camelize,它们将会在3.0Version中被删除,可能是以前版本遗留下来的,这里就不说它们了。

  //Test 

whether 

string 

starts 

with 

another 

string. 

  startsWith:

function(str, 

sub) 

(str.indexOf(sub) 

0);

contains 

string.

contains:

!

-1);

//Removes 

leading 

and 

trailing 

whitespace 

characters 

from 

trim:

function(str) 

str.replace(/^\s*(.*?

)\s*$/, 

$1"

//Camel-case 

hyphenated 

  

//Ex."

chicken-head"

becomes"

chickenHead"

//and"

-chicken-head"

ChickenHead"

.

// 

“骆驼”化带有连字符的字符串。

camelize:

oStringList 

str.split('

-'

camelizedString 

oStringList[0];

for 

(var 

1;

oStringList.length;

i++) 

oStringList[i];

+= 

s.charAt(0).toUpperCase() 

s.substring

(1);

camelizedString;

Number

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 建筑土木

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1