54 lines
2.0 KiB
JavaScript
54 lines
2.0 KiB
JavaScript
|
export default function(input, digits) {
|
||
|
if (!(0 <= (digits = +digits) && digits <= 20)) throw new Error("invalid digits");
|
||
|
|
||
|
function quantizePoint(input) {
|
||
|
var n = input.length, i = 2, output = new Array(n);
|
||
|
output[0] = +input[0].toFixed(digits);
|
||
|
output[1] = +input[1].toFixed(digits);
|
||
|
while (i < n) output[i] = input[i], ++i;
|
||
|
return output;
|
||
|
}
|
||
|
|
||
|
function quantizePoints(input) {
|
||
|
return input.map(quantizePoint);
|
||
|
}
|
||
|
|
||
|
function quantizePolygon(input) {
|
||
|
return input.map(quantizePoints);
|
||
|
}
|
||
|
|
||
|
function quantizeGeometry(input) {
|
||
|
if (input == null) return 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": case "LineString": output = {type: input.type, coordinates: quantizePoints(input.coordinates)}; break;
|
||
|
case "MultiLineString": case "Polygon": output = {type: input.type, coordinates: quantizePolygon(input.coordinates)}; break;
|
||
|
case "MultiPolygon": output = {type: "MultiPolygon", coordinates: input.coordinates.map(quantizePolygon)}; break;
|
||
|
default: return input;
|
||
|
}
|
||
|
if (input.bbox != null) output.bbox = input.bbox;
|
||
|
return output;
|
||
|
}
|
||
|
|
||
|
function quantizeFeature(input) {
|
||
|
var output = {type: "Feature", properties: input.properties, geometry: quantizeGeometry(input.geometry)};
|
||
|
if (input.id != null) output.id = input.id;
|
||
|
if (input.bbox != null) output.bbox = input.bbox;
|
||
|
return output;
|
||
|
}
|
||
|
|
||
|
if (input != null) switch (input.type) {
|
||
|
case "Feature": return quantizeFeature(input);
|
||
|
case "FeatureCollection": {
|
||
|
var output = {type: "FeatureCollection", features: input.features.map(quantizeFeature)};
|
||
|
if (input.bbox != null) output.bbox = input.bbox;
|
||
|
return output;
|
||
|
}
|
||
|
default: return quantizeGeometry(input);
|
||
|
}
|
||
|
|
||
|
return input;
|
||
|
}
|