1 votos

La capa WFS no se muestra en Openlayers

Llevo una semana tirándome de los pelos intentando resolver este problema.

Estoy tratando de mostrar un shapefile en el navegador. Funciona muy bien si uso WMS, pero recientemente he querido cambiar a WFS pero no he podido conseguir que funcione. Lo que obtengo ahora es un mapa centrado donde lo quiero y un fondo OSM, pero sin datos WFS

En geoservidor, estoy bastante seguro de que todo está configurado correctamente.

Este es el código que he utilizado para solicitar el WFS

var wfs = new OpenLayers.Layer.Vector("WFS", 
    {
        strategies: [new OpenLayers.Strategy.Fixed()],
        protocol: new OpenLayers.Protocol.WFS(
        {
            url: "http://localhost:8080/geoserver/wfs",
            featurePrefix:"Van263kTweet",
            featureType: "vantest",
            featureNS: "file:///data/2636k_shp",
            maxFeatures: 100,
            geometryName: "the_geom",
            //featurePrefix: "",
            version:"1.0.0",
            srsName: new OpenLayers.Projection("EPSG:900913"),
        }),stylemap: stylemap
    });

en el navegador genera esta petición:

<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0"     
maxFeatures="100" 
xsi:schemaLocation="http://www.opengis.net/wfs 
http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<wfs:Query typeName="Van263kTweet:vantest" xmlns:Van263kTweet="file:///data/2636k_shp"/>
</wfs:GetFeature>

y la respuesta que recibo es la siguiente:

<?xml version="1.0" encoding="UTF-8"?><wfs:FeatureCollection 
xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs" 
xmlns:gml="http://www.opengis.net/gml" xmlns:Van263kTweet="file:///data/2636k_shp" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="file:///data/2636k_shp http://localhost:8080/geoserver/wfs?
service=WFS&amp;version=1.0.0&amp;request=DescribeFeatureType&amp;
typeName=Van263kTweet%3Avantest http://www.opengis.net/wfs 
http://localhost:8080/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd">
<gml:boundedBy>
    <gml:null>unknown</gml:null>
</gml:boundedBy>
<gml:featureMember>
    <Van263kTweet:vantest fid="vantest.1">
        <Van263kTweet:the_geom>
            <gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
                <gml:coordinates xmlns:gml="http://www.opengis.net/gml" 
                    decimal="." cs="," ts=" ">
                        -123.12660112,49.28351467
                </gml:coordinates>
            </gml:Point>
        </Van263kTweet:the_geom>
        <Van263kTweet:id>
            1
        </Van263kTweet:id>
    </Van263kTweet:vantest>
</gml:featureMember>
</wfs:FeatureCollection>

Entonces, como estoy generando el javascript está generando la solicitud y la respuesta devuelve GML, ¿por qué openlayers no está mostrando los datos? He probado casi todo lo que se me ocurre y se me acaban las ideas (cambiar el SRS, comprobar el espacio de nombres, leer los archivos de registro del geoservidor, usar diferentes versiones de WFS...).

el archivo html completo en el que se basa la página es el siguiente

var map;

    // prepare to style the data
    stylemap = new OpenLayers.StyleMap({
      'strokeWidth': 11,
      'strokeColor': '#ff0000'
    });

    map = new OpenLayers.Map('map-id', {projection: "EPSG:900913"});
    osm = new OpenLayers.Layer.OSM( "Simple OSM Map");

    var wfs = new OpenLayers.Layer.Vector("WFS", 
    {
        strategies: [new OpenLayers.Strategy.Fixed()],
        protocol: new OpenLayers.Protocol.WFS(
        {
            url: "http://localhost:8080/geoserver/wfs",
            featurePrefix:"Van263kTweet",
            featureType: "vantest",
            featureNS: "file:///data/2636k_shp",
            maxFeatures: 100,
            geometryName: "the_geom",
            //featurePrefix: "",
            version:"1.0.0",
            srsName: new OpenLayers.Projection("EPSG:900913"),
        }),stylemap: stylemap
    });

    map.addLayers([osm, wfs]);     

    //set the map extent to vancouver on load
    var proj = new OpenLayers.Projection("EPSG:4326");
    var point1 = new OpenLayers.LonLat(-123.312607,49.065769);
    var point2 = new OpenLayers.LonLat(-122.424088,49.390418);
    point1.transform(proj, map.getProjectionObject());
    point2.transform(proj, map.getProjectionObject());

    //zoom/pan controls
    map.addControl(new OpenLayers.Control.PanZoomBar({
                position: new OpenLayers.Pixel(2, 15)
            }));
            map.addControl(new OpenLayers.Control.Navigation());

    //set default extent
    map.zoomToExtent([point1.lon,point1.lat,point2.lon,point2.lat]);
        //If provided as an array, the array should consist of four values 
        (left, bottom, right, top).

1voto

Adam Ernst Puntos 6939

Sus datos aparecen como 4326 (lonlat) y no como 900913, así que algo está mal en la solicitud, probablemente porque no se menciona una proyección. Intente utilizar la cadena epsg:900913 en lugar del objeto de proyección.

Técnicamente deberías usar también la versión 1.1.0 para que la reproyección funcione (pero GeoServer es indulgente así que estarás bien con la 1.0).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X