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

211 lines (208 loc) 6.99 kB
import CoordinateList from '../geom/CoordinateList' import SegmentNode from './SegmentNode' // import Iterator from '../../../../java/util/Iterator' import Coordinate from '../geom/Coordinate' import NodedSegmentString from './NodedSegmentString' import Integer from '../../../../java/lang/Integer' import ArrayList from '../../../../java/util/ArrayList' import RuntimeException from '../../../../java/lang/RuntimeException' import Assert from '../util/Assert' import TreeMap from '../../../../java/util/TreeMap' export default class SegmentNodeList { constructor () { this._nodeMap = new TreeMap() this._edge = null let edge = arguments[0] this._edge = edge } getSplitCoordinates () { const coordList = new CoordinateList() this.addEndpoints() const it = this.iterator() let eiPrev = it.next() while (it.hasNext()) { const ei = it.next() this.addEdgeCoordinates(eiPrev, ei, coordList) eiPrev = ei } return coordList.toCoordinateArray() } addCollapsedNodes () { const collapsedVertexIndexes = new ArrayList() this.findCollapsesFromInsertedNodes(collapsedVertexIndexes) this.findCollapsesFromExistingVertices(collapsedVertexIndexes) for (const it = collapsedVertexIndexes.iterator(); it.hasNext();) { const vertexIndex = it.next().intValue() this.add(this._edge.getCoordinate(vertexIndex), vertexIndex) } } print (out) { out.println('Intersections:') for (const it = this.iterator(); it.hasNext();) { const ei = it.next() ei.print(out) } } findCollapsesFromExistingVertices (collapsedVertexIndexes) { for (let i = 0; i < this._edge.size() - 2; i++) { const p0 = this._edge.getCoordinate(i) // const p1 = this._edge.getCoordinate(i + 1) const p2 = this._edge.getCoordinate(i + 2) if (p0.equals2D(p2)) { collapsedVertexIndexes.add(new Integer(i + 1)) } } } addEdgeCoordinates (ei0, ei1, coordList) { // let npts = ei1.segmentIndex - ei0.segmentIndex + 2 const lastSegStartPt = this._edge.getCoordinate(ei1.segmentIndex) const useIntPt1 = ei1.isInterior() || !ei1.coord.equals2D(lastSegStartPt) // if (!useIntPt1) { // npts-- // } // const ipt = 0 coordList.add(new Coordinate(ei0.coord), false) for (let i = ei0.segmentIndex + 1; i <= ei1.segmentIndex; i++) { coordList.add(this._edge.getCoordinate(i)) } if (useIntPt1) { coordList.add(new Coordinate(ei1.coord)) } } iterator () { return this._nodeMap.values().iterator() } addSplitEdges (edgeList) { this.addEndpoints() this.addCollapsedNodes() const it = this.iterator() let eiPrev = it.next() while (it.hasNext()) { const ei = it.next() const newEdge = this.createSplitEdge(eiPrev, ei) edgeList.add(newEdge) eiPrev = ei } } findCollapseIndex (ei0, ei1, collapsedVertexIndex) { if (!ei0.coord.equals2D(ei1.coord)) return false let numVerticesBetween = ei1.segmentIndex - ei0.segmentIndex if (!ei1.isInterior()) { numVerticesBetween-- } if (numVerticesBetween === 1) { collapsedVertexIndex[0] = ei0.segmentIndex + 1 return true } return false } findCollapsesFromInsertedNodes (collapsedVertexIndexes) { const collapsedVertexIndex = new Array(1).fill(null) const it = this.iterator() let eiPrev = it.next() while (it.hasNext()) { const ei = it.next() const isCollapsed = this.findCollapseIndex(eiPrev, ei, collapsedVertexIndex) if (isCollapsed) collapsedVertexIndexes.add(new Integer(collapsedVertexIndex[0])) eiPrev = ei } } getEdge () { return this._edge } addEndpoints () { const maxSegIndex = this._edge.size() - 1 this.add(this._edge.getCoordinate(0), 0) this.add(this._edge.getCoordinate(maxSegIndex), maxSegIndex) } createSplitEdge (ei0, ei1) { let npts = ei1.segmentIndex - ei0.segmentIndex + 2 const lastSegStartPt = this._edge.getCoordinate(ei1.segmentIndex) const useIntPt1 = ei1.isInterior() || !ei1.coord.equals2D(lastSegStartPt) if (!useIntPt1) { npts-- } const pts = new Array(npts).fill(null) let ipt = 0 pts[ipt++] = new Coordinate(ei0.coord) for (let i = ei0.segmentIndex + 1; i <= ei1.segmentIndex; i++) { pts[ipt++] = this._edge.getCoordinate(i) } if (useIntPt1) pts[ipt] = new Coordinate(ei1.coord) return new NodedSegmentString(pts, this._edge.getData()) } add (intPt, segmentIndex) { const eiNew = new SegmentNode(this._edge, intPt, segmentIndex, this._edge.getSegmentOctant(segmentIndex)) const ei = this._nodeMap.get(eiNew) if (ei !== null) { Assert.isTrue(ei.coord.equals2D(intPt), 'Found equal nodes with different coordinates') return ei } this._nodeMap.put(eiNew, eiNew) return eiNew } checkSplitEdgesCorrectness (splitEdges) { const edgePts = this._edge.getCoordinates() const split0 = splitEdges.get(0) const pt0 = split0.getCoordinate(0) if (!pt0.equals2D(edgePts[0])) throw new RuntimeException('bad split edge start point at ' + pt0) const splitn = splitEdges.get(splitEdges.size() - 1) const splitnPts = splitn.getCoordinates() const ptn = splitnPts[splitnPts.length - 1] if (!ptn.equals2D(edgePts[edgePts.length - 1])) throw new RuntimeException('bad split edge end point at ' + ptn) } interfaces_ () { return [] } getClass () { return SegmentNodeList } } // class NodeVertexIterator { // constructor () { // this._nodeList = null // this._edge = null // this._nodeIt = null // this._currNode = null // this._nextNode = null // this._currSegIndex = 0 // let nodeList = arguments[0] // this._nodeList = nodeList // this._edge = nodeList.getEdge() // this._nodeIt = nodeList.iterator() // this.readNextNode() // } // next () { // if (this._currNode === null) { // this._currNode = this._nextNode // this._currSegIndex = this._currNode.segmentIndex // this.readNextNode() // return this._currNode // } // if (this._nextNode === null) return null // if (this._nextNode.segmentIndex === this._currNode.segmentIndex) { // this._currNode = this._nextNode // this._currSegIndex = this._currNode.segmentIndex // this.readNextNode() // return this._currNode // } // if (this._nextNode.segmentIndex > this._currNode.segmentIndex) {} // return null // } // remove () { // // throw new UnsupportedOperationException(this.getClass().getName()) // } // hasNext () { // if (this._nextNode === null) return false // return true // } // readNextNode () { // if (this._nodeIt.hasNext()) this._nextNode = this._nodeIt.next(); else this._nextNode = null // } // interfaces_ () { // return [Iterator] // } // getClass () { // return NodeVertexIterator // } // }