Як отримати імена всіх шарів у магазині в 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.