GeoServer与定制开发方法介绍
一、GeoServer简介
GeoServer 是OpenGIS Web 服务器规范的J2EE 实现,利用GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。
GeoServer 主要特性包括:兼容WMS 和WFS 特性;支持PostGIS 、Shapefile 、ArcSDE 、Oracle 、VPF 、MySQL 、MapInfo ;支持上百种投影;能够将网络地图输出为jpeg 、gif 、png 、SVG 、KML 等格式;能够运行在任何基于J2EE/Servlet 容器之上;嵌入MapBuilder 支持AJAX 的地图客户端;除此之外还包括许多其他的特性。
GeoServer 最新的版本增加了GeoTools 2.x ,GeoTools 是一款基于Java 的开源GIS 工具集,允许用户对地理数据进行基本操作。通过GeoTools 的各种接口和helper 类,可以写入新的数据格式,通过GeoTools 为GeoServer 提供的插件,在不进行重新编译的情况下,可以让GeoServer 支持更多的数据格式,甚至只需要通过GUI 的option 设置即可。
GeoServer能够发布的数据类型:
地图或影象——应用WMS,
实时数据——应用WFS,
用户更新、删除和编辑的数据——应用WFS-T。
相关概念的:
WMS: Web Map Service(Web地图服务)
l 利用具有地理空间位置信息的数据制作地图。其中将地图定义为地理数据可视的表现。这个规范定义了三个操作:
GetCapabitities 返回服务级元数据,它是对服务信息内容和要求参数的一种描述;GetMap 返回一个地图影像,其地理空间参考和大小参数是明确定义了的;GetFeatureInfo(可选)返回显示在地图上的某些特殊要素的信息
WFS: Web Feature Service(Web要素服务)
Web 地图服务返回的是图层级的地图影像,Web要素服务(WFS)返回的是要素级的GML 编码,并提
供对要素的增加、修改、删除等事务操作,是对Web地图服务的进一步深入。OGC Web要素服务允许客户端从多个Web要素服务中取得使用地理标记语言(GML)编码的地理空间数据,定义了五个操作:
GetCapabilites 返回Web要素服务性能描述文档(用XML描述);DescribeFeatureType 返回描述可以提供服务的任何要素结构的XML文档;GetFeature 一个获取要素实例的请求提供服务;
Transaction 为事务请求提供服务;
LockFeature 处理在一个事务期间对一个或多个要素类型实例上锁的请求。
WFS-T: Web Map Service-Transactional. 允许用户以可传输的块编辑地理数据。
WCS:Web Coverage Service(Web覆盖服务)
Web 覆盖服务(WCS)面向空间影像数据,它将包含地理位置值的地理空间数据作为“覆盖(Coverage)”在网上相互交换。
网络覆盖服务由三种操作组成:GetCapabilities,GetCoverage和DescribeCoverageType:GetCapabilities 操作返回描述服务和数据集的XML文档。
GetCoverage操作是在GetCapabilities确定什么样的查询可以执行、什么样的数据能够获取之后执行的,它使用通用的覆盖格式返回地理位置的值或属性。DescribeCoverageType 操作允许客户端请求由具体的WCS服务器提供的任一覆盖层的完全描述。
GML: Geography Markup Language. 一种用于描述地理数据的XML。
OGC——Open Geospatial Consortium——开放地理信息联盟
总之,GeoServer 是您需要显示地图在网页的那些工具的当中一个,用户可以缩放并且移动。可以与一些客户端联合使用,比如:MapBuilder (for web pages), UDig, GVSig,等等。对标准的使用允许信息从GeoServer 到其它地理信息可以很容易地被结合
二、GeoServer的
GeoServer的实际上是软件国际化与本地化的一个具体实例。
GeoServer提供了J2EE架构下标准的国际化方法支持,即采用“地区_语言”资源方式实现对全球各个地区和语言语种的支持,当然,汉语也被包含其中。
要实现GeoServer的,有如下几个途径:
1、局部
编制一组中国大陆地区和简体中文资源文件,增加到GeoServer的发布包*.jar中去;
这种方式能绝大部分内容,但由于开源软件存在的固有问题,并不是所有需要国际化的资源都被资源化了,因此,还有一小部分内容不能通过这种方式国际化;如果对要求不高,可以采用这种方式。
2、彻底
下载GeoServer的源代码,自己构建工程并编译成果,在第一部的基础上,对未能国际化的部分,将相应的字符串资源化,并将新资源化的字符串添加到编制的那组中国大陆地区和简体中文资源文件中。有兴趣或疑问的朋友可以一起讨论
注意,要彻底,必须的代码包括三大部分:
(1)GeoServer工程自身的代码;
(2)GeoServer的GIS内核及扩展GeoTools的代码;
(3)GeoServer的WEB框架(Apache Wicket)的代码;
三、GeoServer定制开发入门
如果希望对GeoServer进行定制开发,首先需要获取GeoServer的代码。
代码可以在/geoserver下载。
另外,你还需要Apache的build工具maven,这里特别需要注意的是geoserver与maven 版本的对应性。在GeoServer Developer Manual文档中有特定说明。
最后就是需要一个支持j2ee开发的集成开发环境,这里推荐eclipse。
使用eclipse加载geoserver全部工程代码后,可以看到其工程结构如下图所示,先赞一下,架构还是非常不错的。
如果需要定制开发,我们主要是要扩展和定制ows、web-core两个工程即可。当然,根据个人喜好,也可以把某些内容的修改提炼到main中去。
至于如何在eclipse中对ows、web-core进行扩展和定制,有兴趣的朋友也可以一起讨论。
四、GeoServer定制开发的深入——完整的WMS访问过程
如果希望深入的进行定制开发,必须首先理解Geoserver自身的概念体系和框架结构,下面我们就慢慢来介绍。
一、HTTP GET请求
WMS的请求一般使用HTTP Get的形式直接从地址栏输入或者通过JS代码发送到服务器端。请求的格式如下所示:
localhost:8080/geoserver
/wms?bbox=-74.01199448397661,40.70732689845813,-74.00841053684495,40.7121655895705 2&styles=&Format=application/openlayers&request=GetMap&version=1.1.1&layers=tiger:poi&w idth=457&height=550&srs=EPSG:4326,该请求中wms是要请求的服务,version=1.1.1是请求的wms版本,GetMap是请求的服务方法,tiger:poi是要访问的地理数据。
二、HTTP 派发
GeoServer的MVC架构是建立在Spring的Web MVC的基础之上的。Spring Web MVC的核心控制类是org.springframework.web.servlet.DispatcherServlet。HTTP请求一般都先发送给这个Servlet,做一些HTTP请求的通用处理(比如文件上载)后,通过合适的派发机制转发给不同的Spring容器中的Bean,也就是不同业务逻辑、服务处理的控制器(Logic Control),由这些控制器结合不同模型(Model),如空间数据模型、属性数据模型、地图样式模型等,进行处理,形成结果模型,并经DispatcherServlet返回客户端。
org.springframework.web.servlet.DispatcherServlet相关配置位于GeoServer的Web工程的配置文件l中。
1、Servlet声明
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet>
2、URL Mapping
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/wms/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/wcs/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/wfs/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/ows/*</url-pattern>
</servlet-mapping>
这说明,对于/wms/*、/wcs/*、/wfs/*、/ows/*等地址的请求,都会调用org.springframework.web.servlet.DispatcherServlet对象来响应。
三、org.springframework.web.servlet.DispatcherServlet派发流程
在Spring框架下,org.springframework.web.servlet.DispatcherServlet基于每个工程的l的配置,将请求转发给专门的对象处理。其中,根据wms工程的配置,wms除putstyles路径下的请求,都由dispatcher处理。
<!-- http url mapping -->
<bean id="wmsURLMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="alwaysUseFullPath" value="true"/>
<property name="mappings">
<props>
<prop key="/wms">dispatcher</prop>
<prop key="/wms/putstyles">putStylesWrapper</prop>
<prop key="/wms/*">dispatcher</prop>
</props>
spring framework是什么框架的</property>
</bean>
关于dispatcher对象的配置在main工程的l,处理对象的类是server.ows.Dispatcher。
<!-- dispatcher -->
<bean id="dispatcher" class="server.ows.Dispatcher">
<!--
See the applicationSecurityContext document. You can safely remove this
if in need for playing with a non secure version of Geoserver
-->
<property name="securityInterceptor">
<ref bean="operationSecurityInterceptor"/>
</property>
</bean>
andleRequestInternal(HttpServletRequest httpRequest, HttpServletResponse httpResponse)中处理。此函数再调用本身的execute(Request req, Operation opDescriptor),先分析出请求的服务(Service)、版本(Version)、操作(Operation),然后根据配置信息与GeoServerExtensions匹配到服务处理的Bean,wms的配置信息如下所示。
<!-- wms service + descriptor -->
<bean id="wmsService2" class="server.wms.DefaultWebMapService">
<constructor-arg ref="wms"/>
</bean>
<alias name="wmsService2" alias="webMapService"/>
<bean id="wmsServiceDescriptor" class="server.platform.Service">
<constructor-arg index="0" value="wms"/>
<constructor-arg index="1" ref="wmsService2"/>
<constructor-arg index="2" value="1.1.1"/>
</bean>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。