Comment ajouter une simple couche WFS de GeoServer à la carte OpenLayers?

19

J'essaie d'ajouter l'un des ensembles de données inclus avec GeoServer à une carte OpenLayers. J'ai suivi les tutoriels OpenGeo, vu un fil similaire ici, mais je n'arrive pas à le casser. Quelqu'un peut-il jeter un coup d'œil à mon code et à la configuration de GeoServer et me dire où je me trompe?

Voici mon code:

//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();

Détails du GeoServer: workspace name = medford, Namespace URI = http://medford.opengeo.org Pour le type d' entité, j'ai essayé "parks" et "medford: parks"

La couche est activée, publiée et a une limite de retour de 30 fonctionnalités.

J'ai du mal à assembler une carte simple.

Solution mise à jour. Travaille maintenant.

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

N'a pas besoin de spécifier le nom de la géométrie dans la définition de la couche. Étant donné que Native SRS était nul dans notre jeu de données, si nous conservons geometryName par rapport à celui par défaut, mais sans lui, il utilise la projection cartographique (27700- dans notre cas).

geo_james
la source

Réponses:

24

Jetez un oeil à ma réponse sur ce post .

  1. Assurez-vous que votre valeur featureNS se trouve dans la page "Modifier l'espace de travail sous l'URI de l'espace de noms" dans votre GEOSERVER. N'utilisez pas quelque chose d'aussi générique que " http://postgis.org ". Utilisez quelque chose comme " http: // yourdomain / application / catalogLayer " ou quelque chose d'unique comme ça. Vous pouvez créer cet URI, le rendre unique.
  2. Vous avez un nouveau BBOX () comme stratégie mais qu'est-ce que cette boîte a comme dimensions? Je le changerais en [new OpenLayers.Strategy.Fixed ()] pour les tests.
  3. featureType n'est pas réellement le type de géométrie, c'est votre "nom de couche" dans GEOSERVER (je sais, trompeur).
  4. geometryName est le nom du champ dans votre base de données Postgis qui a le type de données Geometry. Dans GEOSERVER, sous "Modifier le calque", vous pouvez voir en bas "Détails du type d'entité". Là, vous verrez un champ de type "Géométrie". Utilisez la valeur sous la colonne des propriétés

Je préciserais le FeaturePrefix et la version. Essayez quelque chose comme ceci:

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"
                })
            });
CaptDragon
la source
Merci capdragon. J'ai pris toutes les mesures mais toujours pas de joie ... mon espace de travail s'appelle maintenant rpid et j'ai ajouté un featurePrefix. J'ai essayé featureType avec et sans ajouter l'espace de travail. J'ai essayé différents espaces de noms, notamment: " rpid.opengeo.com ", " localhost: 8081 / rpid ". Je suis toujours confus au sujet de cette propriété. J'ai inséré le nom de la projection et de la géométrie (GEOM). Ma page map.html se trouve ici: fichier: /// C: /Aptana/Workspace/GIS/map.html. Est-ce que cela me rattrapera avec la politique de la même origine ci-dessous? Mon tabe Net dans Firebug affiche une 'OPTIONS wfs' sans réponse
geo_james
2
L'espace de noms de featureNS peut être ce que vous voulez, donc les deux fonctionneront. L'important est que vous l'ayez exactement de la même manière sur votre géoserveur. Sinon, les choses ne sont pas sérialisées et vous n'obtenez aucune réponse du service Web. Alors allez dans geoserver, cliquez sur votre workspace(cela vous amènera à la page Edit Workspace. NameC'est ce qui est mis featurePrefix. Et Namespace URIc'est ce que vous mettez comme featureNS. De plus, je ne sais pas si l' file:///c:emplacement vous obligera à utiliser un proxy. Mais je ferais le fichier en direct sur http://localhostpour tester et vous assurer.
CaptDragon
OK, j'ai maintenant déplacé mon code vers localhost: 8081 / apps / index.html et changé ma fonctionNS. Je peux maintenant voir 30 fonctionnalités revenir sur la réponse ... <rpid: OBJECTID> 25 </ rpid: OBJECTID> <rpid: FIELD_ID> NS / 86427/74196 </ rpid: ‌ FIELD_ID> <rpid: GROSS_AREA> 2.307 </ rpid: GROSS_AREA>. Le progrès! Cependant, je ne vois aucune des fonctionnalités sur ma carte. Une fois ajouté en tant que WMS, je peux les voir très bien. La seule autre couche est un WMS de base. Ma console est également criblée d'erreurs telles que: OpenLayers.Marker n'est pas défini et Ext.preg n'est pas une fonction.
J'importe
Lorsque vous dites qu'il y a 30 fonctionnalités dans la réponse. Ils sont au format xml enveloppé dans un <wfs:FeatureCollection numberOfFeatures="30"... élément parent , non?
CaptDragon
Je dirais créer une nouvelle page de test très simple et ajouter cette couche WFS. Il me semble que ces erreurs proviennent d'autres parties de votre code puisque OpenLayers.Marker n'est pas impliqué avec WFS. Peut-être que je me trompe, mais la création d'une page de test simple aide toujours à déterminer si cela fonctionne ou non. C'est ce que je fais de toute façon.
CaptDragon
3

Première chose à vérifier: votre serveur / page Web de test est-il sur 'medford.opengeo.org'? Si ce n'est pas le cas, vous ne pourrez pas accéder à WFS en raison de la même politique d'origine . Vous pouvez techniquement utiliser un proxy pour résoudre ce problème. (même si à mon avis, c'est juste un cas où WFS est un protocole mal conçu)

tmcw
la source
1
Même origine est un problème de navigateur, WFS fonctionne exactement comme prévu.
Ian Turton
Oui et non: WFS est XML, donc il nécessite un analyseur XML sur toutes les plates-formes sauf Firefox (et `` le bureau ''), et il ne se mélange pas non plus bien avec la seule façon dont nous devons faire la communication entre domaines: JSONP. GeoJSON, d'autre part, est analysé en mode natif dans presque tous les navigateurs et est facilement et généralement encapsulé pour être compatible entre les domaines. Évidemment pas des pommes aux oranges, et ce n'est pas l'étendue de ma critique WFS (gonflée, mal étendue, etc.).
tmcw
Vous supposez que les navigateurs font de bons clients WFS. Vous ne voulez presque jamais extraire de grandes quantités de données géographiques dans un navigateur Web comme vecteurs.
Ian Turton
Salut tmcw. Non, ma page de test n'est qu'un fichier local sur mon lecteur C. Que dois-je définir mon URI d'espace de noms si je veux travailler avec un GeoServer local sur le port 8081?
geo_james
2

Votre problème est que vous avez le préfixe sur le nom de la fonctionnalité et un espace de noms, ce qui prête à confusion GeoServer (et / ou OpenLayers).

Essayer:

 featureType : "parks",

J'ai quelques exemples WFS sur http://ian01.geog.psu.edu/geoserver/www/wfs/index.html avec du code source commenté que vous pouvez étudier.

Ian Turton
la source
Merci iant. J'ai maintenant essayé sans le préfixe et je pense qu'il y a un problème plus large
geo_james
lien ne fonctionne pas iant
Sam007
0

corrigez simplement votre type de caractère de "medford: parks" à "parks"

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"

                })
            });

Voir jsfiddle comme exemple: http://jsfiddle.net/expedio/ucrtthya/

Thomas B
la source
-1

Votre code est ok. Il vous suffit de modifier l'adresse du navigateur de votre page. Pointez la page de votre navigateur via "localhost: 8080 / geoserver / www / your_file_name.html" au lieu de "file: \ c ......"

Ensuite, le calque vectoriel sera rendu parfaitement.

shahida umar
la source