开源WebGIS中用Java程序语言进行快速开发是最经常使用的方法。比较普遍的是用OpenLayers技术+GeoTools技术+Geoserver服务器+MySQL数据库(当然也可以是DB2等等。由于要收费,所以我会使用PostSQL/GIS数据库)。
当然,我总是希望找到更为简单的解决问题的途径,最好不牵扯那么多乱七八糟的技术,因此,于比小型Web
GIS项目来说,有个方法可以让我们摆脱GeoTools技术为我们提供的那1000多个API所带来的痛苦。
对于初级Java程序员来说,可以直接用Openlayers+JAXP等几个基本类包来完成工作。然后,把程序运行在Geoserver服务上。你可以用Hibanite来实现数据持久化(因此,它有时会阻碍我的生产率,因此,在大型的项目里面我才用。如果你用在小型项目里面时发现了它的缺点,可以通过其他技术来避免这部分的损失。你必须v头脑灵光,不要为框架而框架,应该是通过合适的技术来提高自己的工作生产率),以便与MySQL数据库通信(MySQL数据库虽然已支持Geometry数据,但是也比较糟糕)。
每个技术的任务是什么:
1、OpenLayers只监听电子地图上的用户请求(电子地图操作很多情况加都要采用Ajax异步交互技术),取出业务需要的数据,并将数据变成一个 XML对象(或者是GML/GEoRSS/KML什么的都行)传到Java程序里后任务就结束了(也有不转换成XML的方法,这里不作为重点);
2、Java中我们使用JAXP和STCAME等类包、方法来解析刚才的XML对象,进行业务处理,加工数据,存放数据(如果不用XML数据格式,就可以不用以上两个类包和方方,这里不作重点);
3、当然Geoserver在整个过程中都是枢纽,他分析用户请求和服务器响应。(当然如果你有时间和兴趣也可以扩展开源Geoserver,我是有心而没时间);
以上不是我叙述的重点,因此不在废话!在数据传输中XML是经常用,同时也是很关键的传送格式,因此我从OpenLayers官方网站上找了个例子,结合自己经验和体会具体说明一些OL技术中提供的XML类,以便大家我们能更好的应用GML、GeoRESS、KML等数据格式。
以下是源代码,应该拷贝到本地就可以用,我是在Geoserver中运行地,如果感觉不爽可以登录http://www.openlayers.org/dev/examples/xml.html。
<!--引入OpenLayers错误控制器,如果你也有这个文件就把他加载进来,在界面上按F12就能看见了。如果没有就去掉这个行,Firebug是一个比较简单的报错控件,类似于初级Eclipse
Debug控制台-->
<br>
<br>
<script src="http://www.openlayers.org/dev/lib/Firebug/firebug.js" type="text/javascript"></script>
<br><br>
<!--引入OpenLayers.js,必须地--><br>
<script src="http://www.openlayers.org/dev/lib/OpenLayers.js" type="text/javascript"></script>
<br><br><br>
<script type="text/javascript"><br/>
//声明OpenLayers.Format.XML()对象实例,XML()是Format类的其中一个子类,Fromat类中还包括GML、GeoRSS、KML的其他的数据格式。
var format = new OpenLayers.Format.XML();
//空变量
var doc = null;
//自动加载的函数
function init() {
//被解析的xml文件,一般这个文件是我们用程序写出来的动态文件,除了数据结构不变以外,里面的标记详细值都是动态的,同时又一个标签用来存放几何数据。
var url = "xml/features.xml";
OpenLayers.loadURL(url, null, null, loadSuccess,
loadFailure);
}
//服务器端成功响应了loadURL()中xml/features.xml文件后,所执行的函数
function loadSuccess(request) {
//加载完毕后,调用updateStatus(msg)方法,将ID为"loadStatus"的HTML对象中的,第一个标注内的详细值赋为"XML文件加载完毕,请进行试验!"文本字符串
updateStatus("XML文件加载完毕,请进行试验!");
//如果返回的request对象的元素不是XML对象类型,则按Text对象处理返回类型,并赋值给变量doc
if(!request.responseXML.documentElement) {
doc = format.read(request.responseText);
} else {
//否则就按XML对象处理返回类型并赋值给变量doc
doc = request.responseXML;
}
}
//服务器端响应了loadURL()中xml/features.xml文件失败后,所执行的函数
function loadFailure(request) {
//加载失败后,调用updateStatus(msg)方法,将ID为"loadStatus"的HTML对象中的,第一个标注内的详细值赋为"XML文件加载失败,请查看文件是否存在或者是URL地址!"文本字符串
updateStatus("XML文件加载失败,请查看文件是否存在或者是URL地址!");
}
function updateStatus(msg) {
//将ID为"loadStatus"的HTML对象中的,第一个标注内的详细值赋为msg文本字符串变量
document.getElementById("loadStatus").firstChild.nodeValue = msg;
}
//今天就写到这里吧,累了...
function updateOutput(text) {
document.getElementById("output").firstChild.nodeValue =text;
}
function write() {
var text = format.write(doc);
updateOutput(text);
}
function getElementsByTagNameNS(node, uri, name) {
var nodes = format.getElementsByTagNameNS(node, uri, name);
var pieces = [];
for(var i=0; i<nodes.length; ++i) {
pieces.push(format.write(nodes[i]));
}
updateOutput(pieces.join(' '));
}
function hasAttributeNS(node, uri, name) {
updateOutput(format.hasAttributeNS(node, uri, name))
}
function getAttributeNodeNS(node, uri, name) {
var attributeNode = format.getAttributeNodeNS(node, uri,name);
updateOutput(attributeNode.nodeName + ' = "' + attributeNode.nodeValue + '"');
}
function getAttributeNS(node, uri, name) {
var attributeValue = format.getAttributeNS(node, uri, name);
updateOutput('"' + attributeValue + '"')
}
function createElementNS(uri, name) {
var node = format.createElementNS(uri, name);
doc.documentElement.appendChild(node);
write();
}
function createTextNode(text) {
var node = format.createTextNode(text);
doc.documentElement.appendChild(node);
write();
}
window.onload = init;
</script>
<p>OpenLayers有一个很简单的XML类,你可以用var name = new
OpenLayers.Format.XML();方式来声明。这个类包含可以读取,输出".xml"文件,并允许被实例的对象使用类的方法和属性。</p>
<p>这个XML类可以让我们从矢量电子地图(由于我把在电子地图上画的Point、Line、Ploygon等Feature对象放在 Vector层上,或者是经常用Vector型的地图数据来呈图,因此我就这么理解了这句英文,哈哈!)上通过DOM解析器来提取、者输出各种XML格式的数据。但是,千万别认为这个OpenLayers.Format.XML类很强大,它仅能完成对XML数据的基本操作。因此,如果有必要,我们可以用 JavaScript中的“Prototype原型构造法”来扩充OpenLayers.Format.XML()类的方法、属性。</p>
<p>当然,你也可以直接修改OpenLayers的核心文件(位置在OpenLayers\lib\OpenLayers\Format\XML.js,由于它继承了Format.js父类,因此我建议你顺便看一下父类)。</p>
<p>本例仅用DOM解析器,解析一个XML文件,这个XML文件中包含了电子地图的相关数据。你也可以结合其他的类的方法(以后讲)直接从电子地图上面输出真实的XML电子地图数据文件,然后转到Java中处理。或者,跨越过Java直接用JavaScript+SQL语句进行系统开发(由于不是重点,就不废话了)。</p>
<p>需要提醒的是,你得等XML文件全部加载完后,再点击下面的按钮。不然,就会有错误!因此,我建议你做一个"loading..."判断程序,以便序告知自己是否加载XML的状态。</p>
<p>上面的内容很多是我加的,不是英文翻译地,因此不能算翻译错误,谢谢!</p>
<div id="tags"></div>
<div id="docs">
<b>基本方法:</b>
<ul>
<li>
<a href="javascript:void write();">format.write()</a>以文本字符串输出这个XML文件。
</li>
<li>
<a href="javascript:void getElementsByTagNameNS(doc, 'http://www.opengis.net/gml','MultiPolygon');">format.getElementsByTagNameNS()</a>
输出名称空间为“gml:MultiPolygon”的标签,以及它的详细数据,子标签等等,并返回给一个具备数组类型特征的对象(写的比较难理解,是因为这个对象不一定就是数组类型对象,而是具备数组的特征!)
</li>
<li>
<a href="javascript:void hasAttributeNS(doc.documentElement,'http://www.w3.org/2001/XMLSchema-instance','schemaLocation');">format.hasAttributeNS()</a>
判断XML的文本字符串中“schemaLocation”属性的值是否等于“in the
http://www.w3.org/2001/XMLSchema-instance”。返回一个Boolean对象,如果等于就输出“ture”,如果不等于就输出“false”。
</li>
<li>
<a href="javascript:void getAttributeNodeNS(doc.documentElement,'http://www.w3.org/2001/XMLSchema-instance','schemaLocation');">format.getAttributeNodeNS()</a>
输出XML文本字符串中“schemaLocation”这个完整的空间名称和它的值“in the http://www.w3.org/2001/XMLSchema-instance”。
</li>
<li>
<a href="javascript:void getAttributeNS(doc.documentElement,'http://www.w3.org/2001/XMLSchema-instance','schemaLocation');">format.getAttributeNS()</a>
仅仅输出XML文本字符串中“schemaLocation”属性的值“in the http://www.w3.org/2001/XMLSchema-instance”。
</li>
<li>
<a href="javascript:void createElementNS('http://bar.com/foo','foo:TestNode');">format.createElementNS()</a>
创建一个空间名称为“foo:TestNode”的标签,并且把它加在这个已经存在的XML文件中的最后。
</li>
<li>
<a href="javascript:void createTextNode('test text');">format.createTextNode()</a>
创建具体的数据内容,并加进指定的“foo:TestNode”标签中。
</li>
</ul>
<br>
<b>输出结果:</b><br>
<div id="output"> </div>
</div>
分享到:
相关推荐
在OpenLayer开发中,理解GIS地理信息和Shapefile格式是至关重要的。 Shapefile是ESRI公司推出的一种空间数据格式,广泛应用于地理信息系统(GIS)中。一个完整的Shapefile通常由多个文件组成,包括.shp、.shx、.dbf等...
每个格式都有对应的解析器类,位于`OpenLayers.Format`命名空间下。 3. **地图数据资源** OpenLayers可以连接并展示多种地图服务,包括但不限于WMS、WFS、Google Maps、KaMap、Microsoft Virtual Earth、NASA ...
解析XML在OpenLayers中通常使用JavaScript的内置DOM解析器,例如`document.createElement`, `getElementsByTagName`, `getAttribute`等方法,或者使用jQuery等库简化操作。 关于OpenLayers的popup(弹窗),可以...
标题提到的"openlayer v7"指的是该库的第七个主要版本。这个版本包含了丰富的功能和改进,使得开发者能够更加灵活和高效地构建地理信息系统(GIS)应用。 在提供的压缩包文件中,我们可以看到以下文件: 1. **ol....
这个版本是OpenDaylight发展过程中的一个重要里程碑,它在2015年发布,为网络控制器提供了丰富的功能和改进。 OpenDaylight Helium版本包含了多个关键组件,这些组件在构建SDN解决方案时扮演着重要角色: 1. **...
在GIS(地理信息系统)领域,OpenStreetMap(OSM)是一个全球性的开源地图项目,它允许用户自由地创建和编辑地理数据。本教程将详细解释如何使用SuperMap iObject Java库来导入和显示OpenStreetMap的数据。 首先,...
本篇将深度解析`android-sliding-layer-lib`这一开源库的源码,帮助开发者理解和应用这一组件。 一、库的简介与作用 `android-sliding-layer-lib`是一个专门为Android平台设计的滑动层库,它提供了简单易用的API来...
这通常涉及到使用WSDL解析器和代码生成器,将WSDL文件转换为特定编程语言的客户端库。 7. **开发流程**: 开发ONVIF应用通常涉及以下步骤:理解WSDL文件中的服务和消息结构;使用SDK或自动生成的代码实现客户端;...
根据提供的文件信息,本文将详细解析“geoserver-sld开发文档”的相关内容,重点解读其在地理信息系统(GIS)中的应用、技术要点以及如何利用此文档进行Geoserver的样式编辑。 ### Geoserver简介 Geoserver是开源...
6. **生命周期管理**:Android应用的`Activity`有其特定的生命周期,开发者需要理解何时保存状态、恢复状态以及如何在后台适当地释放资源,防止内存泄漏。 7. **测试与调试**:在开发过程中,开发者需要在模拟器或...
1. `[Content_Types].xml`:这是一个XML文件,它是Microsoft Office Open XML文档标准的一部分。它定义了压缩包内的不同文件类型的默认处理方式,帮助应用程序知道如何正确解析和显示内容。在ST开发环境的资料中,这...
通过运行这些代码,你可以更深入地理解如何将理论知识应用于实际项目中。 总之,OGR库为处理GML文件提供了一种强大而灵活的方式,允许开发者轻松地读取、解析和操作GML中的空间数据。无论你是GIS开发人员还是数据...
在Android系统中,源码是理解其工作原理和进行深度定制的关键。"android4.0.3关联源码"指的是Android 4.0.3版本的源代码,这个版本是Android Ice Cream Sandwich(冰淇淋三明治)的一部分。通过分析这个版本的源码,...
在Android系统中,框架层(Framework)是操作系统的核心部分,它为应用程序提供了API接口,使得开发者可以方便地构建各种功能丰富的应用。这篇“Android Framework经验总结”将深入探讨这一关键领域的核心概念、主要...
3. **Framework**:这是Android应用开发的基础,包括Intent、Broadcast Receiver、Service等组件模型,以及XML布局文件解析和视图系统。 4. **Libraries**:Android包含许多库,如SQLite用于数据库操作,OpenSSL...
总之,Smack 4.2.4源码对于理解XMPP协议的工作原理、学习如何在Java应用中集成即时通讯功能,以及深入研究网络通信和事件驱动编程都有极大的价值。通过阅读和分析源码,开发者可以定制自己的功能,提升应用程序的...
每种格式都有对应的解析器,这大大扩展了数据来源的多样性。 **4. 多样的数据源** OpenLayers 支持多种数据源,包括但不限于 WMS、WFS、Google Maps API、Bing Maps API、WorldWind 等。这意味着开发者可以根据...
源码可能使用 AJAX 调用外部API,如Open Exchange Rates或Currency Layer,以获取最新的汇率信息。 4. **API 接口调用**: - 为了获取实时汇率,源码可能需要对接第三方API,这些API通常提供JSON格式的数据。...
4. **应用层**:包含WAP浏览器、WML(Wireless Markup Language)解析器和各种应用服务器接口。 **三、WML与WAP浏览器** WML是专为WAP设计的一种标记语言,类似于HTML,但更适合小屏幕和有限输入设备。WML卡(Deck...