¿Cómo agregar una capa WFS simple de GeoServer al mapa OpenLayers?

19

Estoy tratando de agregar uno de los conjuntos de datos incluidos con GeoServer a un mapa OpenLayers. He seguido los tutoriales de OpenGeo, he visto un hilo similar aquí, pero parece que no puedo descifrarlo. ¿Alguien puede echar un vistazo a mi código y la configuración de GeoServer y decirme dónde me estoy equivocando?

Aquí está mi código:

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

Detalles del GeoServer: nombre del espacio de trabajo = medford, URI del espacio de nombres = http://medford.opengeo.org Para el tipo de característica he intentado "parques" y "medford: parques"

La capa está habilitada, anunciada y tiene un límite de retorno de 30 funciones.

Estoy luchando por armar un mapa simple.

Solución actualizada Trabajando ahora.

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

No necesita especificar el nombre de geometría en la definición de capa. Dado que el SRS nativo era nulo en nuestro conjunto de datos, si mantenemos geometryName de lo que toma por defecto, pero sin él, utiliza la proyección del mapa (27700- en nuestro caso).

geo_james
fuente

Respuestas:

24

Echa un vistazo a mi respuesta en esta publicación .

  1. Asegúrese de que su valor de featureNS esté en la "Editar página de espacio de trabajo bajo URI de espacio de nombres" en su GEOSERVER. No use algo tan genérico como " http://postgis.org ". Use algo como " http: // yourdomain / application / catalogLayer " o algo único como eso. Puedes inventar este URI, solo hazlo único.
  2. Tiene una nueva BBOX () como estrategia, pero ¿qué tiene esa caja como dimensiones? Lo cambiaría a [new OpenLayers.Strategy.Fixed ()] para probarlo.
  3. featureType no es realmente el tipo de geometría, es su "Nombre de capa" en GEOSERVER (lo sé, engañoso).
  4. geometryName es el nombre del campo en su base de datos postgis que tiene el tipo de datos Geometry. En GEOSERVER, en "Editar capa" puede ver en la parte inferior "Detalles del tipo de característica". Allí verá un campo con el tipo "Geometría". Use el valor debajo de la columna de propiedades

Especificaría featurePrefix y versión. Intenta algo como esto:

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
fuente
Gracias capdragon. He tomado todos los pasos pero aún no me alegro ... mi espacio de trabajo ahora se llama rpid y he agregado una característicaPrefix. Intenté featureType con y sin agregar el espacio de trabajo. He intentado varios espacios de nombres que incluyen: " rpid.opengeo.com ", " localhost: 8081 / rpid ". Todavía estoy confundido acerca de esta propiedad. He insertado el nombre de proyección y geometría (GEOM). Mi página map.html vive aquí: archivo: /// C: /Aptana/Workspace/GIS/map.html. ¿Esto me atrapará con la Política del mismo origen a continuación? My Net tabe en Firebug muestra un 'OPCIONES wfs' sin respuesta
geo_james
2
El espacio de nombres de featureNS puede ser lo que quieras para que ambos funcionen. Lo importante es que lo tenga exactamente igual en su geoservidor. O bien, las cosas no se serializan y no obtiene respuesta del servicio web. Así que vaya al geoservidor, haga clic en su workspace(esto lo llevará a la página Edit Workspace. Esto Namees lo que puso como featurePrefix. Y Namespace URIes lo que puso como featureNS. Además, no estoy seguro de si la file:///c:ubicación requerirá que use un proxy. Pero haría el archivo en vivo en http://localhosta prueba y asegurarse.
CaptDragon
OK, ahora moví mi código a localhost: 8081 / apps / index.html y cambié mi featureNS. Ahora puedo ver 30 características regresando en la respuesta ... <rpid: OBJECTID> 25 </ rpid: OBJECTID> <rpid: FIELD_ID> NS / 86427/74196 </ rpid: ‌ FIELD_ID> <rpid: GROSS_AREA> 2.307 </ rpid: GROSS_AREA>. ¡Progreso! Sin embargo, no veo ninguna de las características en mi mapa. Cuando se agrega como WMS, puedo verlos bien. La única otra capa es un WMS base. Mi consola también está plagada de errores como: OpenLayers.Marker no está definido y Ext.preg no es una función. Estoy importando todas mis bibliotecas localmente ...
geo_james
Cuando dices que hay 30 características en la respuesta. Están en formato xml envuelto dentro de un <wfs:FeatureCollection numberOfFeatures="30"... elemento padre ¿verdad?
CaptDragon
Yo diría que cree una nueva página de prueba muy simple y agregue esa capa WFS. Me parece que esos errores provienen de otras partes de su código ya que OpenLayers.Marker no está involucrado con WFS. Tal vez me equivoque, pero crear una página de prueba simple siempre ayuda a determinar si funciona o no. Eso es lo que hago de todos modos.
CaptDragon
3

Lo primero que debe verificar: ¿está su servidor / página web de prueba en 'medford.opengeo.org'? Si no es así, no podrá acceder a WFS debido a la Política del mismo origen . Técnicamente, puede usar un proxy para solucionar esto. (aunque en mi opinión esto es solo un caso de WFS siendo un protocolo mal diseñado)

tmcw
fuente
1
El mismo origen es un problema del navegador, WFS funciona exactamente como se diseñó.
Ian Turton
Sí y no: WFS es XML, por lo que necesita un analizador XML en todas las plataformas excepto Firefox (y 'el escritorio'), y tampoco se combina bien con la única forma en que tenemos que hacer la comunicación entre dominios: JSONP. GeoJSON, por otro lado, se analiza de forma nativa en casi todos los navegadores y se envuelve fácil y comúnmente para ser compatible con dominios cruzados. Obviamente no de manzanas a naranjas, y ese no es el alcance de mi crítica de WFS (hinchado, mal extendido, etc.).
tmcw
Está suponiendo que los navegadores son buenos clientes WFS. Casi nunca desea extraer grandes cantidades de datos geográficos en un navegador web como vectores.
Ian Turton
Hola tmcw No, mi página de prueba es solo un archivo local en mi unidad C. ¿A qué debo configurar mi URI de espacio de nombres si quiero trabajar con un GeoServer local en el puerto 8081?
geo_james
2

Su problema es que tiene el prefijo en el nombre de la función y un espacio de nombres, esto es confuso GeoServer (y / o OpenLayers).

Tratar:

 featureType : "parks",

Tengo algunos ejemplos de WFS en http://ian01.geog.psu.edu/geoserver/www/wfs/index.html con código fuente comentado que puedes estudiar.

Ian Turton
fuente
Gracias iant. Ahora lo he intentado sin el prefijo y creo que hay un problema más amplio
geo_james
link no funciona
iant
0

simplemente corrija su tipo de característica de "medford: parques" a "parques"

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"

                })
            });

Ver jsfiddle como ejemplo: http://jsfiddle.net/expedio/ucrtthya/

Thomas B
fuente
-1

Tu codigo esta bien. Solo necesita cambiar la dirección del navegador de su página. Dirija la página de su navegador a través de "localhost: 8080 / geoserver / www / your_file_name.html" en lugar de "file: \ c ......"

Entonces la capa vectorial se renderizará perfectamente.

Shahida Umar
fuente