先上源码下载

上一章我们介绍了GeoServer源码分析的必要性(这个就见仁见智了)以及诸项准备工作,并且在最后还给出了OWS请求处理流程的伪代码。

这一章我们来看看要注册自己的服务需要做哪些工作。假设我们要为一个物流公司GOODS开发系统,有一个功能是给定起点和终点的城市名称以及包裹的重量返回运费,运费的计算公式如下:

运费(¥) = 距离(千米) X 货物重量(千克)

我们需要知道城市间的距离,这就需要用到GIS系统(当然也可以不用),假设已经部署了GeoServer服务器(个人以为如果要求不高或者钱没有多到烫人,使用这种免费的软件足够用了)。基本设计是这样的,为GeoServer注册一个新的服务“trans”,它有一个方法“GetOutlay”,方法参数是:起点“FROM”,终点“TO”,货物质量“WEIGHT”,返回运费。下面是一个典型的请求:

http://localhost:8080/geoserver/trans?request=GetOutlay&from=Chengdu&to=Shanghai&weight=100

让我们来看看要注册一个服务都需要做些什么。以wms为例,在wms包的applicationContext.xml文件里有如下片段。

首先,我们需要创建一个Java项目“trans”,然后在项目中包含配置文件“applicationContext.xml”

在配置文件里添加如下片段

为项目增加一个类com.goods.TransService,它有一个公共方法GetOutlay,这个方法可以没有参数也没有返回值。为了能在Eclipse里面运行,我们需要把“trans”项目增加到“web-app”项目的依赖关系里

我们有了一个服务类并且注册到了运行时环境里,现在我们需要让Servlet找到它,打开web-app下面的的web.xml文件

在里面添加下面一段

然后在本项目的配置文件中增加下面一段

现在,启动GeoServer,在浏览器中敲入“http://localhost:8080/geoserver/trans?request=GetOutlay&from=Chengdu&to=Shanghai&weight=100”,回车。浏览器页面为空,没有报错,表示服务注册成功了,但是这个服务还没有任何功能。

继续以WMS为例,来看看DefaultWebMapService类的GetMap函数

它有一个参数GetMapRequest和一个返回值GetMapResponse,GetMapRequest是从org.vfny.geoserver.Request继承来的,而GetMapResponse实现了org.vfny.geoserver.Response接口,这两个抽象类在Dispatcher处理请求时会用到。先不多想,照猫画虎,于是我们有了GetOutlayResponse和GetOutlayRequest

然后修改TransService的代码如下

再次启动项目,运行例子,我们得到这样一条异常

异常是从Dispatcher的dispatch函数抛出的,因为没有找到创建GetOutlayRequest的reader。于是我们再次到wms的配置文件里取经,请看下面这段

看来我们还需要一个叫GetOutlayKvpReader的类。增加GetOutlayKvpReader到“trans”项目

并且在配置文件中添加如下信息

仔细研究GetMapKvpRequestReader的代码之后,写出GetOutlayKvpReader的代码,如下:

Dispatcher将会利用这个类从请求参数里创建GetOutlayRequest对象。再次运行程序,又出现一个异常

这一次是Dispatcher的response函数抛出,大意是找不到处理GetOutlayResponse类型的response。再一次,从wms的配置文件中我们找到了这样一段

这说明我们还需要把GetOutlayResponse注册到运行时中去,在本项目的配置文件中添加如下信息

这一次运行程序,浏览器没有抛出异常,但还是没有结果。

来回想一下我们的设计:找到两个城市,计算距离,计算运费,输出。城市名称是从请求参数里获得的,并且已经由GetOutlayKvpReader将它们保存到GetOutlayRequest对象里面,现在需要查询城市地理坐标。通过研究GetMapResponse的代码,我们决定把这部分代码放到GetOutlayResponse的execute函数中,并且需要用到Catalog对象,这个对象可以查询已经部署的要素类型(测试数据在此下载,如何部署可以参看这篇文章)。我们需要把Catalog对象传给GetOutlayResponse,而GetOutlayResponse又是在TransService里面创建的,所以我们应该把Catalog传给TransService。先来修改TransService的代码

然后修改配置文件里面注册服务的那一段,添加引用Catalog的信息

如果你对变量“catalog”感到迷惑的话,可以去看看main包的配置文件,这个变量是这里创建的

不难看出,Catalog在整个GeoServer中只有一个实例。最后完成GetOutlayResponse的execute函数

和writeTo函数

启动程序,运行请求,会得到如下结果。

这表示我们的服务能够工作了。

将这个项目输出成jar文件,然后将jar文件复制到目录“[GeoServer安装目录]\webapps\geoserver\WEB-INF\lib”下,按照前面步骤修改“[GeoServer安装目录]\webapps\geoserver\WEB-INF\web.xml”文件,启动GeoServer,运行请求,会得到同样的结果,大功告成。

本章我们快速的实现了一个服务,并且将它注册到GeoServer中。但是留下了很多疑问,这些疑问不搞清楚,就只能算知其然而不知所以然。下一章我会重点介绍GeoServer的结构,到时候本章许多疑问将会迎刃而解。

转自:http://www.cnblogs.com/sillyemperor/archive/2011/01/11/1929420.html

geoserver 开发2的更多相关文章

  1. Oracle spatial、openlayers、geoserver开发地理信息系统总结

    感谢开源,使用OpenLayers+Geoserver的地理信息系统开发很简单,完全可以套用开发MIS系统的经验,我这里总结为三个步骤: 1.数据准备 2.数据发布 3.数据展现 我将按照这个思路来介 ...

  2. geoserver 开发1

    打开项目,会看见下面这些包(其实还有很多插件之类的包,我都删除了) 5)可以从Eclipse启动GeoServer了. 如果你已经安装了GeoServer,现在也可以打开它的登陆页面进行操作. 三 结 ...

  3. geoserver扫盲 openlayers相关

    转自:http://www.cnblogs.com/lzlynn/archive/2008/07/29/1255702.html WMS: Web Map Service(Web地图服务 ) l  利 ...

  4. [转]Geoserver全面了解

    From:http://www.cnblogs.com/ada-zheng/archive/2013/07/16/3192921.html Geoserver是一个功能齐全,遵循OGC开放标准的开源W ...

  5. Geoserver

    Geoserver是一个功能齐全,遵循OGC开放标准的开源WFS-T和WMS服务器.利用Geoserver可以把数据作为maps/images来发布(利用WMS来实现)也可以直接发布实际的数据(利用W ...

  6. 符合我公司GIS开源解决方案的探讨

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 这一周,我对GIS开源解决方案中涉及到的开源软件以及相关技术 ...

  7. GeoPackage - 一个简便轻量的本地地理数据库

    GeoPackage(以下简称gpkg),内部使用SQLite实现的一种单文件.与操作系统无关的地理数据库. 当前标准是1.2.1,该版本的html版说明书:https://www.geopackag ...

  8. 简析GeoServer服务的内部文件组织以及GeoServer自动化服务发布工具的开发思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 通过GeoServer发布的服务,在GeoServer内部有 ...

  9. GeoServer地图开发解决方案

    转自:http://www.cnblogs.com/beniao/archive/2011/01/08/1930822.html GeoServer 是 OpenGIS Web 服务器规范的 J2EE ...

随机推荐

  1. Distill详述「可微图像参数化」:神经网络可视化和风格迁移利器!

    近日,期刊平台 Distill 发布了谷歌研究人员的一篇文章,介绍一个适用于神经网络可视化和风格迁移的强大工具:可微图像参数化.这篇文章从多个方面介绍了该工具. 图像分类神经网络拥有卓越的图像生成能力 ...

  2. Flash和滚动字幕

    flash 1.插入flash     1)<object>             <embed src="路径"></embed>      ...

  3. metaq架构原理

      原创文章,转载请注明出处:http://jameswxx.iteye.com/blog/2034111 本来只是想看下metaq的文档,结果发现好乱,现在metaq其实有两个大分支了,一个是庄晓丹 ...

  4. Sklearn与特征工程

    Scikit-learn与特征工程 “数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这句话很好的阐述了数据在机器学习中的重要性.大部分直接拿过来的数据都是特征不明显的.没有经过处理的或者说 ...

  5. 1_Utilities__deviceQuery + 1_Utilities__deviceQueryDrv + 1_Utilities__topologyQuery

    使用 Runtime API 和 Driver API 检测设备相关属性.并检测了设备之间的拓扑以及主机与设备之间的拓扑(是否支持跨设备原子操作). ▶ 源代码:Runtime API #includ ...

  6. linux获取日志指定行数范围内的内容

    假如我要获取“浅浅岁月拂满爱人袖”到“落入凡尘伤情着我”之间的内容. 1.首先得到他们所在的行号: -n选项显示行号 但是有时候grep后显示的是“匹配到二进制文件(标准输入)”,说明搜索的字符串在某 ...

  7. 可视化库-seaborn-调色板(第五天)

    1. 基础的调色板的演示  color_palette() 设置传入的任何颜色,不传使用默认颜色,set_palette() 设置所有图的颜色# 6种主题 # 1 deep# 2 muted# 3 p ...

  8. Mybatis知识(1)

    1.#{}和${}的区别是什么? #{}是预编译处理,${}是字符串替换. Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值: M ...

  9. To zero

    Let bygone be bygone. Now  everything changed. In fact, everything occurs to me cause I am a loser i ...

  10. neo4j 学习-2

    Neo4j 查询例句 MATCH (john {name: 'John'})-[:friend]->()-[:friend]->(fof) RETURN john.name, fof.na ...