Geoserver系列之源碼分析:WMS工程


轉自:http://blog.csdn.net/suen/article/details/4808860

開始正式的分析了,先分析WMS工程。

GeoServer的WMS工程的包如下所示:

 

org.geoserver.wms

包含對wms請求進行響應的WebMapService接口、缺省實現DefaultWebMapService、服務配置信息WMSInfo、 WMS加載類以及水印等相關類。DefaultWebMapService類將GetMap等操作轉發給具體Bean組件去操作,如wmsGetMap。

org.geoserver.wms.kvp

名稱-值對(kvp)相關解析類

org.geoserver.wms.responses

對WMS的輸出進行加強,如metatile式輸出。

org.geoserver.wms.responses.decoration

在WMS輸出上添加裝飾,如圖例、比例尺、水印等。

org.geoserver.wms.util

包含WMS輔助類,現只包含輔助構造WMS請求的WMSRequests類

org.geoserver.wms.xml

現只包含對SLD請求XML進行讀取的類SLDXmlRequestReader。

org.vfny.geoserver.config

配置模型,主要的類為WMSConfig。

org.vfny.geoserver.global

保存應用程序信息,里面只有一個類WMS,已被org.geoserver.wms的WMSInfo接口取代。

org.vfny.geoserver.sld

現只包含對SLD異常進行處理的類SldException

org.vfny.geoserver.sld.requests

對WMS中SLD請求進行讀取的類

org.vfny.geoserver.sld.responses

對WMS中SLD進行響應的類

org.vfny.geoserver.wms

包含WMS一些操作的響應接口,其中最重要的是GetMapProducer接口,各種格式Map的生成都實現這個接口,包括 AbstractGetMapProducer, AbstractRasterMapProducer, AtomGeoRSSMapProducer, DefaultRasterMapProducer, GeoTiffMapProducer, GIFMapProducer, JPEGMapProducer, KMLMapProducer, KMZMapProducer, MetatileMapProducer, OpenLayersMapProducer, PNGMapProducer, RSSGeoRSSMapProducer, SvgMapProducerProxy, TiffMapProducer等

org.vfny.geoserver.wms.requests

包含對WMS請求進行讀取的類。

org.vfny.geoserver.wms.requests.readers

包含WmsXmlRequestReader類。

org.vfny.geoserver.wms.responses

對WMS進行響應的包,包含各種格式Map的生成類。

org.vfny.geoserver.wms.responses.featureInfo

 

org.vfny.geoserver.wms.responses.helpers

包含對WMS進行響應的一些工具類,如DescribeLayerTransformer、JAISupport、WMSCapsTransformer。

org.vfny.geoserver.wms.responses.legend.gif

包含GIF格式的圖例的生成和轉換類

org.vfny.geoserver.wms.responses.legend.jai

包含JAI庫支持的格式的圖例的生成和轉換類

org.vfny.geoserver.wms.responses.legend.png

包含PNG格式的圖例的生成和轉換類

org.vfny.geoserver.wms.responses.legend.raster

 

org.vfny.geoserver.wms.responses.map.georss

包含GeoRSS格式的Map的生成和轉換類,如AtomGeoRSSMapProducer、RSSGeoRSSMapProducer等

org.vfny.geoserver.wms.responses.map.geotiff

包含GeoTiff格式的Map的生成和轉換類GeoTiffMapProducer

org.vfny.geoserver.wms.responses.map.gif

包含GIF格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.jpeg

包含JPEG格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.kml

包含KML格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.metatile

包含瓦片形式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.openlayers

包含Openlayers形式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.pdf

包含PDF格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.png

包含PNG格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.svg

包含SVG格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.tiff

包含TIFF格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.palette

包含與顏色盤相關的類

org.vfny.geoserver.wms.servlets

對wms操作進行響應的實際servlet類,包括GetMap、Capabilities、DescribeLayer、GetFeatureInfo、GetLegendGraphic、GetMapLegacy、KMLReflector、WMService等

GeoServer的WMS工程的包如下所示:

 

org.geoserver.wms

包含對wms請求進行響應的WebMapService接口、缺省實現DefaultWebMapService、服務配置信息WMSInfo、 WMS加載類以及水印等相關類。DefaultWebMapService類將GetMap等操作轉發給具體Bean組件去操作,如wmsGetMap。

org.geoserver.wms.kvp

名稱-值對(kvp)相關解析類

org.geoserver.wms.responses

對WMS的輸出進行加強,如metatile式輸出。

org.geoserver.wms.responses.decoration

在WMS輸出上添加裝飾,如圖例、比例尺、水印等。

org.geoserver.wms.util

包含WMS輔助類,現只包含輔助構造WMS請求的WMSRequests類

org.geoserver.wms.xml

現只包含對SLD請求XML進行讀取的類SLDXmlRequestReader。

org.vfny.geoserver.config

配置模型,主要的類為WMSConfig。

org.vfny.geoserver.global

保存應用程序信息,里面只有一個類WMS,已被org.geoserver.wms的WMSInfo接口取代。

org.vfny.geoserver.sld

現只包含對SLD異常進行處理的類SldException

org.vfny.geoserver.sld.requests

對WMS中SLD請求進行讀取的類

org.vfny.geoserver.sld.responses

對WMS中SLD進行響應的類

org.vfny.geoserver.wms

包含WMS一些操作的響應接口,其中最重要的是GetMapProducer接口,各種格式Map的生成都實現這個接口,包括 AbstractGetMapProducer, AbstractRasterMapProducer, AtomGeoRSSMapProducer, DefaultRasterMapProducer, GeoTiffMapProducer, GIFMapProducer, JPEGMapProducer, KMLMapProducer, KMZMapProducer, MetatileMapProducer, OpenLayersMapProducer, PNGMapProducer, RSSGeoRSSMapProducer, SvgMapProducerProxy, TiffMapProducer等

org.vfny.geoserver.wms.requests

包含對WMS請求進行讀取的類。

org.vfny.geoserver.wms.requests.readers

包含WmsXmlRequestReader類。

org.vfny.geoserver.wms.responses

對WMS進行響應的包,包含各種格式Map的生成類。

org.vfny.geoserver.wms.responses.featureInfo

 

org.vfny.geoserver.wms.responses.helpers

包含對WMS進行響應的一些工具類,如DescribeLayerTransformer、JAISupport、WMSCapsTransformer。

org.vfny.geoserver.wms.responses.legend.gif

包含GIF格式的圖例的生成和轉換類

org.vfny.geoserver.wms.responses.legend.jai

包含JAI庫支持的格式的圖例的生成和轉換類

org.vfny.geoserver.wms.responses.legend.png

包含PNG格式的圖例的生成和轉換類

org.vfny.geoserver.wms.responses.legend.raster

 

org.vfny.geoserver.wms.responses.map.georss

包含GeoRSS格式的Map的生成和轉換類,如AtomGeoRSSMapProducer、RSSGeoRSSMapProducer等

org.vfny.geoserver.wms.responses.map.geotiff

包含GeoTiff格式的Map的生成和轉換類GeoTiffMapProducer

org.vfny.geoserver.wms.responses.map.gif

包含GIF格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.jpeg

包含JPEG格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.kml

包含KML格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.metatile

包含瓦片形式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.openlayers

包含Openlayers形式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.pdf

包含PDF格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.png

包含PNG格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.svg

包含SVG格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.map.tiff

包含TIFF格式的Map的生成和轉換類

org.vfny.geoserver.wms.responses.palette

包含與顏色盤相關的類

org.vfny.geoserver.wms.servlets

對wms操作進行響應的實際servlet類,包括GetMap、Capabilities、DescribeLayer、GetFeatureInfo、GetLegendGraphic、GetMapLegacy、KMLReflector、WMService等

 

 

 

 

以一個完整的WMS訪問過程來分析WMS工程中代碼執行的過程。

一、HTTP GET請求

WMS的請求一般使用HTTP Get的形式直接從地址欄輸入或者通過JS代碼發送到服務器端。請求的格式如下所示:

http://localhost:8080/geoserver /wms?bbox=-74.01199448397661,40.70732689845813,-74.00841053684495,40.71216558957052&styles=&Format=application/openlayers&request=GetMap&version=1.1.1&layers=tiger:poi&width=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工程的配置文件web.xml中。

   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基於每個工程的applicationContext.xml的配置,將請求轉發給專門的對象處理。其中,根據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>

       </property>

    </bean>

關於dispatcher對象的配置在main工程的applicationContext.xml,處理對象的類是org.geoserver.ows.Dispatcher。

    <!--  dispatcher -->

    <bean id="dispatcher" class="org.geoserver.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>

org.geoserver.ows.Dispatcher繼承自spring框架的AbstractController類。它對於HTTP請求的處理是在handleRequestInternal(HttpServletRequest httpRequest, HttpServletResponse httpResponse)中處理。此函數再調用本身的execute(Request req, Operation opDescriptor),先分析出請求的服務(Service)、版本(Version)、操作(Operation),然后根據配置信息與GeoServerExtensions匹配找到服務處理的Bean,wms的配置信息如下所示。

    <!-- wms service + descriptor -->

    <bean id="wmsService2" class="org.geoserver.wms.DefaultWebMapService">

      <constructor-arg ref="wms"/>

    </bean>

    <alias name="wmsService2" alias="webMapService"/>

   

    <bean id="wmsServiceDescriptor" class="org.geoserver.platform.Service">

       <constructor-arg index="0" value="wms"/>

       <constructor-arg index="1" ref="wmsService2"/>

       <constructor-arg index="2" value="1.1.1"/>

    </bean>

此配置信息說明對於服務ID為wms的操作,由org.geoserver.wms.DefaultWebMapService來使用與操作同名的函數來處理。

這樣,對於下面的請求:

http://localhost:8080/geoserver /wms?bbox=-74.01199448397661,40.70732689845813,-74.00841053684495,40.71216558957052&styles=&Format=application/openlayers&request=GetMap&version=1.1.1&layers=tiger:poi&width=457&height=550&srs=EPSG:4326

將由org.geoserver.wms.DefaultWebMapService的getMap函數來處理。

四、org.geoserver.wms.DefaultWebMapService的getMap函數處理過程

此函數先根據配置信息得到wmsGetMap對象,所屬類是org.vfny.geoserver.wms.servlets.GetMap。

    <bean id="wmsGetMap"

       class="org.vfny.geoserver.wms.servlets.GetMap"

       parent="wmsService">

    </bean>   

然后執行此對象的getResponse()方法。然后創建一個GetMapResponse對象。

五、寫輸出

寫輸出是通過執行org.geoserver.ows.Dispatcher的void response(Object result, Request req, Operation opDescriptor)函數。此函數先循環搜索和排序響應類集合responses(List responses = GeoServerExtensions.extensions(Response.class);),確定響應類response (Response response = (Response) responses.get(0);),再根據輸出策略outputStrategy(ServiceStrategy outputStrategy = findOutputStrategy(req.httpResponse);)進行輸出。

具體執行在set the mime type時(req.httpResponse.setContentType(response.getMimeType(result, opDescriptor));)調用ResponseAdapter的getMimeType(Object value, Operation operation)函數,此函數再調用delegate.execute(request)來執行(delegate即第四步創建的GetMapResponse對象)。最終的執行在GetMapResponse對象的execute(Request req)函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM