-
Notifications
You must be signed in to change notification settings - Fork 0
/
calc-all.js
72 lines (60 loc) · 1.86 KB
/
calc-all.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
"use_strict";
const dedupe = require("./dedupe.js");
function flatten(arr) {
const out = [];
for (let a = 0; a < arr.length; a++) {
const it = arr[a];
for (let i = 0; i < it.length; i++) {
out.push(it[i]);
}
}
return out;
}
function calcAll(geom) {
if (geom.geometry) geom = geom.geometry;
if (geom.coordinates) geom = geom.coordinates;
if (geom.paths) geom = geom.paths; // ArcGIS Polyline
if (geom.points) geom = geom.points; // ArcGIS Multipoint
if (geom.rings) geom = geom.rings; // ArcGIS Polygon
// GeoJSON FeatureCollection
if (Array.isArray(geom.features)) {
return dedupe(flatten(geom.features.map(calcAll)));
}
// GeoJSON GeometryCollection
if (Array.isArray(geom.geometries)) {
return dedupe(flatten(geom.geometries.map(calcAll)));
}
if (Array.isArray(geom) && Array.isArray(geom[0]) && Array.isArray(geom[0][0])) {
return dedupe(flatten(geom.map(calcAll)));
}
// array of [x, y] coordinate pairs
if (Array.isArray(geom) && Array.isArray(geom[0]) && typeof geom[0][0] === "number") {
const [x, y] = geom[0];
let xmin = x;
let ymin = y;
let xmax = x;
let ymax = y;
geom.forEach(([px, py]) => {
if (px < xmin) xmin = px;
if (px > xmax) xmax = px;
if (py < ymin) ymin = py;
if (py > ymax) ymax = py;
});
return [[xmin, ymin, xmax, ymax]];
}
// point
if (Array.isArray(geom) && (geom.length === 2 || geom.length === 3) && typeof geom[0] === "number") {
const [x, y] = geom;
return [[x, y, x, y]];
}
// ArcGIS Point
if (typeof geom.x === "number" && typeof geom.y === "number") {
const { x, y } = geom;
return [[x, y, x, y]];
}
if (["xmin", "xmax", "ymin", "ymax"].every(k => typeof geom[k] === "number")) {
return [[geom.xmin, geom.ymin, geom.xmax, geom.ymax]];
}
}
module.exports = calcAll;
module.exports.default = calcAll;