Merge pull request #1294 from bartvde/gmlgeom
GML parser should write out all geometry attributes and respect their names (r=@ahocevar)
This commit is contained in:
@@ -538,9 +538,6 @@
|
||||
* will be automatically configured from the GML.
|
||||
* @property {Array.<string>|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 <read> 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.
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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');
|
||||
|
||||
47
test/spec/ol/parser/ogc/xml/gml_v3/more-geoms.xml
Normal file
47
test/spec/ol/parser/ogc/xml/gml_v3/more-geoms.xml
Normal file
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wfs:FeatureCollection numberOfFeatures="1" timeStamp="2010-01-29T15:10:38.921-07:00"
|
||||
xsi:schemaLocation="http://medford.opengeo.org http://localhost:8080/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=medford%3Azoning http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd"
|
||||
xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:wfs="http://www.opengis.net/wfs"
|
||||
xmlns:medford="http://opengeo.org/#medford"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:ows="http://www.opengis.net/ows"
|
||||
xmlns:gml="http://www.opengis.net/gml"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<gml:featureMembers>
|
||||
<medford:zoning gml:id="zoning.1">
|
||||
<medford:the_geom>
|
||||
<gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:surfaceMember>
|
||||
<gml:Polygon>
|
||||
<gml:exterior>
|
||||
<gml:LinearRing>
|
||||
<gml:posList>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</gml:posList>
|
||||
</gml:LinearRing>
|
||||
</gml:exterior>
|
||||
</gml:Polygon>
|
||||
</gml:surfaceMember>
|
||||
</gml:MultiSurface>
|
||||
</medford:the_geom>
|
||||
<medford:center>
|
||||
<gml:Point srsName="urn:x-ogc:def:crs:EPSG:4326">
|
||||
<gml:pos>1 2</gml:pos>
|
||||
</gml:Point>
|
||||
</medford:center>
|
||||
<medford:objectid>1</medford:objectid>
|
||||
<medford:cityzone>YES</medford:cityzone>
|
||||
<medford:zoning>I-L</medford:zoning>
|
||||
<medford:revdate>2004-04-12T00:00:00-06:00</medford:revdate>
|
||||
<medford:finord></medford:finord>
|
||||
<medford:filenum></medford:filenum>
|
||||
<medford:acres>0.95741118624</medford:acres>
|
||||
<medford:misc></medford:misc>
|
||||
<medford:shape_leng>835.705330224</medford:shape_leng>
|
||||
<medford:perimeter>835.705330224</medford:perimeter>
|
||||
<medford:area>41704.8312728</medford:area>
|
||||
<medford:shape_le_1>835.705330224</medford:shape_le_1>
|
||||
<medford:shape_area>41704.8312728</medford:shape_area>
|
||||
<medford:hectares>0.38745056079</medford:hectares>
|
||||
</medford:zoning>
|
||||
</gml:featureMembers>
|
||||
</wfs:FeatureCollection>
|
||||
Reference in New Issue
Block a user