in modules/layers/src/mode-handlers/mode-handler.ts [311:375]
export function getEditHandlesForGeometry(
geometry: Geometry,
featureIndex: number,
editHandleType: EditHandleType = 'existing'
) {
let handles: EditHandle[] = [];
switch (geometry.type) {
case 'Point':
// positions are not nested
handles = [
{
position: geometry.coordinates,
positionIndexes: [],
featureIndex,
type: editHandleType,
},
];
break;
case 'MultiPoint':
case 'LineString':
// positions are nested 1 level
handles = handles.concat(
getEditHandlesForCoordinates(geometry.coordinates, [], featureIndex, editHandleType)
);
break;
case 'Polygon':
case 'MultiLineString':
// positions are nested 2 levels
for (let a = 0; a < geometry.coordinates.length; a++) {
handles = handles.concat(
getEditHandlesForCoordinates(geometry.coordinates[a], [a], featureIndex, editHandleType)
);
if (geometry.type === 'Polygon') {
// Don't repeat the first/last handle for Polygons
handles = handles.slice(0, -1);
}
}
break;
case 'MultiPolygon':
// positions are nested 3 levels
for (let a = 0; a < geometry.coordinates.length; a++) {
for (let b = 0; b < geometry.coordinates[a].length; b++) {
handles = handles.concat(
getEditHandlesForCoordinates(
geometry.coordinates[a][b],
[a, b],
featureIndex,
editHandleType
)
);
// Don't repeat the first/last handle for Polygons
handles = handles.slice(0, -1);
}
}
break;
default:
// @ts-expect-error unexpected case
throw Error(`Unhandled geometry type: ${geometry.type}`);
}
return handles;
}