From 5240929a534391a052b862492115bb8168eae2e2 Mon Sep 17 00:00:00 2001 From: Bart van den Eijnden Date: Wed, 26 Feb 2014 17:37:16 +0100 Subject: [PATCH] Correct axis order for gml:pos --- src/ol/format/gmlformat.js | 27 +++++++++++++++++++------- test/spec/ol/format/gmlformat.test.js | 28 ++++++++++++++++----------- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/ol/format/gmlformat.js b/src/ol/format/gmlformat.js index 21c102646a..0817d2cbca 100644 --- a/src/ol/format/gmlformat.js +++ b/src/ol/format/gmlformat.js @@ -694,7 +694,7 @@ ol.format.GML.readFlatPosList_ = function(node, objectStack) { x = parseFloat(coords[i]); y = parseFloat(coords[i + 1]); z = (dim === 3) ? parseFloat(coords[i + 2]) : 0; - if (axisOrientation === 'enu') { + if (axisOrientation.substr(0, 2) === 'en') { flatCoordinates.push(x, y, z); } else { flatCoordinates.push(y, x, z); @@ -994,10 +994,22 @@ ol.format.GML.prototype.readFeaturesFromNode = function(node) { * @private */ ol.format.GML.writePos_ = function(node, value, objectStack) { - var layout = value.getLayout(); - node.setAttribute('srsDimension', - (layout == ol.geom.GeometryLayout.XYZ) ? '3' : '2'); - ol.format.XSD.writeStringTextNode(node, value.getCoordinates().join(' ')); + var context = objectStack[objectStack.length - 1]; + goog.asserts.assert(goog.isObject(context)); + var srsName = goog.object.get(context, 'srsName'); + var axisOrientation = 'enu'; + if (goog.isDefAndNotNull(srsName)) { + axisOrientation = ol.proj.get(srsName).getAxisOrientation(); + } + var point = value.getCoordinates(); + var coords; + // only 2d for simple features profile + if (axisOrientation.substr(0, 2) === 'en') { + coords = (point[0] + ' ' + point[1]); + } else { + coords = (point[1] + ' ' + point[0]); + } + ol.format.XSD.writeStringTextNode(node, coords); }; @@ -1022,7 +1034,7 @@ ol.format.GML.writePosList_ = function(node, value, objectStack) { var point; for (var i = 0; i < len; ++i) { point = points[i]; - if (axisOrientation === 'enu') { + if (axisOrientation.substr(0, 2) === 'en') { parts[i] = point[0] + ' ' + point[1]; } else { parts[i] = point[1] + ' ' + point[0]; @@ -1079,7 +1091,8 @@ ol.format.GML.writePoint_ = function(node, geometry, objectStack) { if (goog.isDefAndNotNull(srsName)) { node.setAttribute('srsName', srsName); } - ol.xml.pushSerializeAndPop({node: node}, + var context = {node: node, srsName: srsName}; + ol.xml.pushSerializeAndPop(context, ol.format.GML.FLAT_COORDINATES_SERIALIZERS_, ol.format.GML.POS_NODE_FACTORY_, [geometry], []); }; diff --git a/test/spec/ol/format/gmlformat.test.js b/test/spec/ol/format/gmlformat.test.js index 37039947e8..bf1f6cadae 100644 --- a/test/spec/ol/format/gmlformat.test.js +++ b/test/spec/ol/format/gmlformat.test.js @@ -23,7 +23,7 @@ describe('ol.format.GML', function() { var text = '' + - ' 1 2 0' + + ' 1 2' + ''; var g = readGeometry(format, text); expect(g).to.be.an(ol.geom.Point); @@ -70,16 +70,22 @@ describe('ol.format.GML', function() { expect(serialized.firstElementChild).to.xmleql(ol.xml.load(text)); }); - it('can read a point geometry with correct axis order', function() { - var text = - '' + - ' -90 -180' + - ''; - var g = readGeometry(format, text); - expect(g).to.be.an(ol.geom.Point); - expect(g.getCoordinates()).to.eql([-180, -90, 0]); - }); + it('can read and write a point geometry with correct axis order', + function() { + var text = + '' + + ' -90 -180' + + ''; + format = new ol.format.GML({ + srsName: 'urn:x-ogc:def:crs:EPSG:4326' + }); + var g = readGeometry(format, text); + expect(g).to.be.an(ol.geom.Point); + expect(g.getCoordinates()).to.eql([-180, -90, 0]); + var serialized = format.writeGeometry(g); + expect(serialized.firstElementChild).to.xmleql(ol.xml.load(text)); + }); it('can read multi surface geometry with right axis order', function() { var text =