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) {
|
var buckets = goog.array.bucket(parts, function(val) {
|
||||||
return val.type;
|
return val.type;
|
||||||
});
|
});
|
||||||
// homogeneous collection
|
var obj = {};
|
||||||
if (goog.object.getCount(buckets) === 1) {
|
if (goog.object.getCount(buckets) === 1) {
|
||||||
|
// homogeneous collection
|
||||||
var type = goog.object.getAnyKey(buckets);
|
var type = goog.object.getAnyKey(buckets);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ol.geom.GeometryType.POINT:
|
case ol.geom.GeometryType.POINT:
|
||||||
container.geometry = {
|
obj.geometry = {
|
||||||
type: ol.geom.GeometryType.MULTIPOINT,
|
type: ol.geom.GeometryType.MULTIPOINT,
|
||||||
parts: parts
|
parts: parts
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
case ol.geom.GeometryType.LINESTRING:
|
case ol.geom.GeometryType.LINESTRING:
|
||||||
container.geometry = {
|
obj.geometry = {
|
||||||
type: ol.geom.GeometryType.MULTILINESTRING,
|
type: ol.geom.GeometryType.MULTILINESTRING,
|
||||||
parts: parts
|
parts: parts
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
case ol.geom.GeometryType.POLYGON:
|
case ol.geom.GeometryType.POLYGON:
|
||||||
container.geometry = {
|
obj.geometry = {
|
||||||
type: ol.geom.GeometryType.MULTIPOLYGON,
|
type: ol.geom.GeometryType.MULTIPOLYGON,
|
||||||
parts: parts
|
parts: parts
|
||||||
};
|
};
|
||||||
@@ -210,11 +211,18 @@ ol.parser.KML = function(opt_options) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
container.geometry = {
|
// mixed collection
|
||||||
|
obj.geometry = {
|
||||||
type: ol.geom.GeometryType.GEOMETRYCOLLECTION,
|
type: ol.geom.GeometryType.GEOMETRYCOLLECTION,
|
||||||
parts: parts
|
parts: parts
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
if (goog.isArray(container)) {
|
||||||
|
// MultiGeometry nested inside another
|
||||||
|
container.push(obj.geometry);
|
||||||
|
} else {
|
||||||
|
container.geometry = obj.geometry;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
'Point': function(node, container) {
|
'Point': function(node, container) {
|
||||||
var coordinates = [];
|
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('goog.dom.xml');
|
||||||
|
|
||||||
goog.require('ol.Feature');
|
goog.require('ol.Feature');
|
||||||
goog.require('ol.geom.GeometryCollection');
|
goog.require('ol.geom.GeometryCollection');
|
||||||
goog.require('ol.geom.LineString');
|
goog.require('ol.geom.LineString');
|
||||||
goog.require('ol.geom.MultiLineString');
|
goog.require('ol.geom.MultiLineString');
|
||||||
|
goog.require('ol.geom.MultiPolygon');
|
||||||
goog.require('ol.geom.Point');
|
goog.require('ol.geom.Point');
|
||||||
goog.require('ol.geom.Polygon');
|
goog.require('ol.geom.Polygon');
|
||||||
goog.require('ol.parser.KML');
|
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