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:
@@ -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 = [];
|
||||
|
||||
@@ -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');
|
||||
|
||||
4661
test/spec/ol/parser/kml/states.kml
Normal file
4661
test/spec/ol/parser/kml/states.kml
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user