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
81 lines (75 loc) • 2.37 kB
JavaScript
'use strict';
var invariant = require('@turf/invariant');
/**
* Takes a triangular plane as a {@link Polygon}
* and a {@link Point} within that triangle and returns the z-value
* at that point. The Polygon should have properties `a`, `b`, and `c`
* that define the values at its three corners. Alternatively, the z-values
* of each triangle point can be provided by their respective 3rd coordinate
* if their values are not provided as properties.
*
* @name planepoint
* @param {Coord} point the Point for which a z-value will be calculated
* @param {Feature<Polygon>} triangle a Polygon feature with three vertices
* @returns {number} the z-value for `interpolatedPoint`
* @example
* var point = turf.point([-75.3221, 39.529]);
* // "a", "b", and "c" values represent the values of the coordinates in order.
* var triangle = turf.polygon([[
* [-75.1221, 39.57],
* [-75.58, 39.18],
* [-75.97, 39.86],
* [-75.1221, 39.57]
* ]], {
* "a": 11,
* "b": 122,
* "c": 44
* });
*
* var zValue = turf.planepoint(point, triangle);
* point.properties.zValue = zValue;
*
* //addToMap
* var addToMap = [triangle, point];
*/
function planepoint(point, triangle) {
// Normalize input
var coord = invariant.getCoord(point);
var geom = invariant.getGeom(triangle);
var coords = geom.coordinates;
var outer = coords[0];
if (outer.length < 4)
throw new Error("OuterRing of a Polygon must have 4 or more Positions.");
var properties = triangle.properties || {};
var a = properties.a;
var b = properties.b;
var c = properties.c;
// Planepoint
var x = coord[0];
var y = coord[1];
var x1 = outer[0][0];
var y1 = outer[0][1];
var z1 = a !== undefined ? a : outer[0][2];
var x2 = outer[1][0];
var y2 = outer[1][1];
var z2 = b !== undefined ? b : outer[1][2];
var x3 = outer[2][0];
var y3 = outer[2][1];
var z3 = c !== undefined ? c : outer[2][2];
var z =
(z3 * (x - x1) * (y - y2) +
z1 * (x - x2) * (y - y3) +
z2 * (x - x3) * (y - y1) -
z2 * (x - x1) * (y - y3) -
z3 * (x - x2) * (y - y1) -
z1 * (x - x3) * (y - y2)) /
((x - x1) * (y - y2) +
(x - x2) * (y - y3) +
(x - x3) * (y - y1) -
(x - x1) * (y - y3) -
(x - x2) * (y - y1) -
(x - x3) * (y - y2));
return z;
}
module.exports = planepoint;
module.exports.default = planepoint;