class TopoSimplifyManager {
static getOrCreateInstance(leafletMap, topology) {
let instancesPerMap = TopoSimplifyManager._instancesPerMap ??= new WeakMap();
let instances = instancesPerMap.get(leafletMap);
if (!instances) {
instances = new Map();
instancesPerMap.set(leafletMap, instances);
}
let instance = instances.get(leafletMap);
if (!instance) {
debugger;
instance = new TopoSimplifyManager(topology, leafletMap.options.crs);
instances.set(leafletMap, topology);
}
return instance;
}
constructor(topology, crs) {
this.crs = crs;
const zoom = crs.zoom(1);
let presimplified = {...topology};
let lng, lat;
presimplified.arcs = topology.arcs.map(arc => {
return arc.map(([lng,lat]) => {
const { x, y } = crs.latLngToPoint(L.latLng(lat, lng), zoom);
return [x, y];
});
});
presimplified = topojson.presimplify(presimplified);
let srcArc, srcCoord, maxValue = 0;
presimplified.arcs.forEach((arc, i) => {
srcArc = topology.arcs[i];
arc.forEach((c,j) => {
srcCoord = srcArc[j];
c[0] = srcCoord[0];
c[1] = srcCoord[1];
if (srcCoord[2] === Infinity) {
c[2] = srcCoord[2];
}
if (c[2] < Infinity && c[2] > maxValue) {
maxValue = c[2];
}
});
});
const arcs = this.sourceArcs = presimplified.arcs;
this.maxValue = maxValue;
this.lowResArcs = topojson.simplify(presimplified, 2 * maxValue).arcs;
this.arcs = getTrackedArcArray(this.lowResArcs);
const index = this.index = new Flatbush(this.sourceArcs.length);
arcs.forEach(arc => index.add(...Bbox.fromPoints(arc)));
index.finish();
}
getArcCoords(arcId, tolerance) {
if (tolerance == Infinity) {
return this.lowResArcs[arcId];
}
else {
return this.sourceArcs[arcId].filter(c => c[2] >= tolerance).map(c => [c[0], c[1]]);
}
}
updateArcs(bbox, zoom, tolerance = 1) {
bbox = Bbox.fromPoints(Bbox.corners(bbox));
tolerance /= this.crs.scale(zoom);
if (tolerance > this.maxValue) {
this.lowResArcs.forEach((arc, i) => this.arcs[i] = arc);
return;
}
const visibleArcIds = new Set(this.index.search(...bbox));
debugger;
this.sourceArcs.forEach((arc, i) => {
if (visibleArcIds.has(i)) {
this.arcs[i] = this.getArcCoords(i, tolerance);
}
else {
this.arcs[i] = this.lowResArcs[i];
}
});
console.log("updateArcs", visibleArcIds, this.arcs, ...arguments);
}
asTopology() {
return {
type: "Topology",
arcs: this.arcs,
properties: {
dirtyArcIds: this.arcs.getDirtyIndices()
}
}
}
}