如何使用OpenLayers获取GeoServer中商店中所有图层的名称


9

我严格要求使用OpenLayers检索GeoServer存储中所有图层的名称。我在这里浏览了这篇文章,但是没有回答我的问题。我还介绍了GeoServer的REST API,如果我使用的是另一种语言,例如C#,Java或PHP,这将是理想的选择。但是我想完全用JavaScript做到这一点。

更新:WFS GetCapabilities文档中可以看到,我可以通过使用过滤器发送WFS GetCapabilities请求来检索所有层的名称。但是我不确定是否可以在GetCapabilities请求中包含过滤器。我也不知道这样的过滤器会是什么样子。

对于如何实现此目标的任何建议将不胜感激。任何替代方法也将被理解。

更新:

我相信我在这里找到了解决方案;“可以将WFS GetCapabilities请求过滤为仅返回与特定名称空间相对应的图层。为此,请将以下代码添加到您的请求中:namespace = <namespace>”。我希望这对其他人有帮助。


一个扩展的问题。您提到的方法仅返回已发布图层和其他已发布信息的xml。有什么方法可以返回未发布/待处理层的xml信息吗?我尝试过wms / wfs / wcs / REST甚至python包gsconfig,但没人能做到。
swap0 2014年

Answers:


18

我注意到您已经找到了适合您的解决方案,但我想我可能会添加一些您或其他人认为有用的其他选项。

在GeoServer中,有一种称为虚拟OWS服务的功能。WMS,WFS和WCS服务统称为OWS服务。当您向这些服务之一发出请求时,您正在发出全局请求,因此所有注册的层都将返回到功能文档中(除非您具有数据安全性设置)。相反,虚拟服务是全局服务的过滤视图。过滤是在工作空间上完成的,并且可以通过稍微不同的URL进行访问。

让我们举个例子。假设您有一个名为myws的工作空间,并且您想为其列出图层。在这种情况下,您可以向网址发出请求:

http://www.yourgeoserver.com/geoserver/myws/ows?SERVICE=WFS&REQUEST=GetCapabilities

返回的功能文档将仅列出在myws工作空间中注册的图层

那是一种方法,但是您最初曾问过有关通过JavaScript访问层列表的问题。幸运的是,有一种方法可以使用GeoServer REST API来完成。您可以使用以下方法获取给定工作空间和数据存储区的要素类型列表:

http://www.yourgeoserver.com/geoserver/rest/workspaces/myws/featuretypes.json

这将返回一个列出工作空间中所有要素类型的JSON对象,您也可以将.json替换为.xml或.html以获得这些格式的响应。那么,如何在OpenLayers中做到这一点?幸运的是,OpenLayers以对象的形式提供了XMLHttpRequest对象的封装OpenLayers.Request。使用上面的REST URL的一个简单示例是:

var request = OpenLayers.Request.GET({
  url: "http://www.yourgeoserver.com/geoserver/rest/workspaces/myws/featuretypes.json",
  callback: function(request) {
    // Code here to handle the response, the request object contains the data
  }
});

有关于请求远程数据具有的OpenLayers好的文件在这里

希望能给您其他一些考虑的方法。


我已经测试了本文中的每个建议,@ CHenderson。他们完美地工作。非常感谢。这非常有帮助。
okello,2012年

没问题,很高兴能提供帮助!
亨德森

该虚拟OWS服务链接现在已失效。可以在这里
wchatx

就像魅力一样工作
AhammadaliPK

您还可以为传单添加答案吗?
泰森

2

这个答案可能会帮助某人。我想使用Javascript和Leaflet自动建立图层列表。使用CHenderson答案,我做了以下代码:



    url = "https://YOUSERVER/geoserver/STORE/ows?service=wfs&version=2.0.0&request=GetCapabilities"
    layerList = [];
    $.ajax({
        type: "GET",
        url: url,
        dataType: "xml",
        success: function(xml) {
            $(xml).find('FeatureType').each(function(){
                name = $(this).find("Name").text();
                title = $(this).find("Title").text();
                group = "NO_GROUP";
                $(this).find('ows\\:Keywords').each(function(){
                    keyword = $(this).find('ows\\:Keyword').text();
                    if(keyword.indexOf("group:")!=-1)
                    {
                        group=keyword.split(":")[1];
                        return false;
                    }
                });
                layerList.push({"name":name,"title":title,"group":group});          
            });
        }
    });

这样,我可以在此处输入图片说明在Geoserver图层上添加关键字“ group:GEOGRAPHY” ,而不必手动编写每个图层及其组的代码。该名称用于创建(可能使用L.WMS.source)层和标题是HTML标签。


1

尝试检查出这个答案。它还提供了一个演示。不要忘记,层通过那里提到的各种服务来服务。

我希望它可以帮助您...


我已经检查了。我认为可以通过使用WFS GetCapabilities请求来实现这一点。但是我只想检索图层名称,仅此而已。这意味着我必须在请求中包含过滤器。但是我仍然对如何将过滤器附加到WFS GetCapabilties仅返回图层名称的请求一无所知。请参阅上面的更新。有指针吗?
okello 2012年
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.