开源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等数据格式。
英语不怎么样,因此翻译上的缺陷大家忍耐吧!<br>
<br>
以下是源代码,应该拷贝到本地就可以用,我是在Geoserver中运行地,如果感觉不爽可以登录 http://www.openlayers.org/dev/examples/xml.html
<!--引入OpenLayers错误控制器,如果你也有这个文件就把他加载进来,在界面上按F12就能看见了。如果没有就去掉这个行,Firebug是一个比较简单的报错控件,类似于初级Eclipse Debug控制台-->
<script src="http://www.openlayers.org/dev/lib/Firebug/firebug.js" type="text/javascript"></script>
<!--引入OpenLayers.js,必须地-->
<script src="http://www.openlayers.org/dev/lib/OpenLayers.js" type="text/javascript"></script>
<script type="text/javascript">
//声明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) {
} else {
}
}
//服务器端响应了loadURL()中xml/features.xml文件失败后,所执行的函数
function loadFailure(request) {
}
function updateStatus(msg) {
}
//今天就写到这里吧,累了...
function updateOutput(text) {
}
function write() {
}
function getElementsByTagNameNS(node, uri, name) {
}
function hasAttributeNS(node, uri, name) {
}
function getAttributeNodeNS(node, uri, name) {
}
function getAttributeNS(node, uri, name) {
}
function createElementNS(uri, name) {
}
function createTextNode(text) {
}
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">
</div>