Как получить имена всех слоев в магазине в GeoServer, используя OpenLayers

9

У меня есть строгое требование извлекать имена всех слоев в хранилище GeoServer, используя OpenLayers. Я просмотрел этот пост здесь , но он не отвечает на мой вопрос. Я также прошел через REST API GeoServer, который был бы идеальным, если бы я использовал другой язык, например C #, Java или PHP. Но я хочу сделать это полностью в JavaScript.

ОБНОВЛЕНИЕ: Из того, что я вижу в WFS GetCapabilitiesдокументе, я могу получить имена всех слоев, отправив запрос WFS GetCapabilities, используя фильтры. Но я не уверен, возможно ли включить фильтры в GetCapabilitiesзапрос. Я также не представляю, как будет выглядеть такой фильтр.

Любые советы о том, как я могу добиться этого, будут высоко оценены. Любой альтернативный подход также будет оценен.

ОБНОВИТЬ:

Я считаю, что нашел решение здесь ; «Запросы WFS GetCapabilities можно отфильтровать, чтобы они возвращали только слои, соответствующие определенному пространству имен. Для этого добавьте в свой запрос следующий код: namespace = <namespace>». Я надеюсь, что это помогает кому-то еще.

Okello
источник
Расширенный вопрос. Упомянутый вами метод возвращает только XML уже опубликованных слоев и другую опубликованную информацию. Есть ли способ вернуть информацию XML неопубликованных / ожидающих слоев? Я пробовал wms / wfs / wcs / REST и даже пакет python gsconfig, и никто из них не сделал бы этого.
swap0

Ответы:

18

Я заметил, что вы уже нашли решение, которое работает для вас, но я подумал, что мог бы добавить некоторые дополнительные опции, которые вы или другие могут найти полезными.

В GeoServer есть возможность, известная как Virtual OWS Services . Сервисы WMS, WFS и WCS вместе называются сервисами OWS. Когда вы делаете запрос к одной из этих служб, вы делаете глобальный запрос, поэтому все зарегистрированные уровни возвращаются в документе о возможностях (если у вас нет настроек безопасности данных). В отличие от этого, виртуальный сервис является фильтрованным представлением глобального сервиса. Фильтрация выполняется в рабочих пространствах и доступна через несколько иной URL.

Давайте возьмем пример. Предположим, у вас есть рабочее пространство с именем myws, и именно в этом рабочем пространстве вы хотите перечислить слои. В этом случае вы можете сделать запрос к URL:

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

В возвращенном документе о возможностях будут перечислены только слои, зарегистрированные в рабочей области myws .

Это один из подходов, однако вы изначально спрашивали о доступе к списку слоев через JavaScript. К счастью, есть способ сделать это, используя GeoServer REST API. Вы можете получить список FeatureTypes для данного рабочего пространства и хранилища данных , используя что - то вроде:

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

Это вернет вам JSON объект со списком всех FeatureTypes в пределах рабочей области, вы можете также заменить .json для .xml или .html , чтобы получить ответ в этих форматах. Итак, как это сделать в OpenLayers? К счастью, OpenLayers обеспечивает инкапсуляцию объекта XMLHttpRequest в форме OpenLayers.Requestобъекта. Простой пример с использованием приведенного выше URL REST:

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
источник
Я проверил каждое предложение в этом посте, @CHenderson. Они работают отлично. Большое спасибо. Это было очень полезно.
Окелло
Нет проблем, приятно быть в состоянии помочь!
Чендерсон
Эта ссылка на виртуальные сервисы OWS сейчас мертва. Можно найти здесь
wchatx
работает как шарм
AhammadaliPK
Не могли бы вы также добавить ответ для листовки?
Tekson
2

Этот ответ может помочь кому-то. Я хотел создать список своих слоев автоматически, используя Javascript и Leaflet. Используя ответ Чендерсона, я сделал следующий код:



    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});          
            });
        }
    });

Таким образом, я могу добавить ключевое слово «group: GEOGRAPHY» введите описание изображения здесьна слой Geoserver, и мне не нужно вручную кодировать каждый слой и его группу. Имя используется для создания слоя (возможно , с помощью L.WMS.source) и название является HTML метка.

StackUnder
источник
1

Попробуйте проверить этот ответ . это также дает демо. Не забывайте, что слои обслуживаются различными службами, как там упоминалось.

я надеюсь, что это поможет вам ...

Арагон
источник
Я проверил это. Это соответствует моей мысли, что я могу достичь этого, используя WFS GetCapabilitiesзапрос. Но я только хочу получить названия слоев, ничего больше. Это означает, что я должен включить фильтры в свой запрос. Но я до сих пор не знаю, как добавить фильтры в WFS GetCapabiltiesзапрос, который будет возвращать только имена слоев. Обратитесь к моему обновлению выше. Есть указатели?
Окелло