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&version=1.0.0&request=DescribeFeatureType&
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).