node-red-contrib-tak-registration
Version:
A Node-RED node to register to TAK and to help wrap files as datapackages to send to TAK
192 lines (189 loc) • 4.3 kB
JavaScript
Object.defineProperty(exports, "__esModule", {value: true});// index.ts
var _helpers = require('@turf/helpers');
function tin(points, z) {
let isPointZ = false;
return _helpers.featureCollection.call(void 0,
triangulate(
points.features.map((p) => {
const point = {
x: p.geometry.coordinates[0],
y: p.geometry.coordinates[1]
};
if (z) {
point.z = p.properties[z];
} else if (p.geometry.coordinates.length === 3) {
isPointZ = true;
point.z = p.geometry.coordinates[2];
}
return point;
})
).map((triangle) => {
const a = [triangle.a.x, triangle.a.y];
const b = [triangle.b.x, triangle.b.y];
const c = [triangle.c.x, triangle.c.y];
let properties = {};
if (isPointZ) {
a.push(triangle.a.z);
b.push(triangle.b.z);
c.push(triangle.c.z);
} else {
properties = {
a: triangle.a.z,
b: triangle.b.z,
c: triangle.c.z
};
}
return _helpers.polygon.call(void 0, [[a, b, c, a]], properties);
})
);
}
var Triangle = class {
constructor(a, b, c) {
this.a = a;
this.b = b;
this.c = c;
const A = b.x - a.x;
const B = b.y - a.y;
const C = c.x - a.x;
const D = c.y - a.y;
const E = A * (a.x + b.x) + B * (a.y + b.y);
const F = C * (a.x + c.x) + D * (a.y + c.y);
const G = 2 * (A * (c.y - b.y) - B * (c.x - b.x));
let dx;
let dy;
this.x = (D * E - B * F) / G;
this.y = (A * F - C * E) / G;
dx = this.x - a.x;
dy = this.y - a.y;
this.r = dx * dx + dy * dy;
}
};
function byX(a, b) {
return b.x - a.x;
}
function dedup(edges) {
let j = edges.length;
let a;
let b;
let i;
let m;
let n;
outer: while (j) {
b = edges[--j];
a = edges[--j];
i = j;
while (i) {
n = edges[--i];
m = edges[--i];
if (a === m && b === n || a === n && b === m) {
edges.splice(j, 2);
edges.splice(i, 2);
j -= 2;
continue outer;
}
}
}
}
function triangulate(vertices) {
if (vertices.length < 3) {
return [];
}
vertices.sort(byX);
let i = vertices.length - 1;
const xmin = vertices[i].x;
const xmax = vertices[0].x;
let ymin = vertices[i].y;
let ymax = ymin;
const epsilon = 1e-12;
let a;
let b;
let c;
let A;
let B;
let G;
while (i--) {
if (vertices[i].y < ymin) {
ymin = vertices[i].y;
}
if (vertices[i].y > ymax) {
ymax = vertices[i].y;
}
}
let dx = xmax - xmin;
let dy = ymax - ymin;
const dmax = dx > dy ? dx : dy;
const xmid = (xmax + xmin) * 0.5;
const ymid = (ymax + ymin) * 0.5;
const open = [
new Triangle(
{
__sentinel: true,
x: xmid - 20 * dmax,
y: ymid - dmax
},
{
__sentinel: true,
x: xmid,
y: ymid + 20 * dmax
},
{
__sentinel: true,
x: xmid + 20 * dmax,
y: ymid - dmax
}
)
];
const closed = [];
const edges = [];
let j;
i = vertices.length;
while (i--) {
edges.length = 0;
j = open.length;
while (j--) {
dx = vertices[i].x - open[j].x;
if (dx > 0 && dx * dx > open[j].r) {
closed.push(open[j]);
open.splice(j, 1);
continue;
}
dy = vertices[i].y - open[j].y;
if (dx * dx + dy * dy > open[j].r) {
continue;
}
edges.push(
open[j].a,
open[j].b,
open[j].b,
open[j].c,
open[j].c,
open[j].a
);
open.splice(j, 1);
}
dedup(edges);
j = edges.length;
while (j) {
b = edges[--j];
a = edges[--j];
c = vertices[i];
A = b.x - a.x;
B = b.y - a.y;
G = 2 * (A * (c.y - b.y) - B * (c.x - b.x));
if (Math.abs(G) > epsilon) {
open.push(new Triangle(a, b, c));
}
}
}
Array.prototype.push.apply(closed, open);
i = closed.length;
while (i--) {
if (closed[i].a.__sentinel || closed[i].b.__sentinel || closed[i].c.__sentinel) {
closed.splice(i, 1);
}
}
return closed;
}
var turf_tin_default = tin;
exports.default = turf_tin_default; exports.tin = tin;
//# sourceMappingURL=index.cjs.map
;