Jak uzyskać nazwy wszystkich warstw w sklepie w GeoServer za pomocą OpenLayers


9

Mam ścisły wymóg pobierania nazw wszystkich warstw w sklepie GeoServer za pomocą OpenLayers. Przejrzałem tutaj post , ale nie odpowiada na moje pytanie. Przeszedłem również przez interfejs API REST GeoServera, który byłby idealny, jeśli używam innego języka, na przykład C #, Java lub PHP. Ale chcę to zrobić całkowicie w JavaScript.

AKTUALIZACJA: Z tego, co widzę w WFS GetCapabilitiesdokumencie, mogę odzyskać nazwy wszystkich warstw, wysyłając żądanie GetCapabilities WFS przy użyciu filtrów. Ale nie jestem pewien, czy możliwe jest włączenie filtrów do GetCapabilitiesżądania. Nie mam też pojęcia, jak taki filtr będzie wyglądał.

Wszelkie porady dotyczące tego, jak mogę to osiągnąć, będą bardzo mile widziane. Docenione zostanie również każde alternatywne podejście.

AKTUALIZACJA:

Myślę, że znalazłem tutaj rozwiązanie ; „Żądania WFS GetCapabilities można filtrować, aby zwracały tylko warstwy odpowiadające określonej przestrzeni nazw. Aby to zrobić, dodaj następujący kod do swojego żądania: namespace = <namespace>”. Mam nadzieję, że to pomaga komuś innemu.


Pytanie rozszerzone. Wspomniana metoda zwraca tylko xml już opublikowanych warstw i innych opublikowanych informacji. Czy istnieje sposób na zwrócenie informacji xml o niepublikowanych / oczekujących warstwach? Mam wypróbować wms / wfs / wcs / REST, a nawet pakiet python gsconfig i żaden z nich nie zrobiłby tego.
zamiana0

Odpowiedzi:


18

Zauważyłem, że już znalazłeś rozwiązanie, które działa dla Ciebie, ale pomyślałem, że mogę dodać kilka dodatkowych opcji, które mogą być przydatne dla Ciebie lub innych osób.

W GeoServer istnieje możliwość zwana wirtualnymi usługami OWS . Usługi WMS, WFS i WCS są wspólnie znane jako usługi OWS. Kiedy przesyłasz zapytanie do jednej z tych usług, wysyłasz żądanie globalne, więc wszystkie zarejestrowane warstwy są zwracane w dokumencie możliwości (chyba że masz ustawienia bezpieczeństwa danych). Natomiast usługa wirtualna to filtrowany widok usługi globalnej. Filtrowanie odbywa się w obszarach roboczych i jest dostępne przez nieco inny adres URL.

Weźmy przykład. Załóżmy, że masz obszar roboczy o nazwie myws i właśnie do tego obszaru roboczego chcesz wyświetlić listę warstw. W takim przypadku możesz poprosić o adres URL:

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

Zwrócony dokument możliwości będzie zawierał listę tylko warstw zarejestrowanych w obszarze roboczym myws .

To jedno podejście, jednak pierwotnie pytałeś o dostęp do listy warstw za pomocą JavaScript. Na szczęście istnieje sposób, aby to zrobić za pomocą interfejsu API REST GeoServer. Możesz uzyskać listę typów funkcji dla danego obszaru roboczego i magazynu danych, używając czegoś takiego:

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

Spowoduje to zwrócenie obiektu JSON z listą wszystkich typów funkcji w obszarze roboczym. Możesz również zastąpić .json plikiem .xml lub .html, aby uzyskać odpowiedź w tych formatach. Jak to zrobić w OpenLayers? Na szczęście OpenLayers zapewnia enkapsulację obiektu XMLHttpRequest w postaci OpenLayers.Requestobiektu. Prostym przykładem przy użyciu powyższego adresu URL REST byłoby:

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

Istnieje dokument dobre na zainteresowanie zdalnych danych z OpenLayers tutaj .

Mam nadzieję, że daje ci kilka innych podejść do rozważenia.


Przetestowałem każdą sugestię w tym poście, @CHenderson. Działają idealnie. Wielkie dzięki. To było bardzo pomocne.
okello

Nie ma problemu, z przyjemnością mogę pomóc!
CHenderson

To łącze wirtualnych usług OWS jest już martwe. Można znaleźć tutaj
wchatx

działa jak urok
AhammadaliPK

Czy mógłbyś również dodać odpowiedź na ulotkę?
Tekson,

2

Ta odpowiedź może komuś pomóc. Chciałem zbudować listę moich warstw automatycznie przy użyciu Javascript i Ulotki. Korzystając z odpowiedzi CHenderson, stworzyłem następujący kod:



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

W ten sposób mogę dodać słowo kluczowe „grupa: GEOGRAFIA” wprowadź opis zdjęcia tutajdo warstwy Geoserver i nie muszę ręcznie kodować każdej warstwy i jej grupy. Nazwę stosuje się w celu utworzenia warstwy (być może za pomocą L.WMS.source) i tytułowy jest etykieta HTML.


1

Spróbuj sprawdzić tę odpowiedź . daje również wersję demo. Nie zapominaj, że warstwy obsługują różne usługi, jak tam wspomniano.

Mam nadzieję, że Ci to pomoże...


Sprawdziłem to. Jest to zgodne z moją myślą, że mogę to osiągnąć za pomocą WFS GetCapabilitiesżądania. Ale chcę tylko wyszukiwać nazwy warstw, nic więcej. Oznacza to, że muszę uwzględnić filtry w mojej prośbie. Ale nadal nie mam pojęcia, jak mogę dołączyć filtry do WFS GetCapabiltiesżądania, które zwróci tylko nazwy warstw. Zapoznaj się z moją aktualizacją powyżej. Jakieś wskazówki?
okello,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.