OpenLayers项目分析(五) 数据解析以GML为例
目录
前面也提到过,OpenLayers设计是符合标准的,有良好的框架结构和实现机制,非常值得学习。OpenLayers支持的格式比较多,有XML、GML、GeoJSON、GeoRSS、JSON、KML、WFS等。这回主要以GML为例来看OpenLayers 数据的解析过程。
先来了解一下GML:
GML (Geography Markup Language)即地理标识语言,它由OGC(开放式地理信息系统协会)于1999年提出,目前版本是3.0。GML是XML在地理空间信息领域的应用。利用GML可以存储和发布各种特征的地理信息,并控制地理信息在Web浏览器中的显示。地理空间互联网络作为全球信息基础架构的一部分,已成为Internet上技术追踪的热点。许多公司和相关研究机构通过Web将众多的地理信息源集成在一起,向用户提供各种层次的应用服务,同时支持本地数据的开发和管理。GML可以在地理空间Web领域完成了同样的任务。GML技术的出现是地理空间数据管理方法的一次飞跃。
介绍一篇文章:GML3.0的WebGlS研究。
我们从总体上来把握一下OpenLayers对于GML数据的解析,首先通过调用得到GML文本数据,然后通过Formate.GML类的read方法来解析这个文本,解析得到Geometry对象,然后Geometry对象用相应的渲染器画出来。其实解析得到还是那些基本的Point呀、LineString呀之类的Geometry对象,就是我们在地图上看到的那些内容。
下面看其实现过程:
//read()函数读取数据,获取特征列
[代码]js代码:
01 |
read: function (data)
|
02 |
if ( typeof data
"string" )
|
03 |
data
this ,
|
04 |
} |
05 |
var featureNodes
this .getElementsByTagNameNS (data.documentElement, this .gmlns, this .featureName); |
06 |
var features
|
07 |
for ( var i=0;
|
08 |
var feature
this .parseFeature(featureNodes[i]); |
09 |
if (feature)
|
10 |
features.push(feature); |
11 |
} |
12 |
} |
13 |
return features; |
14 |
} |
//函数parseFeature()是OpenLayers中GML数据格式解析的核心,就是它创建地理对象
//和其属性。
//实际上,每一个Foramt 子类都实现了这个成员函数,完成类似的功能。
[代码]js代码:
01 |
parseFeature: function (node)
|
02 |
//
|
03 |
var order
"MultiPolygon" , "Polygon" , |
04 |
"MultiLineString" , "LineString" , |
05 |
"MultiPoint" , "Point" ]; |
06 |
var type,
|
07 |
for ( var i=0;
|
08 |
type
|
09 |
nodeList
this .getElementsByTagNameNS(node, this .gmlns,
|
10 |
if (nodeList.length
|
11 |
//
|
12 |
var parser
this .parseGeometry[type.toLowerCase()]; |
13 |
if (parser)
|
14 |
geometry
this ,
|
15 |
} else { |
16 |
OpenLayers.Console.error( "Unsupported
+ |
17 |
type); |
18 |
} |
19 |
//
|
20 |
break ; |
21 |
} |
22 |
} |
23 |
//
|
24 |
var attributes; |
25 |
if ( this .extractAttributes)
|
26 |
attributes
this .parseAttributes(node); |
27 |
} |
28 |
var feature
new OpenLayers.Feature.Vector(geometry,
|
29 |
//
|
30 |
var childNode
|
31 |
var fid; |
32 |
while (childNode)
|
33 |
if (childNode.nodeType
|
34 |
fid
"fid" )
|
35 |
childNode.getAttribute( "id" ); |
36 |
if (fid)
|
37 |
break ; |
38 |
} |
39 |
} |
40 |
childNode
|
41 |
} |
42 |
feature.fid
|
43 |
return feature; |
44 |
} |
剩下就是由具体的函数parse and bulid基本的地理对象(还有Attribute),包括point、multipoint、linestring、multilinestring、polygon、multipolygon等,然后在write出来。
结合前面的“OpenLayers空间数据的组织”,我们可以看到OpenLayers在解析获取GML数据的时候,比如涉及到面、线的时候,总是以点为基础构建的。有的朋友做过测试,说这时候,直接用SVG画出来,性能上会好很多(具体没测试过,不想多说什么)。
转载自:https://blog.csdn.net/giser_whu/article/details/45748437