Openlayers加載Geoserver WFS


1、環境說明:

操作系統:Window 7 64

GeoServerGeoServer 2.1.2,端口8090

OpenlayersOpenLayers-2.12

Tomcatapache-tomcat-7.0.22,端口8080

2、數據准備及發布

本文用到的數據為一面狀數據,本地shapefile文件(Continents.shp),預覽圖如下:


2.1、在GeoServer的數據目錄新建一目錄Continents,把shp文件連同它關聯的其它幾個文件復制到該目錄下;

2.2、打開GeoServer管理頁面,用管理員登錄:admin/geoserver

2.3、新建一個Workspace,命名“mytest”,uri設置為:“http://www.opengis.com/mytest


2.4、添加一個Store,點擊“Stores->Add new Store,


 


 

選擇“Shapefile”,在新的頁面中輸入如下信息:

1)選擇Workspace:設置為新建的“mytest”;

2)設置Data Source NameContinents

3)選擇Shapefile locationfile:data/Continents/Continents.shp

 

 

點擊“save”保存。

2.5、圖層發布。上一步點擊“save”后,即彈出發布界面,如下圖所示:


點擊“Publish”按鈕,彈出參數設置界面,該界面中主要設置wfswms服務相關的一些參數,不作詳解,根據實際情況選擇設置即可:


點擊“Save”按鈕,返回“Layers”界面,就可以看到新發布的Layer了:


2.6、圖層預覽:

點擊GeoServer管理頁面中“Layer Preview”按鈕,找到剛發布的Layer


點擊“OpenLayers”,顯示如下:


點擊“Select one”,選擇“WFS->GML2,輸出如下錯誤:

<?xml version="1.0" ?>

<ServiceExceptionReport

   version="1.2.0"

   xmlns="http://www.opengis.net/ogc"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/wfs/1.0.0/OGC-exception.xsd">

   <ServiceException>

      java.lang.NullPointerException

null

</ServiceException></ServiceExceptionReport>

 

出現該錯誤的原因是Workspace(“mytest”)沒有輸出到圖層的字段信息中,為什么會出現該問題目前還不清楚,要解決該問題可以通過如下方法:

在“Workspaces”頁面中,修改“mytest”為其它名稱(如mytest2),點擊保存,這時會提示一個錯誤,不管它,保存完后,再到“Layer Preview”頁面中查看,這時就可以了,如下圖。如果覺得“mutest2”不喜歡,再改回去也沒問題了。具體原因還要再詳細查找。


 

到此次為止,服務發布完成。

 

3、在OpenLayers中加載Geoserver發布的WFS

本人在實現該功能時遇到了兩個問題:

1)關於Openlayers中加載wfs的寫法;

2Openlayers加載wfs時存在跨域問題。

下面一個一個來說。

3.1 寫法問題

googlebaidu、查看Openlayers APIExample后,得出在Openlayers中加載GeoServer WFS服務的寫法如下:

var wfs = new OpenLayers.Layer.Vector("WFS", {

    strategies: [new OpenLayers.Strategy.Fixed()],

    projection: new OpenLayers.Projection("EPSG:4326"),

    protocol: new OpenLayers.Protocol.WFS({

version : "1.0.0",

url:  "http://localhost:8090/geoserver/wfs",

featureType: "Continents",

featurePrefix : "mytest",

featureNS: "http://www.opengis.com/mytest",

srsName : "EPSG:4326",

geometryName:"the_geom"

    })

});

下面介紹下幾個關鍵的參數:

url:指GeoServer wfs服務地址,我安裝在本機,端口號為8090

featureType:發布的wfs圖層名稱,如上文所述,本文發布的wfs圖層為:Continents

featureNSGeoServerworkspace uri,本文中新建的workspace為:http://www.opengis.com/mytest

 

清楚了加載wfs的寫法后,發現怎么加載都沒反應,后來在IE中調試發現,報“拒絕訪問”的錯誤,百度后得知存在跨域問題。

 

3.2 跨域問題

Openlayers提供了使用代理的方式解決跨域問題,不過要搭建好這個代理環境得花點功夫。

OpenLayers中如果要使用代理,那么我們先要改變全局變量OpenLayers.ProxyHost的值,設置成服務器的地址,url則為提供數據的地址,它和服務器不在同一個域中,這實際上是利用服務器進行了中轉,因為服務器去跨域取數據要靈活的多 <http://readwall.blog.163.com/blog/static/10127132200883101334312/>

 

下面具體說明在Tomcat下搭建的過程:

 

1)獲取 proxy.cgi文件。如果你已經下載到了Openlayers包,可以在其eaxmple文件夾下找到該文件,或者可以去網站下載(proxy.cgi);

2)安裝python

3)修改tomcat配置。

Tomcat的配置文件中找到context.xml做如下修改:<Context privileged="true"></Context>

或者copy 該文件至META-INF下做如上修改。

4)新建Java web工程(我的工程名稱為openlayers),修改web.xml文件,添加如下內容:

<servlet>

        <servlet-name>cgi</servlet-name>

        <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>

        <init-param>

          <param-name>debug</param-name>

          <param-value>0</param-value>

        </init-param>

        <init-param>

          <param-name>cgiPathPrefix</param-name>

          <param-value>WEB-INF/cgi</param-value>

        </init-param>

         <init-param>

          <param-name>executable</param-name>

          <param-value>C:/Python26/ArcGIS10.0/python.exe</param-value>

        </init-param>

        <init-param>

          <param-name>passShellEnvironment</param-name>

          <param-value>true</param-value>

        </init-param>

         <load-on-startup>5</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>default</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>cgi</servlet-name>

<url-pattern>/cgi/*</url-pattern>

</servlet-mapping>

上述標注處是要根據實際安裝修改的地方。

5)修改proxy.cgi文件,添加本機GeoServer服務地址。如下:


將修改好的文件復制到java web工程的WEB-INF/cgi(與web.xml文件中的配置對應)文件夾下。

 

至此代理搭建完成。啟動tomcat服務,在地址欄中輸入 http://localhost:8080/openlayers/cgi/proxy.cgi 即可看到Openlayers的主頁。

 

本文最后加載看到的截圖如下:


 

 參考文獻:

http://readwall.blog.163.com/blog/static/10127132200883101334312/

http://blog.csdn.net/zhuhuazha/article/details/6336468

http://www.cnblogs.com/boonya/archive/2012/03/18/2395794.html


免責聲明!

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



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