function pixiPath(object, context, radius = 5, properties) {
switch (object.type) {
case "GeometryCollection":
object.geometries.forEach((geometry) =>
pixiPath(geometry, context, radius)
);
break;
case "FeatureCollection":
object.features.forEach((feature) => pixiPath(feature, context, radius));
break;
case "Feature":
pixiPath(object.geometry, context, radius, object.properties);
break;
case "Point":
toPoint(object.coordinates, radius, properties);
break;
case "MultiPoint":
object.coordinates.forEach((point) => toPoint(point, radius, properties));
break;
case "LineString":
toLineString(object.coordinates);
break;
case "MultiLineString":
object.coordinates.forEach(toLineString);
break;
case "Polygon":
toPolygon(object.coordinates);
break;
case "MultiPolygon":
object.coordinates.forEach(toPolygon);
break;
}
function toPoint(coords, radius, properties) {
const [x, y] = coords;
const r = typeof radius === "function" ? radius(properties) : radius;
context.drawCircle(x, y, r);
}
function toLineString(coords) {
coords.forEach((point, i) =>
i === 0 ? context.moveTo(...point) : context.lineTo(...point)
);
}
function toPolygon(coords) {
coords.length === 1
?
context.drawPolygon(coords.flat(2))
:
coords.forEach((ring, i) =>
i === 0
? context.drawPolygon(ring.flat(2))
: context.beginHole().drawPolygon(ring.flat(2)).endHole()
);
}
}