diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc index 952aeec642..5031d9aad0 100644 --- a/src/objectliterals.jsdoc +++ b/src/objectliterals.jsdoc @@ -538,9 +538,6 @@ * will be automatically configured from the GML. * @property {Array.|string|undefined} featureType The local * (without prefix) feature typeName(s). - * @property {string|undefined} geometryName Name of geometry element. - * Defaults to `geometry`. If null, it will be set on when the - * first geometry is parsed. * @property {boolean|undefined} multiCurve Write gml:MultiCurve instead of * gml:MultiLineString. Since the latter is deprecated in GML 3, the * default is `true`. This only applies to GML version 3. diff --git a/src/ol/parser/ogc/filterparser_v1_0_0.js b/src/ol/parser/ogc/filterparser_v1_0_0.js index b96b1d5552..e9b3a22bac 100644 --- a/src/ol/parser/ogc/filterparser_v1_0_0.js +++ b/src/ol/parser/ogc/filterparser_v1_0_0.js @@ -166,7 +166,7 @@ ol.parser.ogc.Filter_v1_0_0.prototype.writeSpatial_ = function(filter, name) { } else { var child; if (geom !== null) { - child = this.writeNode('_geometry', geom, + child = this.writeNode('_geometry', {value: geom}, this.gml_.featureNS).firstChild; } else if (bbox.length === 4) { child = this.writeNode('Box', bbox, diff --git a/src/ol/parser/ogc/filterparser_v1_1_0.js b/src/ol/parser/ogc/filterparser_v1_1_0.js index a718fa18f3..77423733fa 100644 --- a/src/ol/parser/ogc/filterparser_v1_1_0.js +++ b/src/ol/parser/ogc/filterparser_v1_1_0.js @@ -224,7 +224,7 @@ ol.parser.ogc.Filter_v1_1_0.prototype.writeSpatial_ = function(filter, name) { } else { var child; if (geom !== null) { - child = this.writeNode('_geometry', geom, + child = this.writeNode('_geometry', {value: geom}, this.gml_.featureNS).firstChild; } else if (bbox.length === 4) { child = this.writeNode('Envelope', bbox, diff --git a/src/ol/parser/ogc/gmlparser.js b/src/ol/parser/ogc/gmlparser.js index 872abfe166..088cfe13ac 100644 --- a/src/ol/parser/ogc/gmlparser.js +++ b/src/ol/parser/ogc/gmlparser.js @@ -317,10 +317,10 @@ ol.parser.ogc.GML = function(opt_options) { obj.features.push(feature); }, '_geometry': function(node, obj) { - if (!this.geometryName) { - this.geometryName = node.nodeName.split(':').pop(); - } + var local = node.localName || node.nodeName.split(':').pop(); this.readChildNodes(node, obj); + obj.properties[local] = this.createGeometry({geometry: obj.geometry}); + delete obj.geometry; }, '_attribute': function(node, obj) { var local = node.localName || node.nodeName.split(':').pop(); @@ -387,7 +387,8 @@ ol.parser.ogc.GML = function(opt_options) { }, 'geometryMember': function(geometry) { var node = this.createElementNS('gml:geometryMember'); - var child = this.writeNode('_geometry', geometry, this.featureNS); + var child = this.writeNode('_geometry', {value: geometry}, + this.featureNS); node.appendChild(child.firstChild); return node; } @@ -418,23 +419,25 @@ ol.parser.ogc.GML = function(opt_options) { if (goog.isDef(fid)) { this.setAttributeNS(node, this.defaultNamespaceURI, 'fid', fid); } - if (feature.getGeometry() !== null) { - this.writeNode('_geometry', feature.getGeometry(), this.featureNS, - node); - } - var attributes = feature.getAttributes(true); + var attributes = feature.getAttributes(); for (var name in attributes) { var value = attributes[name]; if (goog.isDefAndNotNull(value)) { - this.writeNode('_attribute', {name: name, value: value}, - this.featureNS, node); + if (value instanceof ol.geom.Geometry) { + this.writeNode('_geometry', {name: name, value: value}, + this.featureNS, node); + } else { + this.writeNode('_attribute', {name: name, value: value}, + this.featureNS, node); + } } } return node; }, - '_geometry': function(geometry) { - var node = this.createElementNS('feature:' + this.geometryName, + '_geometry': function(obj) { + var node = this.createElementNS('feature:' + obj.name, this.featureNS); + var geometry = obj.value; var type = geometry.getType(), child; if (type === ol.geom.GeometryType.POINT) { child = this.writeNode('Point', geometry, null, node); diff --git a/src/ol/parser/ogc/gmlparser_v3.js b/src/ol/parser/ogc/gmlparser_v3.js index 47f06f9531..d32ef5b78f 100644 --- a/src/ol/parser/ogc/gmlparser_v3.js +++ b/src/ol/parser/ogc/gmlparser_v3.js @@ -22,9 +22,10 @@ ol.parser.ogc.GML_v3 = function(opt_options) { 'http://schemas.opengis.net/gml/3.1.1/profiles/gmlsfProfile/' + '1.0.0/gmlsf.xsd'; goog.base(this, opt_options); - this.featureNSWiters_['_geometry'] = function(geometry) { - var node = this.createElementNS('feature:' + this.geometryName, + this.featureNSWiters_['_geometry'] = function(obj) { + var node = this.createElementNS('feature:' + obj.name, this.featureNS); + var geometry = obj.value; var type = geometry.getType(), child; if (type === ol.geom.GeometryType.POINT) { child = this.writeNode('Point', geometry, null, node); diff --git a/test/spec/ol/parser/ogc/gml_v2.test.js b/test/spec/ol/parser/ogc/gml_v2.test.js index a52dd35137..e482df3d19 100644 --- a/test/spec/ol/parser/ogc/gml_v2.test.js +++ b/test/spec/ol/parser/ogc/gml_v2.test.js @@ -21,7 +21,7 @@ describe('ol.parser.gml_v2', function() { parser.applyWriteOptions(obj); var geom = parser.createGeometry({geometry: obj.geometry}); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); @@ -50,7 +50,7 @@ describe('ol.parser.gml_v2', function() { var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); @@ -80,7 +80,7 @@ describe('ol.parser.gml_v2', function() { var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); @@ -109,7 +109,7 @@ describe('ol.parser.gml_v2', function() { var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); @@ -144,7 +144,7 @@ describe('ol.parser.gml_v2', function() { var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); @@ -169,7 +169,7 @@ describe('ol.parser.gml_v2', function() { var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); @@ -188,7 +188,7 @@ describe('ol.parser.gml_v2', function() { var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj); var node = p.featureNSWiters_['_geometry'].apply(p, - [geom]).firstChild; + [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml); @@ -233,7 +233,7 @@ describe('ol.parser.gml_v2', function() { var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); diff --git a/test/spec/ol/parser/ogc/gml_v3.test.js b/test/spec/ol/parser/ogc/gml_v3.test.js index 8914059975..e99089d047 100644 --- a/test/spec/ol/parser/ogc/gml_v3.test.js +++ b/test/spec/ol/parser/ogc/gml_v3.test.js @@ -20,7 +20,7 @@ describe('ol.parser.gml_v3', function() { var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); @@ -37,7 +37,7 @@ describe('ol.parser.gml_v3', function() { var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); @@ -64,7 +64,7 @@ describe('ol.parser.gml_v3', function() { var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj); var node = p.featureNSWiters_['_geometry'].apply(p, - [geom]).firstChild; + [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml); @@ -92,7 +92,7 @@ describe('ol.parser.gml_v3', function() { var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj); var node = p.featureNSWiters_['_geometry'].apply(p, - [geom]).firstChild; + [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml); @@ -109,7 +109,7 @@ describe('ol.parser.gml_v3', function() { var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); @@ -128,7 +128,7 @@ describe('ol.parser.gml_v3', function() { var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj); var node = p.featureNSWiters_['_geometry'].apply(p, - [geom]).firstChild; + [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml); @@ -157,7 +157,7 @@ describe('ol.parser.gml_v3', function() { var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); @@ -186,7 +186,7 @@ describe('ol.parser.gml_v3', function() { var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj); var node = p.featureNSWiters_['_geometry'].apply(p, - [geom]).firstChild; + [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml); @@ -213,7 +213,7 @@ describe('ol.parser.gml_v3', function() { var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); @@ -231,7 +231,7 @@ describe('ol.parser.gml_v3', function() { var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj); var node = p.featureNSWiters_['_geometry'].apply(p, - [geom]).firstChild; + [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml); @@ -248,7 +248,7 @@ describe('ol.parser.gml_v3', function() { var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); @@ -264,7 +264,7 @@ describe('ol.parser.gml_v3', function() { var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); var node = parser.featureNSWiters_['_geometry'].apply(parser, - [geom]).firstChild; + [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml); @@ -280,7 +280,7 @@ describe('ol.parser.gml_v3', function() { var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj, {srsName: 'foo'}); var node = p.featureNSWiters_['_geometry'].apply(p, - [geom]).firstChild; + [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml); @@ -300,7 +300,6 @@ describe('ol.parser.gml_v3', function() { var obj = p.read(xml); var output = p.write(obj); expect(goog.dom.xml.loadXml(output)).to.xmleql(xml); - expect(p.geometryName).to.eql('the_geom'); expect(obj.features.length).to.eql(10); var feature = obj.features[0]; expect(feature.getGeometry() instanceof @@ -373,10 +372,21 @@ describe('ol.parser.gml_v3', function() { done(); }); }); + it('More than one geometry', function(done) { + var url = 'spec/ol/parser/ogc/xml/gml_v3/more-geoms.xml'; + afterLoadXml(url, function(xml) { + var obj = parser.read(xml); + var feature = obj.features[0]; + expect(feature.get('center')).to.be.a(ol.geom.Point); + expect(feature.get('the_geom')).to.be.a(ol.geom.MultiPolygon); + done(); + }); + }); }); }); goog.require('goog.dom.xml'); +goog.require('ol.geom.Point'); goog.require('ol.geom.MultiPolygon'); goog.require('ol.parser.ogc.GML_v3'); goog.require('ol.proj'); diff --git a/test/spec/ol/parser/ogc/xml/gml_v3/more-geoms.xml b/test/spec/ol/parser/ogc/xml/gml_v3/more-geoms.xml new file mode 100644 index 0000000000..b0fa5c5a8e --- /dev/null +++ b/test/spec/ol/parser/ogc/xml/gml_v3/more-geoms.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + 42.397027571297585 -122.88465674265922 42.39702893980587 -122.88509730796012 42.397029086785146 -122.88511582432085 42.39702379767053 -122.88528111596624 42.39748517484964 -122.88529300380065 42.39748473847452 -122.88509914138723 42.39748482219041 -122.8849959517568 42.397485082635576 -122.8846741899541 42.3974853307826 -122.88436529392652 42.39702663751206 -122.88435664014142 42.397027571297585 -122.88465674265922 + + + + + + + + + 1 2 + + + 1 + YES + I-L + 2004-04-12T00:00:00-06:00 + + + 0.95741118624 + + 835.705330224 + 835.705330224 + 41704.8312728 + 835.705330224 + 41704.8312728 + 0.38745056079 + + +