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

posted @ 2012-07-24 10:49  JayChen  阅读(4617)  评论(0编辑  收藏  举报