123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- import bbox from "./bbox.js";
- import untransform from "./untransform.js";
- export default function(topology, transform) {
- if (topology.transform) throw new Error("already quantized");
- if (!transform || !transform.scale) {
- if (!((n = Math.floor(transform)) >= 2)) throw new Error("n must be ≥2");
- box = topology.bbox || bbox(topology);
- var x0 = box[0], y0 = box[1], x1 = box[2], y1 = box[3], n;
- transform = {scale: [x1 - x0 ? (x1 - x0) / (n - 1) : 1, y1 - y0 ? (y1 - y0) / (n - 1) : 1], translate: [x0, y0]};
- } else {
- box = topology.bbox;
- }
- var t = untransform(transform), box, key, inputs = topology.objects, outputs = {};
- function quantizePoint(point) {
- return t(point);
- }
- function quantizeGeometry(input) {
- var output;
- switch (input.type) {
- case "GeometryCollection": output = {type: "GeometryCollection", geometries: input.geometries.map(quantizeGeometry)}; break;
- case "Point": output = {type: "Point", coordinates: quantizePoint(input.coordinates)}; break;
- case "MultiPoint": output = {type: "MultiPoint", coordinates: input.coordinates.map(quantizePoint)}; break;
- default: return input;
- }
- if (input.id != null) output.id = input.id;
- if (input.bbox != null) output.bbox = input.bbox;
- if (input.properties != null) output.properties = input.properties;
- return output;
- }
- function quantizeArc(input) {
- var i = 0, j = 1, n = input.length, p, output = new Array(n); // pessimistic
- output[0] = t(input[0], 0);
- while (++i < n) if ((p = t(input[i], i))[0] || p[1]) output[j++] = p; // non-coincident points
- if (j === 1) output[j++] = [0, 0]; // an arc must have at least two points
- output.length = j;
- return output;
- }
- for (key in inputs) outputs[key] = quantizeGeometry(inputs[key]);
- return {
- type: "Topology",
- bbox: box,
- transform: transform,
- objects: outputs,
- arcs: topology.arcs.map(quantizeArc)
- };
- }
|