in modules/layers/src/geojson-layer/geojson.js [89:201]
function separateGeometry(geometry, separated, wrapFeature, sourceFeature, sourceFeatureIndex) {
const {type, coordinates} = geometry;
const {pointFeatures, lineFeatures, polygonFeatures, polygonOutlineFeatures} = separated;
if (!validateGeometry(type, coordinates)) {
// Avoid hard failure if some features are malformed
log.warn(`${type} coordinates are malformed`)();
return;
}
// Split each feature, but keep track of the source feature and index (for Multi* geometries)
switch (type) {
case 'Point':
pointFeatures.push(
wrapFeature(
{
geometry
},
sourceFeature,
sourceFeatureIndex
)
);
break;
case 'MultiPoint':
coordinates.forEach(point => {
pointFeatures.push(
wrapFeature(
{
geometry: {type: 'Point', coordinates: point}
},
sourceFeature,
sourceFeatureIndex
)
);
});
break;
case 'LineString':
lineFeatures.push(
wrapFeature(
{
geometry
},
sourceFeature,
sourceFeatureIndex
)
);
break;
case 'MultiLineString':
// Break multilinestrings into multiple lines
coordinates.forEach(path => {
lineFeatures.push(
wrapFeature(
{
geometry: {type: 'LineString', coordinates: path}
},
sourceFeature,
sourceFeatureIndex
)
);
});
break;
case 'Polygon':
polygonFeatures.push(
wrapFeature(
{
geometry
},
sourceFeature,
sourceFeatureIndex
)
);
// Break polygon into multiple lines
coordinates.forEach(path => {
polygonOutlineFeatures.push(
wrapFeature(
{
geometry: {type: 'LineString', coordinates: path}
},
sourceFeature,
sourceFeatureIndex
)
);
});
break;
case 'MultiPolygon':
// Break multipolygons into multiple polygons
coordinates.forEach(polygon => {
polygonFeatures.push(
wrapFeature(
{
geometry: {type: 'Polygon', coordinates: polygon}
},
sourceFeature,
sourceFeatureIndex
)
);
// Break polygon into multiple lines
polygon.forEach(path => {
polygonOutlineFeatures.push(
wrapFeature(
{
geometry: {type: 'LineString', coordinates: path}
},
sourceFeature,
sourceFeatureIndex
)
);
});
});
break;
default:
}
}