quantize.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import bbox from "./bbox.js";
  2. import untransform from "./untransform.js";
  3. export default function(topology, transform) {
  4. if (topology.transform) throw new Error("already quantized");
  5. if (!transform || !transform.scale) {
  6. if (!((n = Math.floor(transform)) >= 2)) throw new Error("n must be ≥2");
  7. box = topology.bbox || bbox(topology);
  8. var x0 = box[0], y0 = box[1], x1 = box[2], y1 = box[3], n;
  9. transform = {scale: [x1 - x0 ? (x1 - x0) / (n - 1) : 1, y1 - y0 ? (y1 - y0) / (n - 1) : 1], translate: [x0, y0]};
  10. } else {
  11. box = topology.bbox;
  12. }
  13. var t = untransform(transform), box, key, inputs = topology.objects, outputs = {};
  14. function quantizePoint(point) {
  15. return t(point);
  16. }
  17. function quantizeGeometry(input) {
  18. var output;
  19. switch (input.type) {
  20. case "GeometryCollection": output = {type: "GeometryCollection", geometries: input.geometries.map(quantizeGeometry)}; break;
  21. case "Point": output = {type: "Point", coordinates: quantizePoint(input.coordinates)}; break;
  22. case "MultiPoint": output = {type: "MultiPoint", coordinates: input.coordinates.map(quantizePoint)}; break;
  23. default: return input;
  24. }
  25. if (input.id != null) output.id = input.id;
  26. if (input.bbox != null) output.bbox = input.bbox;
  27. if (input.properties != null) output.properties = input.properties;
  28. return output;
  29. }
  30. function quantizeArc(input) {
  31. var i = 0, j = 1, n = input.length, p, output = new Array(n); // pessimistic
  32. output[0] = t(input[0], 0);
  33. while (++i < n) if ((p = t(input[i], i))[0] || p[1]) output[j++] = p; // non-coincident points
  34. if (j === 1) output[j++] = [0, 0]; // an arc must have at least two points
  35. output.length = j;
  36. return output;
  37. }
  38. for (key in inputs) outputs[key] = quantizeGeometry(inputs[key]);
  39. return {
  40. type: "Topology",
  41. bbox: box,
  42. transform: transform,
  43. objects: outputs,
  44. arcs: topology.arcs.map(quantizeArc)
  45. };
  46. }