如何从GeoServer向OpenLayers地图添加简单的WFS图层?


19

我正在尝试将GeoServer包含的数据集之一添加到OpenLayers映射中。我遵循了OpenGeo教程,在这里看到了类似的主题,但是我似乎无法破解。有人可以看一下我的代码和GeoServer设置,并告诉我我要去哪里哪里吗?

这是我的代码:

//WMS map
world = new OpenLayers.Layer.WMS("Global Imagery", "http://maps.opengeo.org/geowebcache/service/wms", {
    layers : "openstreetmap",
    format : "image/png"
});
map.addLayer(world);

//WFS
parks = new OpenLayers.Layer.Vector("WFS", {
    strategies : [new OpenLayers.Strategy.BBOX()],
    protocol : new OpenLayers.Protocol.WFS({
        url : "http://localhost:8081/geoserver/wfs",
        featureType : "medford:parks",
        featureNS : "http://medford.opengeo.org/medford"
    })
});

map.addLayer(parks);

map.zoomToMaxExtent();

GeoServer详细信息:工作空间名称= medford,命名空间URI = http://medford.opengeo.org 对于要素类型,我尝试了“ parks”和“ medford:parks”

该图层已启用,发布,并且具有30个要素返回限制。

我正在努力将一张简单的地图放在一起。

更新的解决方案。现在工作。

wfs = new OpenLayers.Layer.Vector("Fields_WFS", {
        strategies : [new OpenLayers.Strategy.Fixed()],
        protocol : new OpenLayers.Protocol.WFS({
        version : "1.1.0",
        url : GEOSERVER_HOST + ":" + GEOSERVER_PORT + "/geoserver/wfs", 
        featurePrefix : "rpid",
        featureType : "FIELDS_SUBSET_BNG_OSGB36_1",
        featureNS : "<namespace>", 
        //geometryName : "GEOM", type "Geometry"
        srsName : "EPSG:27700"
}),
    renderers : renderer
})

不需要在“图层定义”中指定几何名称。由于本机数据集中的Native SRS为null,因此如果我们保留geometryName,则默认值是默认值,但是如果没有使用它,它将使用地图投影(本例中为27700-)。

Answers:


24

看看我对这篇文章的回答。

  1. 确保您的featureNS值位于GEOSERVER的“名称空间URI下的编辑工作区页面”中。不要使用像“ http://postgis.org ” 这样的通用名称。使用类似“ http:// yourdomain / application / catalogLayer ”之类的东西。您可以创建此URI,只需使其唯一即可。
  2. 您具有新的BBOX()作为策略,但是该框具有什么尺寸?我将其更改为[new OpenLayers.Strategy.Fixed()]进行测试。
  3. featureType实际上不是几何图形的类型,它是您在GEOSERVER中的“图层名称”(我知道,会引起误解)。
  4. geometryName是您的Postgis数据库中具有Geometry数据类型的字段的名称。在GEOSERVER中的“编辑图层”下,您可以在底部的“功能类型详细信息”中看到。在那里,您将看到一个类型为“几何”的字段。使用属性列下的值

我将指定featurePrefix和版本。尝试这样的事情:

var wfs = new OpenLayers.Layer.Vector(
            "Stavros Features",
            {
                strategies: [new OpenLayers.Strategy.Fixed()]
                , projection: new OpenLayers.Projection("EPSG:4326")
                , protocol: new OpenLayers.Protocol.WFS({
                    version: "1.1.0",
                    url: "http://localhost:8081/geoserver/wfs",
                    featurePrefix: 'myWorkspace', //geoserver worspace name
                    featureType: "medford:parks", //geoserver Layer Name
                    featureNS: "http://medford.opengeo.org/medford", // Edit Workspace Namespace URI
                    geometryName: "bounds" // field in Feature Type details with type "Geometry"
                })
            });

谢谢capdragon。我已经采取了所有步骤,但仍然没有喜悦...我的工作区现在称为rpid,并且添加了featurePrefix。我尝试过带有和不带有工作区的featureType。我尝试了各种名称空间,包括:“ rpid.opengeo.com ”,“ localhost:8081 / rpid ”。我仍然对这个属性感到困惑。我已经插入了投影和几何名称(GEOM)。我的map.html页面位于此处:file:/// C:/Aptana/Workspace/GIS/map.html。这会在下面的“同源政策”中让我满意吗?我在Firebug中的网络菜单显示“ OPTIONS wfs”,但没有响应
geo_james,2012年

2
featureNS的名称空间可以是您喜欢的任何名称,因此两者都可以使用。重要的是,您在Geoserver上具有完全相同的内容。否则,事情就不会序列化,Web服务也就不会响应。因此,进入geoserver,单击您的workspace(这将带您到页面Edit WorkspaceName是放置的内容featurePrefix。并且Namespace URI是放置的内容featureNS。此外,不确定file:///c:位置是否需要您使用代理。但是我会住在文件http://localhost测试,并确保。
CaptDragon

好的,我现在将代码移至localhost:8081 / apps / index.html并更改了featureNS。我现在可以看到响应中又返回了30个功能... <rpid:OBJECTID> 25 </ rpid:OBJECTID> <rpid:FIELD_ID> NS / 86427/74196 </ rpid:‌FIELD_ID> <rpid:GROSS_AREA> 2.307 </ rpid:GROSS_AREA>。进展!但是,我在地图上没有看到任何功能。当添加为WMS时,我可以看到它们很好。唯一的另一层是基础WMS。我的控制台也充满诸如以下错误:OpenLayers.Marker未定义,Ext.preg不是函数。我正在本地导入所有图书馆...
geo_james,2012年

当您说响应中有30个功能时。它们是xml格式,包装在父<wfs:FeatureCollection numberOfFeatures="30"... 元素中,对吗?
CaptDragon 2012年

我会说创建一个新的非常简单的测试页面并添加该WFS层。在我看来,由于OpenLayers.Marker与WFS不相关,所以这些错误是来自代码的其他部分。也许我错了,但是创建一个简单的测试页总是可以帮助确定它是否正常工作。那就是我要做的。
CaptDragon 2012年

3

首先要检查:您的服务器/测试网页是否位于“ medford.opengeo.org”上?如果不是,则由于Same Origin Policy,您将无法访问WFS 。从技术上讲,您可以使用代理来解决此问题。(尽管我认为这只是WFS协议设计不佳的一种情况)


1
Same Origin是浏览器问题,WFS完全按设计工作。
伊恩·特顿

是和否:WFS是XML,因此除了Firefox(和“桌面”)之外,每个平台都需要XML解析器,并且它与我们必须进行跨域通信的唯一方法-JSONP混合使用也不充分。另一方面,GeoJSON在几乎所有浏览器中都是本机解析的,并且易于包装且通常跨域兼容。显然不是苹果变成橙色,这也不是我对WFS的批评程度((肿,扩展不良等)。
tmcw 2012年

您假设浏览器是良好的WFS客户端。您几乎从未想过将大量地理数据作为向量拉入Web浏览器。
伊恩·特顿

嗨,tmcw。没有我的测试页只是我的C驱动器上的本地文件。如果要在端口8081上使用本地GeoServer,应如何设置命名空间URI?
geo_james 2012年


0

只需将要素类型从“ medford:parks”更正为“ parks”

var wfs = new OpenLayers.Layer.Vector(
            "Stavros Features",
            {
                strategies: [new OpenLayers.Strategy.Fixed()]
                , projection: new OpenLayers.Projection("EPSG:4326")
                , protocol: new OpenLayers.Protocol.WFS({
                    version: "1.0.0",
                    url: "http://localhost:8081/geoserver/wfs",
                    featureType: "parks", //geoserver Layer Name without workspace prefix
                    featureNS: "http://medford.opengeo.org/medford"

                })
            });

参见jsfiddle作为示例:http : //jsfiddle.net/expedio/ucrtthya/


-1

您的代码还可以。您只需要更改页面的浏览器地址即可。通过“ localhost:8080 / geoserver / www / your_file_name.html”而不是“ file:\ c ......”指向浏览器页面

然后,矢量层将完美渲染。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.