diff --git a/src/ol/format/gmlformat.js b/src/ol/format/gmlformat.js index d0402222cc..21c102646a 100644 --- a/src/ol/format/gmlformat.js +++ b/src/ol/format/gmlformat.js @@ -1008,6 +1008,13 @@ ol.format.GML.writePos_ = function(node, value, objectStack) { * @private */ ol.format.GML.writePosList_ = function(node, value, objectStack) { + 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(); + } // only 2d for simple features profile var points = value.getCoordinates(); var len = points.length; @@ -1015,8 +1022,11 @@ ol.format.GML.writePosList_ = function(node, value, objectStack) { var point; for (var i = 0; i < len; ++i) { point = points[i]; - // TODO axis orientation - parts[i] = point[0] + ' ' + point[1]; + if (axisOrientation === 'enu') { + parts[i] = point[0] + ' ' + point[1]; + } else { + parts[i] = point[1] + ' ' + point[0]; + } } ol.format.XSD.writeStringTextNode(node, parts.join(' ')); }; @@ -1088,7 +1098,8 @@ ol.format.GML.writeLineString_ = 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.POSLIST_NODE_FACTORY_, [geometry], []); }; diff --git a/test/spec/ol/format/gmlformat.test.js b/test/spec/ol/format/gmlformat.test.js index c974ef2276..37039947e8 100644 --- a/test/spec/ol/format/gmlformat.test.js +++ b/test/spec/ol/format/gmlformat.test.js @@ -53,16 +53,22 @@ describe('ol.format.GML', function() { describe('axis order', function() { - it('can read a linestring geometry with correct axis order', function() { - var text = - '' + - ' -90 -180 90 180' + - ''; - var g = readGeometry(format, text); - expect(g).to.be.an(ol.geom.LineString); - expect(g.getCoordinates()).to.eql([[-180, -90, 0], [180, 90, 0]]); - }); + it('can read and write a linestring geometry with ' + + 'correct axis order', function() { + var text = + '' + + ' -90 -180 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.LineString); + expect(g.getCoordinates()).to.eql([[-180, -90, 0], [180, 90, 0]]); + var serialized = format.writeGeometry(g); + expect(serialized.firstElementChild).to.xmleql(ol.xml.load(text)); + }); it('can read a point geometry with correct axis order', function() { var text =