54 lines
1.4 KiB
Java
54 lines
1.4 KiB
Java
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;
|
|
}
|