diff options
Diffstat (limited to 'debian/tests/test_modules/topojson-client/src/mesh.js')
-rw-r--r-- | debian/tests/test_modules/topojson-client/src/mesh.js | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/debian/tests/test_modules/topojson-client/src/mesh.js b/debian/tests/test_modules/topojson-client/src/mesh.js new file mode 100644 index 0000000..e0b7097 --- /dev/null +++ b/debian/tests/test_modules/topojson-client/src/mesh.js @@ -0,0 +1,53 @@ +import {object} from "./feature.js"; +import stitch from "./stitch.js"; + +export default function(topology) { + return object(topology, meshArcs.apply(this, arguments)); +} + +export function meshArcs(topology, object, filter) { + var arcs, i, n; + if (arguments.length > 1) arcs = extractArcs(topology, object, filter); + else for (i = 0, arcs = new Array(n = topology.arcs.length); i < n; ++i) arcs[i] = i; + return {type: "MultiLineString", arcs: stitch(topology, arcs)}; +} + +function extractArcs(topology, object, filter) { + var arcs = [], + geomsByArc = [], + geom; + + function extract0(i) { + var j = i < 0 ? ~i : i; + (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom}); + } + + function extract1(arcs) { + arcs.forEach(extract0); + } + + function extract2(arcs) { + arcs.forEach(extract1); + } + + function extract3(arcs) { + arcs.forEach(extract2); + } + + function geometry(o) { + switch (geom = o, o.type) { + case "GeometryCollection": o.geometries.forEach(geometry); break; + case "LineString": extract1(o.arcs); break; + case "MultiLineString": case "Polygon": extract2(o.arcs); break; + case "MultiPolygon": extract3(o.arcs); break; + } + } + + geometry(object); + + geomsByArc.forEach(filter == null + ? function(geoms) { arcs.push(geoms[0].i); } + : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i); }); + + return arcs; +} |