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
54 lines (52 loc) • 1.82 kB
JavaScript
import Noder from './Noder'
import MCIndexNoder from './MCIndexNoder'
import TopologyException from '../geom/TopologyException'
import RobustLineIntersector from '../algorithm/RobustLineIntersector'
import IntersectionAdder from './IntersectionAdder'
export default class IteratedNoder {
constructor() {
IteratedNoder.constructor_.apply(this, arguments)
}
static constructor_() {
this._pm = null
this._li = null
this._nodedSegStrings = null
this._maxIter = IteratedNoder.MAX_ITER
const pm = arguments[0]
this._li = new RobustLineIntersector()
this._pm = pm
this._li.setPrecisionModel(pm)
}
setMaximumIterations(maxIter) {
this._maxIter = maxIter
}
node(segStrings, numInteriorIntersections) {
const si = new IntersectionAdder(this._li)
const noder = new MCIndexNoder()
noder.setSegmentIntersector(si)
noder.computeNodes(segStrings)
this._nodedSegStrings = noder.getNodedSubstrings()
numInteriorIntersections[0] = si.numInteriorIntersections
}
computeNodes(segStrings) {
const numInteriorIntersections = new Array(1).fill(null)
this._nodedSegStrings = segStrings
let nodingIterationCount = 0
let lastNodesCreated = -1
do {
this.node(this._nodedSegStrings, numInteriorIntersections)
nodingIterationCount++
const nodesCreated = numInteriorIntersections[0]
if (lastNodesCreated > 0 && nodesCreated >= lastNodesCreated && nodingIterationCount > this._maxIter)
throw new TopologyException('Iterated noding failed to converge after ' + nodingIterationCount + ' iterations')
lastNodesCreated = nodesCreated
} while (lastNodesCreated > 0)
}
getNodedSubstrings() {
return this._nodedSegStrings
}
get interfaces_() {
return [Noder]
}
}
IteratedNoder.MAX_ITER = 5