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

164 lines (162 loc) 4.74 kB
import Location from '../geom/Location' import CGAlgorithms from '../algorithm/CGAlgorithms' import Position from './Position' import TopologyException from '../geom/TopologyException' import Label from './Label' import ArrayList from '../../../../java/util/ArrayList' import Assert from '../util/Assert' export default class EdgeRing { constructor () { this._startDe = null this._maxNodeDegree = -1 this._edges = new ArrayList() this._pts = new ArrayList() this._label = new Label(Location.NONE) this._ring = null this._isHole = null this._shell = null this._holes = new ArrayList() this._geometryFactory = null const start = arguments[0] const geometryFactory = arguments[1] this._geometryFactory = geometryFactory this.computePoints(start) this.computeRing() } computeRing () { if (this._ring !== null) return null const coord = new Array(this._pts.size()).fill(null) for (let i = 0; i < this._pts.size(); i++) { coord[i] = this._pts.get(i) } this._ring = this._geometryFactory.createLinearRing(coord) this._isHole = CGAlgorithms.isCCW(this._ring.getCoordinates()) } isIsolated () { return this._label.getGeometryCount() === 1 } computePoints (start) { this._startDe = start let de = start let isFirstEdge = true do { if (de === null) throw new TopologyException('Found null DirectedEdge') if (de.getEdgeRing() === this) throw new TopologyException('Directed Edge visited twice during ring-building at ' + de.getCoordinate()) this._edges.add(de) const label = de.getLabel() Assert.isTrue(label.isArea()) this.mergeLabel(label) this.addPoints(de.getEdge(), de.isForward(), isFirstEdge) isFirstEdge = false this.setEdgeRing(de, this) de = this.getNext(de) } while (de !== this._startDe) } getLinearRing () { return this._ring } getCoordinate (i) { return this._pts.get(i) } computeMaxNodeDegree () { this._maxNodeDegree = 0 let de = this._startDe do { const node = de.getNode() const degree = node.getEdges().getOutgoingDegree(this) if (degree > this._maxNodeDegree) this._maxNodeDegree = degree de = this.getNext(de) } while (de !== this._startDe) this._maxNodeDegree *= 2 } addPoints (edge, isForward, isFirstEdge) { const edgePts = edge.getCoordinates() if (isForward) { let startIndex = 1 if (isFirstEdge) startIndex = 0 for (let i = startIndex; i < edgePts.length; i++) { this._pts.add(edgePts[i]) } } else { let startIndex = edgePts.length - 2 if (isFirstEdge) startIndex = edgePts.length - 1 for (let i = startIndex; i >= 0; i--) { this._pts.add(edgePts[i]) } } } isHole () { return this._isHole } setInResult () { let de = this._startDe do { de.getEdge().setInResult(true) de = de.getNext() } while (de !== this._startDe) } containsPoint (p) { const shell = this.getLinearRing() const env = shell.getEnvelopeInternal() if (!env.contains(p)) return false if (!CGAlgorithms.isPointInRing(p, shell.getCoordinates())) return false for (let i = this._holes.iterator(); i.hasNext();) { const hole = i.next() if (hole.containsPoint(p)) return false } return true } addHole (ring) { this._holes.add(ring) } isShell () { return this._shell === null } getLabel () { return this._label } getEdges () { return this._edges } getMaxNodeDegree () { if (this._maxNodeDegree < 0) this.computeMaxNodeDegree() return this._maxNodeDegree } getShell () { return this._shell } mergeLabel () { if (arguments.length === 1) { const deLabel = arguments[0] this.mergeLabel(deLabel, 0) this.mergeLabel(deLabel, 1) } else if (arguments.length === 2) { const deLabel = arguments[0] const geomIndex = arguments[1] const loc = deLabel.getLocation(geomIndex, Position.RIGHT) if (loc === Location.NONE) return null if (this._label.getLocation(geomIndex) === Location.NONE) { this._label.setLocation(geomIndex, loc) return null } } } setShell (shell) { this._shell = shell if (shell !== null) shell.addHole(this) } toPolygon (geometryFactory) { const holeLR = new Array(this._holes.size()).fill(null) for (let i = 0; i < this._holes.size(); i++) { holeLR[i] = this._holes.get(i).getLinearRing() } const poly = geometryFactory.createPolygon(this.getLinearRing(), holeLR) return poly } interfaces_ () { return [] } getClass () { return EdgeRing } }