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
198 lines (180 loc) • 5.88 kB
JavaScript
Object.defineProperty(exports, "__esModule", {value: true});// index.ts
var _distance = require('@turf/distance');
var _helpers = require('@turf/helpers');
var _meta = require('@turf/meta');
var _tin = require('@turf/tin');
// lib/turf-dissolve.ts
var _clone = require('@turf/clone');
var _invariant = require('@turf/invariant');
// lib/turf-line-dissolve.ts
function lineDissolve(geojson, options = {}) {
options = options || {};
if (!_helpers.isObject.call(void 0, options)) {
throw new Error("options is invalid");
}
const mutate = options.mutate;
if (_invariant.getType.call(void 0, geojson) !== "FeatureCollection") {
throw new Error("geojson must be a FeatureCollection");
}
if (!geojson.features.length) {
throw new Error("geojson is empty");
}
if (mutate === false || mutate === void 0) {
geojson = _clone.clone.call(void 0, geojson);
}
const result = [];
const lastLine = _meta.lineReduce.call(void 0,
geojson,
(previousLine, currentLine) => {
const merged = mergeLineStrings(previousLine, currentLine);
if (merged) {
return merged;
} else {
result.push(previousLine);
return currentLine;
}
}
);
if (lastLine) {
result.push(lastLine);
}
if (!result.length) {
return null;
} else if (result.length === 1) {
return result[0];
} else {
return _helpers.multiLineString.call(void 0,
result.map((line) => {
return line.coordinates;
})
);
}
}
function coordId(coord) {
return coord[0].toString() + "," + coord[1].toString();
}
function mergeLineStrings(a, b) {
const coords1 = a.geometry.coordinates;
const coords2 = b.geometry.coordinates;
const s1 = coordId(coords1[0]);
const e1 = coordId(coords1[coords1.length - 1]);
const s2 = coordId(coords2[0]);
const e2 = coordId(coords2[coords2.length - 1]);
let coords;
if (s1 === e2) {
coords = coords2.concat(coords1.slice(1));
} else if (s2 === e1) {
coords = coords1.concat(coords2.slice(1));
} else if (s1 === s2) {
coords = coords1.slice(1).reverse().concat(coords2);
} else if (e1 === e2) {
coords = coords1.concat(coords2.reverse().slice(1));
} else {
return null;
}
return _helpers.lineString.call(void 0, coords);
}
// lib/turf-polygon-dissolve.ts
var _topojsonclient = require('topojson-client');
var _topojsonserver = require('topojson-server');
function polygonDissolve(geojson, options = {}) {
if (_invariant.getType.call(void 0, geojson) !== "FeatureCollection") {
throw new Error("geojson must be a FeatureCollection");
}
if (!geojson.features.length) {
throw new Error("geojson is empty");
}
if (options.mutate === false || options.mutate === void 0) {
geojson = _clone.clone.call(void 0, geojson);
}
const geoms = [];
_meta.flattenEach.call(void 0, geojson, (feature2) => {
geoms.push(feature2.geometry);
});
const topo = _topojsonserver.topology.call(void 0, { geoms: _helpers.geometryCollection.call(void 0, geoms).geometry });
const merged = _topojsonclient.merge.call(void 0, topo, topo.objects.geoms.geometries);
return merged;
}
// lib/turf-dissolve.ts
function dissolve(geojson, options = {}) {
options = options || {};
if (!_helpers.isObject.call(void 0, options)) {
throw new Error("options is invalid");
}
const mutate = options.mutate;
if (_invariant.getType.call(void 0, geojson) !== "FeatureCollection") {
throw new Error("geojson must be a FeatureCollection");
}
if (!geojson.features.length) {
throw new Error("geojson is empty");
}
if (mutate === false || mutate === void 0) {
geojson = _clone.clone.call(void 0, geojson);
}
const type = getHomogenousType(geojson);
if (!type) {
throw new Error("geojson must be homogenous");
}
const data = geojson;
switch (type) {
case "LineString":
return lineDissolve(data, options);
case "Polygon":
return polygonDissolve(data, options);
default:
throw new Error(type + " is not supported");
}
}
function getHomogenousType(geojson) {
const types = {};
_meta.flattenEach.call(void 0, geojson, (feature2) => {
types[feature2.geometry.type] = true;
});
const keys = Object.keys(types);
if (keys.length === 1) {
return keys[0];
}
return null;
}
// index.ts
function concave(points, options = {}) {
const maxEdge = options.maxEdge || Infinity;
const cleaned = removeDuplicates(points);
const tinPolys = _tin.tin.call(void 0, cleaned);
tinPolys.features = tinPolys.features.filter((triangle) => {
const pt1 = triangle.geometry.coordinates[0][0];
const pt2 = triangle.geometry.coordinates[0][1];
const pt3 = triangle.geometry.coordinates[0][2];
const dist1 = _distance.distance.call(void 0, pt1, pt2, options);
const dist2 = _distance.distance.call(void 0, pt2, pt3, options);
const dist3 = _distance.distance.call(void 0, pt1, pt3, options);
return dist1 <= maxEdge && dist2 <= maxEdge && dist3 <= maxEdge;
});
if (tinPolys.features.length < 1) {
return null;
}
const dissolved = dissolve(tinPolys);
if (dissolved.coordinates.length === 1) {
dissolved.coordinates = dissolved.coordinates[0];
dissolved.type = "Polygon";
}
return _helpers.feature.call(void 0, dissolved);
}
function removeDuplicates(points) {
const cleaned = [];
const existing = {};
_meta.featureEach.call(void 0, points, (pt) => {
if (!pt.geometry) {
return;
}
const key = pt.geometry.coordinates.join("-");
if (!Object.prototype.hasOwnProperty.call(existing, key)) {
cleaned.push(pt);
existing[key] = true;
}
});
return _helpers.featureCollection.call(void 0, cleaned);
}
var turf_concave_default = concave;
exports.concave = concave; exports.default = turf_concave_default;
//# sourceMappingURL=index.cjs.map
;