UNPKG

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

79 lines (77 loc) 2.94 kB
import Geometry from '../geom/Geometry' import hasInterface from '../../../../hasInterface' import GeometryFactory from '../geom/GeometryFactory' import Collection from '../../../../java/util/Collection' import IncrementalDelaunayTriangulator from './IncrementalDelaunayTriangulator' import QuadEdgeSubdivision from './quadedge/QuadEdgeSubdivision' import DelaunayTriangulationBuilder from './DelaunayTriangulationBuilder' import CoordinateArrays from '../geom/CoordinateArrays' import ArrayList from '../../../../java/util/ArrayList' import OverlayOp from '../operation/overlay/OverlayOp' export default class VoronoiDiagramBuilder { constructor() { VoronoiDiagramBuilder.constructor_.apply(this, arguments) } static constructor_() { this._siteCoords = null this._tolerance = 0.0 this._subdiv = null this._clipEnv = null this._diagramEnv = null } static clipGeometryCollection(geom, clipEnv) { const clipPoly = geom.getFactory().toGeometry(clipEnv) const clipped = new ArrayList() for (let i = 0; i < geom.getNumGeometries(); i++) { const g = geom.getGeometryN(i) let result = null if (clipEnv.contains(g.getEnvelopeInternal())) { result = g } else if (clipEnv.intersects(g.getEnvelopeInternal())) { result = OverlayOp.intersection(clipPoly, g) result.setUserData(g.getUserData()) } if (result !== null && !result.isEmpty()) clipped.add(result) } return geom.getFactory().createGeometryCollection(GeometryFactory.toGeometryArray(clipped)) } create() { if (this._subdiv !== null) return null const siteEnv = DelaunayTriangulationBuilder.envelope(this._siteCoords) this._diagramEnv = this._clipEnv if (this._diagramEnv === null) { this._diagramEnv = siteEnv const expandBy = this._diagramEnv.getDiameter() this._diagramEnv.expandBy(expandBy) } const vertices = DelaunayTriangulationBuilder.toVertices(this._siteCoords) this._subdiv = new QuadEdgeSubdivision(siteEnv, this._tolerance) const triangulator = new IncrementalDelaunayTriangulator(this._subdiv) triangulator.insertSites(vertices) } getDiagram(geomFact) { this.create() const polys = this._subdiv.getVoronoiDiagram(geomFact) return VoronoiDiagramBuilder.clipGeometryCollection(polys, this._diagramEnv) } setTolerance(tolerance) { this._tolerance = tolerance } setSites() { if (arguments[0] instanceof Geometry) { const geom = arguments[0] this._siteCoords = DelaunayTriangulationBuilder.extractUniqueCoordinates(geom) } else if (hasInterface(arguments[0], Collection)) { const coords = arguments[0] this._siteCoords = DelaunayTriangulationBuilder.unique(CoordinateArrays.toCoordinateArray(coords)) } } setClipEnvelope(clipEnv) { this._clipEnv = clipEnv } getSubdivision() { this.create() return this._subdiv } }