Як отримати імена всіх шарів у магазині в GeoServer за допомогою OpenLayers


9

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

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

Будь-яка порада щодо того, як я можу досягти цього, буде дуже вдячна. Будь-який альтернативний підхід також буде оцінений.

ОНОВЛЕННЯ:

Я вважаю , що я знайшов рішення тут ; "Запити WFS GetCapability можна відфільтрувати лише до повернених шарів, що відповідають певній області імен. Для цього додайте до свого запиту наступний код: space names = <namespace>". Я сподіваюся, що це допомагає комусь іншому.


Питання розширене. Спосіб, про який ви згадуєте, повертає лише 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. На щастя, є спосіб зробити це за допомогою API GeoServer REST. Ви можете отримати список типів функцій для даної робочої області та сховища даних, використовуючи щось на кшталт:

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

Це поверне вам об’єкт JSON, у якому перелічені всі типи функцій у робочій області, ви також можете замінити .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. Вони прекрасно працюють. Дуже дякую. Це було надзвичайно корисно.
— okello

Немає проблем, приємно допомогти!
— Чендерсон

Це віртуальне посилання служб 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});          
            });
        }
    });

Таким чином, я можу додати ключове слово "група: ГЕОГРАФІЯ" введіть тут опис зображенняна шар Geoserver, і мені не потрібно вручну кодувати кожен шар та його групу. Ім'я використовується для створення шару (можливо , з допомогою L.WMS.source) і назва є HTML мітка.


1

Спробуйте перевірити цю відповідь . це також дає демонстраційну версію. Не забувайте, що шари служать через різні сервіси, про які там говорилося.

я сподіваюся, що це допоможе тобі ...


Я перевірив це. Це відповідає моїй думці, що я можу досягти цього за допомогою WFS GetCapabilitiesзапиту. Але я хочу лише отримати назви шарів, нічого іншого. Це означає, що я маю включати фільтри у свій запит. Але я досі не маю уявлення про те, як я можу додавати фільтри до WFS GetCapabiltiesзапиту, який би повертав лише імена шарів. Дивіться моє оновлення вище. Якісь покажчики?
— okello
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.