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 --> +