GeoServer'dan OpenLayers haritasına basit bir WFS katmanı nasıl eklenir?


19

Bir OpenLayers haritaya GeoServer ile dahil veri kümelerinden birini eklemeye çalışıyorum. OpenGeo eğitimlerini takip ettim, burada benzer bir iş parçacığı gördüm, ancak çatlayamıyorum. Birisi koduma ve GeoServer kurulumuma bir bakabilir ve bana nerede yanlış yaptığımı söyleyebilir mi?

İşte benim kod:

//WMS map
world = new OpenLayers.Layer.WMS("Global Imagery", "http://maps.opengeo.org/geowebcache/service/wms", {
    layers : "openstreetmap",
    format : "image/png"
});
map.addLayer(world);

//WFS
parks = new OpenLayers.Layer.Vector("WFS", {
    strategies : [new OpenLayers.Strategy.BBOX()],
    protocol : new OpenLayers.Protocol.WFS({
        url : "http://localhost:8081/geoserver/wfs",
        featureType : "medford:parks",
        featureNS : "http://medford.opengeo.org/medford"
    })
});

map.addLayer(parks);

map.zoomToMaxExtent();

GeoServer ayrıntıları: çalışma alanı adı = medford, Ad Alanı URI = http://medford.opengeo.org Özellik türü için "parklar" ve "medford: parklar" ı denedim

Katman etkinleştirilir, reklamı yapılır ve 30 özellik dönüş sınırı vardır.

Basit bir harita oluşturmak için uğraşıyorum.

Güncellenmiş Çözüm. Şimdi çalışıyor.

wfs = new OpenLayers.Layer.Vector("Fields_WFS", {
        strategies : [new OpenLayers.Strategy.Fixed()],
        protocol : new OpenLayers.Protocol.WFS({
        version : "1.1.0",
        url : GEOSERVER_HOST + ":" + GEOSERVER_PORT + "/geoserver/wfs", 
        featurePrefix : "rpid",
        featureType : "FIELDS_SUBSET_BNG_OSGB36_1",
        featureNS : "<namespace>", 
        //geometryName : "GEOM", type "Geometry"
        srsName : "EPSG:27700"
}),
    renderers : renderer
})

Katman tanımında Ad geometrisini belirtmenize gerek yoktur. Veri setimizde Native SRS boş olduğu için geometriName'i varsayılandan daha fazla tutarsak, ancak onsuz harita projeksiyonu kullanır (bizim durumumuzda 27700).

Yanıtlar:


24

Bu yazıdaki cevabıma bir göz atın .

  1. FeatureNS değerinizin, GEOSERVER ürününüzdeki "Ad Alanı URI'sı altındaki Çalışma Alanı Sayfasını Düzenle" bölümünde olduğundan emin olun. " Http://postgis.org " kadar genel bir şey kullanmayın . " Http: // alaniniz / application / catalogLayer " gibi bir şey veya bunun gibi benzersiz bir şey kullanın. Bu URI'yi oluşturabilirsiniz, sadece benzersiz yapın.
  2. Strateji olarak yeni BBOX () var, ancak bu kutunun boyut olarak neleri var? Test için [yeni OpenLayers.Strategy.Fixed ()] olarak değiştirirdim.
  3. featureType aslında geometri türü değil, GEOSERVER içinde "Katman Adı" (biliyorum, yanıltıcı).
  4. geometryName postgis veritabanınızdaki Geometri veri türüne sahip alanın adıdır. GEOSERVER'de, "Katmanı Düzenle" altında, "Özellik Türü ayrıntıları" altında görebilirsiniz. Orada "Geometri" türünde bir alan göreceksiniz. Özellik sütununun altındaki değeri kullanın

FeaturePrefix ve sürümünü belirtirdim. Bunun gibi bir şey deneyin:

var wfs = new OpenLayers.Layer.Vector(
            "Stavros Features",
            {
                strategies: [new OpenLayers.Strategy.Fixed()]
                , projection: new OpenLayers.Projection("EPSG:4326")
                , protocol: new OpenLayers.Protocol.WFS({
                    version: "1.1.0",
                    url: "http://localhost:8081/geoserver/wfs",
                    featurePrefix: 'myWorkspace', //geoserver worspace name
                    featureType: "medford:parks", //geoserver Layer Name
                    featureNS: "http://medford.opengeo.org/medford", // Edit Workspace Namespace URI
                    geometryName: "bounds" // field in Feature Type details with type "Geometry"
                })
            });

Teşekkürler capdragon. Tüm adımları attım ama hala sevinç yok ... çalışma alanım şimdi rpid olarak adlandırıldı ve bir featurePrefix ekledim. Ben ve çalışma alanı eklemeden featureType denedim. Ben de dahil olmak üzere çeşitli ad alanları denedim: " rpid.opengeo.com ", " localhost: 8081 / rpid ". Bu mülk hakkında hala kafam karıştı. Projeksiyon ve geometri adını (GEOM) ekledim. Map.html sayfam burada yaşıyor: dosya: /// C: /Aptana/Workspace/GIS/map.html. Bu beni aşağıdaki Aynı Menşe Politikası ile yakalayacak mı? Firebug'daki Net tabetim yanıt vermeyen bir 'OPTIONS wfs' gösteriyor
geo_james

2
FeatureNS'in ad alanı istediğiniz gibi olabilir, böylece her ikisi de çalışır. Önemli olan, coğrafi sunucunuzda tam olarak aynı olması. Aksi takdirde işler serileştirilmez ve web hizmetinden yanıt alamazsınız. Yani tıklayın geoserver gitmek senin workspace(bu sayfayı götürecektir Edit Workspace. NameOlarak koymak budur featurePrefix. Ve Namespace URIsiz koymak budur featureNS. Ayrıca, emin eğer file:///c:konum bir proxy kullanmak gerekecektir. Ama yapacak http://localhosttest etmek ve emin olmak için dosya canlı
CaptDragon

Tamam Şimdi kodumu localhost: 8081 / apps / index.html'ye taşıdım ve özelliklerimi değiştirdim. Şimdi yanıtta 30 özellik görüyorum ... <rpid: OBJECTID> 25 </ rpid: OBJECTID> <rpid: FIELD_ID> NS / 86427/74196 </ rpid: ‌ FIELD_ID> <rpid: GROSS_AREA> 2.307 </ rpid: GROSS_AREA>. İlerleme! Ancak haritamdaki hiçbir özelliği görmüyorum. WMS olarak eklendiğinde onları iyi görebilirim. Diğer tek katman bir baz WMS'dir. Konsolum da aşağıdaki gibi hatalarla dolu: OpenLayers.Marker undefined ve Ext.preg bir işlev değil. Tüm kütüphanelerimi yerel olarak içe aktarıyorum ...
geo_james

Dediğinizde yanıtta 30 özellik var. Bir üst <wfs:FeatureCollection numberOfFeatures="30"... öğe içine sarılmış xml formatında değil mi?
CaptDragon

Yeni çok basit bir test sayfası oluşturun ve bu WFS katmanını ekleyin. Bana öyle geliyor ki OpenLayers.Marker WFS ile ilgili olmadığı için bu hatalar kodunuzun diğer bölümlerinden geliyor. Belki yanılıyorum, ancak basit bir test sayfası oluşturmak her zaman çalışıp çalışmadığını belirlemenize yardımcı olur. Zaten ben de öyle yapıyorum.
CaptDragon

3

Kontrol edilecek ilk şey: sunucunuz / test web sayfanız 'medford.opengeo.org' da mı? Değilse, Aynı Köken Politikası nedeniyle WFS'ye erişemezsiniz . Bunu düzeltmek için teknik olarak bir proxy kullanabilirsiniz. (bence bu sadece WFS'nin kötü tasarlanmış bir protokol olgusu)


1
Aynı Köken bir tarayıcı sorunudur, WFS tam olarak tasarlandığı gibi çalışır.
Ian Turton

Evet ve hayır: WFS XML'dir, bu nedenle Firefox (ve 'masaüstü') hariç her platformda bir XML ayrıştırıcı gerektirir ve ayrıca etki alanları arası iletişim yapmak zorunda olduğumuz tek yolla iyi bir şekilde karışmaz: JSONP. Öte yandan GeoJSON, neredeyse her tarayıcıda yerel olarak ayrıştırılır ve alanlar arası uyumlu olması için kolayca ve yaygın olarak sarılır. Açıkçası elma-portakal değil, ve bu benim WFS eleştirimin kapsamı değil (şişkin, zayıf genişletilmiş, vb.).
tmcw

Tarayıcıların iyi WFS istemcileri oluşturduğunu varsayıyorsunuz. Büyük miktarlarda coğrafi verileri vektör olarak bir web tarayıcısına çekmek istemezsiniz.
Ian Turton

Merhaba tmcw. Test sayfam yalnızca C sürücümdeki yerel bir dosya değil. 8081 numaralı bağlantı noktasında yerel bir GeoServer ile çalışmak istersem Ad Alanı URI'mi ne olarak ayarlamalıyım?
geo_james

2

Sorun, özellik adı ve bu GeoServer (ve / veya OpenLayers) kafa karıştırıcı bir ad alanı önek var olmasıdır.

Deneyin:

 featureType : "parks",

Ben bazı WFS örnekler var http://ian01.geog.psu.edu/geoserver/www/wfs/index.html incelemeniz gereken yorumunu kaynak koduyla.


Teşekkürler iant. Şimdi önek olmadan denedim ve daha geniş bir sorun olduğunu düşünüyorum
geo_james

bağlantı çalışmıyor
iant

0

"medford: park" dan "park" a özellik türünüzü düzeltmeniz yeterlidir

var wfs = new OpenLayers.Layer.Vector(
            "Stavros Features",
            {
                strategies: [new OpenLayers.Strategy.Fixed()]
                , projection: new OpenLayers.Projection("EPSG:4326")
                , protocol: new OpenLayers.Protocol.WFS({
                    version: "1.0.0",
                    url: "http://localhost:8081/geoserver/wfs",
                    featureType: "parks", //geoserver Layer Name without workspace prefix
                    featureNS: "http://medford.opengeo.org/medford"

                })
            });

Örnek olarak jsfiddle bakınız: http://jsfiddle.net/expedio/ucrtthya/


-1

Kodunuz iyi. Sadece sayfanızın tarayıcı adresini değiştirmeniz yeterlidir. Tarayıcı sayfanızı "dosya: \ c ......" yerine "localhost: 8080 / geoserver / www / dosya_adiniz.html" adresine yönlendirin

Sonra vektör katmanı mükemmel şekilde işlenecektir.

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.