GeoServer源码解析和扩展 (二)注册服务

摘要:
首先,下载源代码。在前一章中,我们介绍了GeoServer源代码分析的必要性和各种准备工作,最后给出了OWS请求处理流程的伪代码。基本设计如下:为GeoServer注册一个新服务“trans”,它有一个方法“GetOutlay”。方法参数包括:起点“FROM”、终点“TO”、货物质量“WEIGHT”和退货运费。在本章中,我们快速实现了一个服务并在GeoServer中注册了它。在下一章中,我将重点介绍GeoServer的结构。届时,本章中的许多问题将得到解决。

先上源码下载

上一章我们介绍了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文件里有如下片段。

image

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

image

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

image

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

image

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

image

在里面添加下面一段

image

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

image

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

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

image

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

image

然后修改TransService的代码如下

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

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

image

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

image

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

image

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

image

和writeTo函数

image

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

image

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

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

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

免责声明:文章转载自《GeoServer源码解析和扩展 (二)注册服务》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇c# 泛型<T>类型参数T的约束where备份与恢复概述,冷备,热备下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关闭GeoServer v2.13权限认证

写在前面: 所用geoserver 版本为 2.13.2, tomcat 8,jdk 64位环境 问题产生的背景:使用 geoserver 发布wmts服务,用arcgis for js 4.x 版的 WebTileLayer 类加载,在网页端弹出输入用户名和密码的提示框,如下图: 按照提示输入登陆geoserver的用户名和密码即可显示请求的数据,但在...

GeoServer基础教程(一):环境搭建篇

转自:http://imxz.me/tech/3sdev/installation-of-geoserver.html GeoServer的是一个基于Java的软件,它允许用户查看和编辑地理空间数据,使用开放地理空间联盟(OGC)提出的开放标准,为地图创建和数据分享提供了强大的便利性。 GeoServer是OpenGIS Web 服务器规范的 J2EE 实...

基于geoserver的WFS空间查询

1 GIS空间要素对象 GIS的要素对象一般由属性数据和几何数据;“id、name、address”字段这些通常被称为属性数据,坐标那些被称为几何数据。OGC根据几何数据将空间要素对象分为Point,MultiPoint,...,MultiPolygon,MultiPolygon等[1],二维空间中,我们简单的分为点(Point)、线(LineString...

Geoserver的rest接口使用(后台或者前端调实现自动发布服务)

Geoserver提供许多服务的发布,我们可以通过控制台进行手动发布,至于至于如何在程序中利用代码发布服务,这如何做?可以通过两种思路进行一通过后台通过请求rest接口进行发布或者前端通过ajax,另一种通过xml方式详细的请参考该篇文章简析GeoServer服务的内部文件组织以及GeoServer自动化服务发布工具的开发思路本文主要介绍地第一种方式(ja...

基于geowebcache切片服务的发布

接着上一篇文章,如何将JPG格式的图片转化为带地理坐标的TIFF格式里提及的最近的一个项目,数据源是一张高分辨率的2.5维图片,现在已经成功转化成了带有地理坐标的TIFF格式。下面将介绍借助GeoServer如何将这个TIFF格式的数据以TMS(Tiled Map Service)的形式发布出去。此前笔者利用商业软件ArcGIS Server发布地图服务...

(九)WebGIS中的矢量查询(针对AGS和GeoServer)

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。 1.前言 在第七章里我们知道了WebGIS中要素的本质是UIComponent,而矢量图层的本质是包含了n(n>=0)个UIComponent的Canvas。我们在UIComponent的graphics中,根据矢量数据画...