From fa90a428069161556b852122b8fce2a30dc92d6a Mon Sep 17 00:00:00 2001 From: ahocevar Date: Thu, 14 Jun 2012 12:34:45 +0200 Subject: [PATCH] Respect the srsDimension attribute. This also fixes http://trac.osgeo.org/openlayers/ticket/2762. Note: it seems there is no "dimension" attribute for posList in the spec. This attribute name is only used in some examples of the GML 3.1 specification, but it is not mentioned in any of the XSDs. --- lib/OpenLayers/Format/GML/Base.js | 18 +++++++++++++++++- lib/OpenLayers/Format/GML/v3.js | 6 +++++- tests/Format/GML/cases.js | 11 ++++++++--- tests/Format/GML/v3.html | 9 +++++++-- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/lib/OpenLayers/Format/GML/Base.js b/lib/OpenLayers/Format/GML/Base.js index b7608e354e..2b23d27540 100644 --- a/lib/OpenLayers/Format/GML/Base.js +++ b/lib/OpenLayers/Format/GML/Base.js @@ -230,7 +230,7 @@ OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, { } return OpenLayers.Format.XML.prototype.readNode.apply(this, [node, obj]); }, - + /** * Property: readers * Contains public functions, grouped by namespace prefix, that will @@ -241,6 +241,15 @@ OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, { */ readers: { "gml": { + // Part of the v3 spec, but defined here for common readers. + // Read-only for now. + "_srsReferenceGroup": function(node, obj, container) { + var dim = parseInt(node.getAttribute("srsDimension"), 10) || + (container && container.srsDimension); + if (dim) { + obj.srsDimension = dim; + } + }, "featureMember": function(node, obj) { this.readChildNodes(node, obj); }, @@ -309,6 +318,7 @@ OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, { }, "MultiPoint": function(node, container) { var obj = {components: []}; + this.readers.gml._srsReferenceGroup.apply(this, [node, obj, container]); this.readChildNodes(node, obj); container.components = [ new OpenLayers.Geometry.MultiPoint(obj.components) @@ -319,6 +329,7 @@ OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, { }, "LineString": function(node, container) { var obj = {}; + this.readers.gml._srsReferenceGroup.apply(this, [node, obj, container]); this.readChildNodes(node, obj); if(!container.components) { container.components = []; @@ -329,6 +340,7 @@ OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, { }, "MultiLineString": function(node, container) { var obj = {components: []}; + this.readers.gml._srsReferenceGroup.apply(this, [node, obj, container]); this.readChildNodes(node, obj); container.components = [ new OpenLayers.Geometry.MultiLineString(obj.components) @@ -339,6 +351,7 @@ OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, { }, "Polygon": function(node, container) { var obj = {outer: null, inner: []}; + this.readers.gml._srsReferenceGroup.apply(this, [node, obj, container]); this.readChildNodes(node, obj); obj.inner.unshift(obj.outer); if(!container.components) { @@ -350,6 +363,7 @@ OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, { }, "LinearRing": function(node, obj) { var container = {}; + this.readers.gml._srsReferenceGroup.apply(this, [node, container]); this.readChildNodes(node, container); obj.components = [new OpenLayers.Geometry.LinearRing( container.points @@ -357,6 +371,7 @@ OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, { }, "MultiPolygon": function(node, container) { var obj = {components: []}; + this.readers.gml._srsReferenceGroup.apply(this, [node, obj, container]); this.readChildNodes(node, obj); container.components = [ new OpenLayers.Geometry.MultiPolygon(obj.components) @@ -367,6 +382,7 @@ OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, { }, "GeometryCollection": function(node, container) { var obj = {components: []}; + this.readers.gml._srsReferenceGroup.apply(this, [node, obj, container]); this.readChildNodes(node, obj); container.components = [ new OpenLayers.Geometry.Collection(obj.components) diff --git a/lib/OpenLayers/Format/GML/v3.js b/lib/OpenLayers/Format/GML/v3.js index 5be52970f9..c1f0945acd 100644 --- a/lib/OpenLayers/Format/GML/v3.js +++ b/lib/OpenLayers/Format/GML/v3.js @@ -95,6 +95,7 @@ OpenLayers.Format.GML.v3 = OpenLayers.Class(OpenLayers.Format.GML.Base, { }, "Curve": function(node, container) { var obj = {points: []}; + this.readers.gml._srsReferenceGroup.apply(this, [node, obj, container]); this.readChildNodes(node, obj); if(!container.components) { container.components = []; @@ -135,7 +136,8 @@ OpenLayers.Format.GML.v3 = OpenLayers.Class(OpenLayers.Format.GML.Base, { this.regExes.trimSpace, "" ); var coords = str.split(this.regExes.splitSpace); - var dim = parseInt(node.getAttribute("dimension")) || 2; + var dim = obj.srsDimension || + parseInt(node.getAttribute("dimension") || node.getAttribute("srsDimension"), 10) || 2; var j, x, y, z; var numPoints = coords.length / dim; var points = new Array(numPoints); @@ -172,6 +174,7 @@ OpenLayers.Format.GML.v3 = OpenLayers.Class(OpenLayers.Format.GML.Base, { }, "MultiCurve": function(node, container) { var obj = {components: []}; + this.readers.gml._srsReferenceGroup.apply(this, [node, obj, container]); this.readChildNodes(node, obj); if(obj.components.length > 0) { container.components = [ @@ -184,6 +187,7 @@ OpenLayers.Format.GML.v3 = OpenLayers.Class(OpenLayers.Format.GML.Base, { }, "MultiSurface": function(node, container) { var obj = {components: []}; + this.readers.gml._srsReferenceGroup.apply(this, [node, obj, container]); this.readChildNodes(node, obj); if(obj.components.length > 0) { container.components = [ diff --git a/tests/Format/GML/cases.js b/tests/Format/GML/cases.js index 258c570416..88499cdc3d 100644 --- a/tests/Format/GML/cases.js +++ b/tests/Format/GML/cases.js @@ -198,14 +198,19 @@ var cases = { ]) ]) ]), - + "v2/box-coord.xml": new OpenLayers.Bounds(1, 2, 3, 4), - "v2/box-coordinates.xml": new OpenLayers.Bounds(1, 2, 3, 4) + "v2/box-coordinates.xml": new OpenLayers.Bounds(1, 2, 3, 4), + + "v3/linestring3d.xml": new OpenLayers.Geometry.LineString([ + new OpenLayers.Geometry.Point(1, 2, 3), + new OpenLayers.Geometry.Point(4, 5, 6) + ]) }; -// cases for v3 use the same geometries +// some cases for v3 use the same geometries OpenLayers.Util.extend(cases, { "v3/point.xml": cases["v2/point-coordinates.xml"], "v3/linestring.xml": cases["v2/linestring-coordinates.xml"], diff --git a/tests/Format/GML/v3.html b/tests/Format/GML/v3.html index 9e6c5b8482..92f2154917 100644 --- a/tests/Format/GML/v3.html +++ b/tests/Format/GML/v3.html @@ -10,8 +10,8 @@ "v2/linestring-coord.xml", "v2/linestring-coordinates.xml", "v2/multipoint-coord.xml", "v2/multipoint-coordinates.xml", "v2/multilinestring-coord.xml", "v2/multilinestring-coordinates.xml", - "v3/point.xml", "v3/linestring.xml", "v3/curve.xml", - "v3/polygon.xml", "v3/surface.xml", + "v3/point.xml", "v3/linestring.xml", "v3/linestring3d.xml", + "v3/curve.xml", "v3/polygon.xml", "v3/surface.xml", "v3/multipoint-singular.xml", "v3/multipoint-plural.xml", "v3/multilinestring-singular.xml", "v3/multilinestring-plural.xml", "v3/multicurve-singular.xml", "v3/multicurve-curve.xml", @@ -332,6 +332,11 @@ 1 2 3 4 --> +