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 (69 loc) • 3.27 kB
JavaScript
var meta = require('@turf/meta');
var helpers = require('@turf/helpers');
var invariant = require('@turf/invariant');
var clone = require('@turf/clone');
var rhumbDestination = require('@turf/rhumb-destination');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var clone__default = /*#__PURE__*/_interopDefaultLegacy(clone);
var rhumbDestination__default = /*#__PURE__*/_interopDefaultLegacy(rhumbDestination);
/**
* Moves any geojson Feature or Geometry of a specified distance along a Rhumb Line
* on the provided direction angle.
*
* @name transformTranslate
* @param {GeoJSON} geojson object to be translated
* @param {number} distance length of the motion; negative values determine motion in opposite direction
* @param {number} direction of the motion; angle from North in decimal degrees, positive clockwise
* @param {Object} [options={}] Optional parameters
* @param {string} [options.units='kilometers'] in which `distance` will be express; miles, kilometers, degrees, or radians
* @param {number} [options.zTranslation=0] length of the vertical motion, same unit of distance
* @param {boolean} [options.mutate=false] allows GeoJSON input to be mutated (significant performance increase if true)
* @returns {GeoJSON} the translated GeoJSON object
* @example
* var poly = turf.polygon([[[0,29],[3.5,29],[2.5,32],[0,29]]]);
* var translatedPoly = turf.transformTranslate(poly, 100, 35);
*
* //addToMap
* var addToMap = [poly, translatedPoly];
* translatedPoly.properties = {stroke: '#F00', 'stroke-width': 4};
*/
function transformTranslate(geojson, distance, direction, options) {
// Optional parameters
options = options || {};
if (!helpers.isObject(options)) throw new Error("options is invalid");
var units = options.units;
var zTranslation = options.zTranslation;
var mutate = options.mutate;
// Input validation
if (!geojson) throw new Error("geojson is required");
if (distance === undefined || distance === null || isNaN(distance))
throw new Error("distance is required");
if (zTranslation && typeof zTranslation !== "number" && isNaN(zTranslation))
throw new Error("zTranslation is not a number");
// Shortcut no-motion
zTranslation = zTranslation !== undefined ? zTranslation : 0;
if (distance === 0 && zTranslation === 0) return geojson;
if (direction === undefined || direction === null || isNaN(direction))
throw new Error("direction is required");
// Invert with negative distances
if (distance < 0) {
distance = -distance;
direction = direction + 180;
}
// Clone geojson to avoid side effects
if (mutate === false || mutate === undefined) geojson = clone__default['default'](geojson);
// Translate each coordinate
meta.coordEach(geojson, function (pointCoords) {
var newCoords = invariant.getCoords(
rhumbDestination__default['default'](pointCoords, distance, direction, { units: units })
);
pointCoords[0] = newCoords[0];
pointCoords[1] = newCoords[1];
if (zTranslation && pointCoords.length === 3)
pointCoords[2] += zTranslation;
});
return geojson;
}
module.exports = transformTranslate;
module.exports.default = transformTranslate;
;