KML MultiGeometry may contain other MultiGeometry

As demonstrated in the tests, a MultiGeometry may contain other MultiGeometry nodes.  We can support this with heterogenous GeometryCollection instances - though these are not currently rendered.
This commit is contained in:
Tim Schaub
2013-06-26 12:31:08 -06:00
parent 30d947521d
commit 42aa94de21
3 changed files with 4723 additions and 5 deletions

View File

@@ -184,24 +184,25 @@ ol.parser.KML = function(opt_options) {
var buckets = goog.array.bucket(parts, function(val) {
return val.type;
});
// homogeneous collection
var obj = {};
if (goog.object.getCount(buckets) === 1) {
// homogeneous collection
var type = goog.object.getAnyKey(buckets);
switch (type) {
case ol.geom.GeometryType.POINT:
container.geometry = {
obj.geometry = {
type: ol.geom.GeometryType.MULTIPOINT,
parts: parts
};
break;
case ol.geom.GeometryType.LINESTRING:
container.geometry = {
obj.geometry = {
type: ol.geom.GeometryType.MULTILINESTRING,
parts: parts
};
break;
case ol.geom.GeometryType.POLYGON:
container.geometry = {
obj.geometry = {
type: ol.geom.GeometryType.MULTIPOLYGON,
parts: parts
};
@@ -210,11 +211,18 @@ ol.parser.KML = function(opt_options) {
break;
}
} else {
container.geometry = {
// mixed collection
obj.geometry = {
type: ol.geom.GeometryType.GEOMETRYCOLLECTION,
parts: parts
};
}
if (goog.isArray(container)) {
// MultiGeometry nested inside another
container.push(obj.geometry);
} else {
container.geometry = obj.geometry;
}
},
'Point': function(node, container) {
var coordinates = [];

View File

@@ -238,14 +238,63 @@ describe('ol.parser.kml', function() {
});
});
});
describe('parsing states.kml', function() {
var features;
before(function(done) {
afterLoadXml('spec/ol/parser/kml/states.kml', function(xml) {
var parser = new ol.parser.KML();
var obj;
try {
obj = parser.read(xml);
} catch (err) {
return done(err);
}
if (!obj.features) {
return done(new Error('Failed to parse features from doc'));
}
features = obj.features;
done();
});
});
it('creates 50 features', function() {
expect(features).to.have.length(50);
});
it('creates features with heterogenous geometry collections', function() {
// TODO: decide if we should instead create features with multiple geoms
var feature = features[0];
expect(feature).to.be.a(ol.Feature);
var geometry = feature.getGeometry();
expect(geometry).to.be.a(ol.geom.GeometryCollection);
});
it('parses Point and MultiPolygon for Alaska', function() {
var alaska = goog.array.find(features, function(feature) {
return feature.get('name') === 'Alaska';
});
expect(alaska).to.be.a(ol.Feature);
var geometry = alaska.getGeometry();
expect(geometry).to.be.a(ol.geom.GeometryCollection);
expect(geometry.components).to.have.length(2);
expect(geometry.components[0]).to.be.a(ol.geom.Point);
expect(geometry.components[1]).to.be.a(ol.geom.MultiPolygon);
});
});
});
goog.require('goog.array');
goog.require('goog.dom.xml');
goog.require('ol.Feature');
goog.require('ol.geom.GeometryCollection');
goog.require('ol.geom.LineString');
goog.require('ol.geom.MultiLineString');
goog.require('ol.geom.MultiPolygon');
goog.require('ol.geom.Point');
goog.require('ol.geom.Polygon');
goog.require('ol.parser.KML');

File diff suppressed because one or more lines are too long