diff --git a/src/ol/format/gml3.js b/src/ol/format/gml3.js index 3c9c955763..85eef013fd 100644 --- a/src/ol/format/gml3.js +++ b/src/ol/format/gml3.js @@ -352,7 +352,7 @@ ol.format.GML3.prototype.readFlatPosList_ = function(node, objectStack) { var s = ol.xml.getAllTextContent(node, false).replace(/^\s*|\s*$/g, ''); var context = objectStack[0]; var containerSrs = context['srsName']; - var containerDimension = node.parentNode.getAttribute('srsDimension'); + var contextDimension = context['srsDimension']; var axisOrientation = 'enu'; if (containerSrs) { var proj = ol.proj.get(containerSrs); @@ -367,8 +367,11 @@ ol.format.GML3.prototype.readFlatPosList_ = function(node, objectStack) { } else if (node.getAttribute('dimension')) { dim = ol.format.XSD.readNonNegativeIntegerString( node.getAttribute('dimension')); - } else if (containerDimension) { - dim = ol.format.XSD.readNonNegativeIntegerString(containerDimension); + } else if (node.parentNode.getAttribute('srsDimension')) { + dim = ol.format.XSD.readNonNegativeIntegerString( + node.parentNode.getAttribute('srsDimension')); + } else if (contextDimension) { + dim = ol.format.XSD.readNonNegativeIntegerString(contextDimension); } var x, y, z; var flatCoordinates = []; diff --git a/src/ol/format/gmlbase.js b/src/ol/format/gmlbase.js index 1371ffa453..2d68b65aa7 100644 --- a/src/ol/format/gmlbase.js +++ b/src/ol/format/gmlbase.js @@ -198,6 +198,7 @@ ol.format.GMLBase.prototype.readFeaturesInternal = function(node, objectStack) { ol.format.GMLBase.prototype.readGeometryElement = function(node, objectStack) { var context = /** @type {Object} */ (objectStack[0]); context['srsName'] = node.firstElementChild.getAttribute('srsName'); + context['srsDimension'] = node.firstElementChild.getAttribute('srsDimension'); /** @type {ol.geom.Geometry} */ var geometry = ol.xml.pushParseAndPop(null, this.GEOMETRY_PARSERS_, node, objectStack, this); diff --git a/test/spec/ol/format/gml.test.js b/test/spec/ol/format/gml.test.js index 154e2b194b..1e9eb6595a 100644 --- a/test/spec/ol/format/gml.test.js +++ b/test/spec/ol/format/gml.test.js @@ -1467,4 +1467,75 @@ describe('ol.format.GML3', function() { }); + describe('when parsing srsDimension from WFS (Geoserver)', function() { + + var features, feature; + before(function(done) { + afterLoadText('spec/ol/format/gml/geoserver3DFeatures.xml', + function(xml) { + try { + var config = { + 'featureNS': 'http://www.opengeospatial.net/cite', + 'featureType': 'geoserver_layer' + }; + features = new ol.format.GML(config).readFeatures(xml); + } catch (e) { + done(e); + } + done(); + }); + }); + + it('creates 3 features', function() { + expect(features).to.have.length(3); + }); + + it('creates a LineString', function() { + feature = features[0]; + expect(feature.getId()).to.equal('geoserver_layer.1'); + expect(feature.getGeometry()).to.be.an(ol.geom.LineString); + }); + + it('creates a Polygon', function() { + feature = features[1]; + expect(feature.getId()).to.equal('geoserver_layer.2'); + expect(feature.getGeometry()).to.be.an(ol.geom.Polygon); + }); + + it('creates a Point', function() { + feature = features[2]; + expect(feature.getId()).to.equal('geoserver_layer.3'); + expect(feature.getGeometry()).to.be.an(ol.geom.Point); + }); + + + it('creates 3D Features with the expected geometries', function() { + var expectedGeometry1 = [ + 4.46386854, 51.91122415, 46.04679351, + 4.46382399, 51.91120839, 46.04679382 + ]; + var expectedGeometry2 = [ + 4.46385491, 51.91119276, 46.06074531, + 4.4638264, 51.91118582, 46.06074609, + 4.46380612, 51.91121772, 46.06074168, + 4.46383463, 51.91122465, 46.06074089, + 4.46385491, 51.91119276, 46.06074531 + ]; + var expectedGeometry3 = [ + 4.46383715, 51.91125849, 46.04679348 + ]; + + feature = features[0]; + expect(feature.getGeometry().getFlatCoordinates()) + .to.eql(expectedGeometry1); + feature = features[1]; + expect(feature.getGeometry().getFlatCoordinates()) + .to.eql(expectedGeometry2); + feature = features[2]; + expect(feature.getGeometry().getFlatCoordinates()) + .to.eql(expectedGeometry3); + }); + + }); + }); diff --git a/test/spec/ol/format/gml/geoserver3DFeatures.xml b/test/spec/ol/format/gml/geoserver3DFeatures.xml new file mode 100644 index 0000000000..0848e5c27d --- /dev/null +++ b/test/spec/ol/format/gml/geoserver3DFeatures.xml @@ -0,0 +1,33 @@ + + + + + + + 51.91122415 4.46386854 46.04679351 51.91120839 4.46382399 46.04679382 + + + + + + + + + + + 51.91119276 4.46385491 46.06074531 51.91118582 4.4638264 46.06074609 51.91121772 4.46380612 46.06074168 51.91122465 4.46383463 46.06074089 51.91119276 4.46385491 46.06074531 + + + + + + + + + + 51.91125849 4.46383715 46.04679348 + + + + +