Fix srsDimension read on GML3 for Geoserver
Contrary to Mapserver, Geoserver sets the srsDimension attribute on the child of the geometry node, not on the points list. This fix searches that node as well. A small unit test was also added.
This commit is contained in:
@@ -345,7 +345,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);
|
||||
@@ -360,8 +360,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 = [];
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -1466,4 +1466,35 @@ describe('ol.format.GML3', function() {
|
||||
|
||||
});
|
||||
|
||||
describe('when parsing srsDimension from WFS (Geoserver)', function() {
|
||||
|
||||
var features, feature;
|
||||
before(function(done) {
|
||||
afterLoadText('spec/ol/format/gml/geoserverFeatures.xml', function(xml) {
|
||||
try {
|
||||
var config = {
|
||||
'featureNS': 'http://www.openplans.org/topp',
|
||||
'featureType': 'states'
|
||||
};
|
||||
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 polygon for Illinois', function() {
|
||||
feature = features[0];
|
||||
expect(feature.getId()).to.equal('states.1');
|
||||
expect(feature.get('STATE_NAME')).to.equal('Illinois');
|
||||
expect(feature.getGeometry()).to.be.an(ol.geom.MultiPolygon);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns:cite="http://www.opengeospatial.net/cite" xmlns:gml="http://www.opengis.net/gml" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" numberOfFeatures="8" timeStamp="2017-08-14T13:29:50.356Z" xsi:schemaLocation="http://www.opengeospatial.net/cite http://localhost:8080/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=cite%3Ageoserver_layer http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd">
|
||||
<gml:featureMembers>
|
||||
<cite:geoserver_layer gml:id="geoserver_layer.3">
|
||||
<cite:geom>
|
||||
<gml:LineString srsName="urn:x-ogc:def:crs:EPSG:4326" srsDimension="3">
|
||||
<gml:posList>51.91122415 4.46386854 46.04679351 51.91120839 4.46382399 46.04679382 51.91122877 4.46383897 46.04679306 51.91123013 4.46385411 46.04679315 51.91123016 4.46386244 46.04679328</gml:posList>
|
||||
</gml:LineString>
|
||||
</cite:geom>
|
||||
</cite:geoserver_layer>
|
||||
<cite:geoserver_layer gml:id="geoserver_layer.6">
|
||||
<cite:geom>
|
||||
<gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326" srsDimension="3">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>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</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</cite:geom>
|
||||
</cite:geoserver_layer>
|
||||
<cite:geoserver_layer gml:id="geoserver_layer.7">
|
||||
<cite:geom>
|
||||
<gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326" srsDimension="3">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>51.91123321 4.46384921 46.04679306 51.91123242 4.46381475 46.0467932 51.91122926 4.46381494 46.04679323 51.91123004 4.4638494 46.04679309 51.91123321 4.46384921 46.04679306</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</cite:geom>
|
||||
</cite:geoserver_layer>
|
||||
<cite:geoserver_layer gml:id="geoserver_layer.9">
|
||||
<cite:geom>
|
||||
<gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326" srsDimension="3">
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>51.91123372 4.46388232 46.04679377 51.91122788 4.46388684 46.04679399 51.91123214 4.46390122 46.04679455 51.91123798 4.4638967 46.04679433 51.91123372 4.46388232 46.04679377</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</cite:geom>
|
||||
</cite:geoserver_layer>
|
||||
<cite:geoserver_layer gml:id="geoserver_layer.11">
|
||||
<cite:geom>
|
||||
<gml:LineString srsName="urn:x-ogc:def:crs:EPSG:4326" srsDimension="3">
|
||||
<gml:posList>51.91117684 4.46386436 46.06565659 51.91115683 4.46386502 46.0656567</gml:posList>
|
||||
</gml:LineString>
|
||||
</cite:geom>
|
||||
</cite:geoserver_layer>
|
||||
<cite:geoserver_layer gml:id="geoserver_layer.12">
|
||||
<cite:geom>
|
||||
<gml:LineString srsName="urn:x-ogc:def:crs:EPSG:4326" srsDimension="3">
|
||||
<gml:posList>51.91117878 4.46385015 46.06636351 51.91115877 4.46385081 46.06636361</gml:posList>
|
||||
</gml:LineString>
|
||||
</cite:geom>
|
||||
</cite:geoserver_layer>
|
||||
<cite:geoserver_layer gml:id="geoserver_layer.13">
|
||||
<cite:geom>
|
||||
<gml:LineString srsName="urn:x-ogc:def:crs:EPSG:4326" srsDimension="3">
|
||||
<gml:posList>51.91121687 4.46390244 46.08019498 51.91119686 4.4639031 46.08019509</gml:posList>
|
||||
</gml:LineString>
|
||||
</cite:geom>
|
||||
</cite:geoserver_layer>
|
||||
<cite:geoserver_layer gml:id="geoserver_layer.14">
|
||||
<cite:geom>
|
||||
<gml:Point srsName="urn:x-ogc:def:crs:EPSG:4326" srsDimension="3">
|
||||
<gml:pos>51.91125849 4.46383715 46.04679348</gml:pos>
|
||||
</gml:Point>
|
||||
</cite:geom>
|
||||
</cite:geoserver_layer>
|
||||
</gml:featureMembers>
|
||||
</wfs:FeatureCollection>
|
||||
Reference in New Issue
Block a user