OpenLayers kullanarak GeoServer'daki bir mağazadaki tüm katmanların adları nasıl alınır


9

OpenLayers kullanarak bir GeoServer deposundaki tüm katmanların adlarını almak için sıkı gereksinimim var. Buradaki görevden geçtim ama sorumu cevaplamıyor. Ayrıca başka bir dil, örneğin C #, Java veya PHP kullanıyorsam ideal olacak olan GeoServer'ın REST API'sinden geçtim. Ama bunu tamamen JavaScript ile yapmak istiyorum.

GÜNCELLEME:WFS GetCapabilities Belgede görebildiğim kadarıyla, filtreleri kullanarak bir WFS GetCapability isteği göndererek tüm katmanların adlarını alabilirim. Ancak filtreleri bir GetCapabilitiesisteğe dahil etmenin mümkün olup olmadığından emin değilim . Böyle bir filtrenin nasıl görüneceğine dair hiçbir fikrim yok.

Bunu başarmak için nasıl gidebileceğime dair herhangi bir tavsiye çok takdir edilecektir. Herhangi bir alternatif yaklaşım da takdir edilecektir.

GÜNCELLEME:

Burada bir çözüm bulduğuma inanıyorum ; "WFS GetCapability istekleri yalnızca belirli bir ad alanına karşılık gelen katmanları döndürmek için filtrelenebilir. Bunu yapmak için isteğinize şu kodu ekleyin: namespace = <namespace>". Umarım bu başka birine yardımcı olur.


Genişletilmiş bir soru. Bahsettiğiniz yöntem yalnızca önceden yayınlanmış katmanların xml'lerini ve diğer yayınlanmış bilgileri döndürür. Yayınlanmamış / beklemedeki katmanların xml bilgilerini döndürmenin bir yolu var mı? Ben wms / wfs / wcs / REST deneyin ve hatta python paketi gsconfig ve hiçbiri bunu yapardı.
takas0

Yanıtlar:


18

Sizin için uygun bir çözüm bulduğunuzu fark ettim, ancak sizin veya başkalarının yararlı bulabileceği bazı ek seçenekler ekleyebileceğimi düşündüm.

GeoServer'da Sanal OWS Hizmetleri olarak bilinen bir yetenek vardır . WMS, WFS ve WCS hizmetleri toplu olarak OWS hizmetleri olarak bilinir. Bu hizmetlerden birine istekte bulunduğunuzda, global bir istekte bulunursunuz, bu nedenle tüm kayıtlı katmanlar yetenekler belgesinde döndürülür (veri güvenliği ayarlarınız yoksa). Buna karşılık, sanal hizmet, global hizmetin filtrelenmiş bir görünümüdür. Filtreleme çalışma alanlarında yapılır ve biraz farklı bir URL üzerinden erişilir.

Bir örnek verelim. Myws adında bir çalışma alanınız olduğunu ve katmanları listelemek istediğiniz bu çalışma alanı olduğunu varsayalım . Bu durumda URL'ye istekte bulunabilirsiniz:

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

Döndürülen yetenekler belgesi yalnızca myws çalışma alanına kaydedilmiş katmanları listeler .

Bu bir yaklaşımdır, ancak başlangıçta katmanlar listesine JavaScript aracılığıyla erişmeyi sormuştunuz. Ne mutlu ki GeoServer REST API kullanarak bunu yapmanın bir yolu var. Belirli bir çalışma alanı ve veri deposu için özellik türlerinin bir listesini aşağıdaki gibi bir şey kullanarak alabilirsiniz:

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

Bu , çalışma alanındaki tüm özellik türlerini listeleyen bir JSON nesnesi döndürür , bu biçimlerde yanıt almak için .json yerine .xml veya .html kullanabilirsiniz. Peki, bunu OpenLayers'da nasıl yapabilirim? Neyse ki OpenLayers, XMLHttpRequest nesnesinin nesne biçiminde bir kapsüllenmesini sağlar OpenLayers.Request. Yukarıdaki REST URL'sini kullanan basit bir örnek:

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

Burada OpenLayers ile uzak veri isteme konusunda iyi bir belge var .

Umarım size başka yaklaşımlar da sunar.


Bu yazıdaki her öneriyi @CHenderson test ettim. Mükemmel çalışıyorlar. Çok teşekkürler. Bu son derece yardımcı oldu.
okello

Sorun değil, yardım edebilmek bir zevk!
CHenderson

Bu sanal OWS hizmetleri bağlantısı artık öldü. Burada
wchatx

bir cazibe gibi çalışır
AhammadaliPK

Lütfen broşürün cevabını da ekler misiniz?
Tekson

2

Bu cevap birine yardımcı olabilir. Javascript ve Leaflet kullanarak katmanlarımın bir listesini otomatik olarak oluşturmak istedim. CHenderson cevabını kullanarak, aşağıdaki kodu yaptım:



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

Bu şekilde, resim açıklamasını buraya girinGeoserver katmanına "grup: GEOGRAPHY" anahtar sözcüğünü ekleyebilirim ve her katmanı ve grubunu manuel olarak kodlamak zorunda değilim. Adı (belki L.WMS.source kullanarak) katmanını oluşturmak için kullanılır ve başlık html etikettir.


1

Bu yanıtı kontrol etmeye çalışın . ayrıca bir demo sunuyor. Katmanlar orada belirtildiği gibi çeşitli hizmetler aracılığıyla hizmet unutmayın.

umarım sana yardımcı olur ...


Ben kontrol ettim. Bunu WFS GetCapabilitiesistekle gerçekleştirebileceğim düşüncem doğrultusunda. Ama sadece katman isimlerini almak istiyorum, başka bir şey değil. Bu, filtrelerimi isteğime dahil etmem gerektiği anlamına geliyor. Ancak WFS GetCapabilties, yalnızca katmanların adlarını döndürecek bir isteğe nasıl filtre ekleyebileceğim konusunda hala bir fikrim yok . Yukarıdaki güncellememe bakın. İşaretçi var mı?
okello
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.