geoProjectSimple = {
const { geoStream } = d3;
return function (object, projection) {
const stream = projection.stream;
let project;
if (!stream) throw new Error("invalid projection");
switch (object && object.type) {
case "Feature":
project = projectFeature;
break;
case "FeatureCollection":
project = projectFeatureCollection;
break;
default:
project = projectGeometry;
break;
}
return project(object, stream);
};
function projectFeatureCollection(o, stream) {
return { ...o, features: o.features.map((f) => projectFeature(f, stream)) };
}
function projectFeature(o, stream) {
return { ...o, geometry: projectGeometry(o.geometry, stream) };
}
function projectGeometryCollection(o, stream) {
return {
...o,
geometries: o.geometries.map((o) => projectGeometry(o, stream))
};
}
function projectGeometry(o, stream) {
return !o
? null
: o.type === "GeometryCollection"
? projectGeometryCollection(o, stream)
: o.type === "Polygon" || o.type === "MultiPolygon"
? projectPolygons(o, stream)
: o;
}
function projectPolygons(o, stream) {
let coordinates = [];
let polygon, line;
geoStream(
o,
stream({
polygonStart() {
coordinates.push((polygon = []));
},
polygonEnd() {},
lineStart() {
polygon.push((line = []));
},
lineEnd() {
line.push(line[0].slice());
},
point(x, y) {
line.push([x, y]);
}
})
);
if (o.type === "Polygon") coordinates = coordinates[0];
return { ...o, coordinates, rewind: true };
}
}