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 (193 loc) • 5.82 kB
JavaScript
// index.ts
import { distance } from "@turf/distance";
import { feature, featureCollection } from "@turf/helpers";
import { featureEach } from "@turf/meta";
import { tin } from "@turf/tin";
// lib/turf-dissolve.ts
import { clone as clone3 } from "@turf/clone";
import { isObject as isObject2 } from "@turf/helpers";
import { getType as getType3 } from "@turf/invariant";
import { flattenEach as flattenEach2 } from "@turf/meta";
// lib/turf-line-dissolve.ts
import { clone } from "@turf/clone";
import { isObject, lineString, multiLineString } from "@turf/helpers";
import { getType } from "@turf/invariant";
import { lineReduce } from "@turf/meta";
function lineDissolve(geojson, options = {}) {
options = options || {};
if (!isObject(options)) {
throw new Error("options is invalid");
}
const mutate = options.mutate;
if (getType(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(geojson);
}
const result = [];
const lastLine = lineReduce(
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 multiLineString(
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 lineString(coords);
}
// lib/turf-polygon-dissolve.ts
import { clone as clone2 } from "@turf/clone";
import { geometryCollection } from "@turf/helpers";
import { getType as getType2 } from "@turf/invariant";
import { flattenEach } from "@turf/meta";
import { merge } from "topojson-client";
import { topology } from "topojson-server";
function polygonDissolve(geojson, options = {}) {
if (getType2(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 = clone2(geojson);
}
const geoms = [];
flattenEach(geojson, (feature2) => {
geoms.push(feature2.geometry);
});
const topo = topology({ geoms: geometryCollection(geoms).geometry });
const merged = merge(topo, topo.objects.geoms.geometries);
return merged;
}
// lib/turf-dissolve.ts
function dissolve(geojson, options = {}) {
options = options || {};
if (!isObject2(options)) {
throw new Error("options is invalid");
}
const mutate = options.mutate;
if (getType3(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 = clone3(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 = {};
flattenEach2(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(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(pt1, pt2, options);
const dist2 = distance(pt2, pt3, options);
const dist3 = distance(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 feature(dissolved);
}
function removeDuplicates(points) {
const cleaned = [];
const existing = {};
featureEach(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 featureCollection(cleaned);
}
var turf_concave_default = concave;
export {
concave,
turf_concave_default as default
};
//# sourceMappingURL=index.js.map