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
97 lines (90 loc) • 3.75 kB
JavaScript
import GeometryFactory from '../geom/GeometryFactory'
import RobustLineIntersector from '../algorithm/RobustLineIntersector'
import RuntimeException from '../../../../java/lang/RuntimeException'
export default class NodingValidator {
constructor() {
NodingValidator.constructor_.apply(this, arguments)
}
static constructor_() {
this._li = new RobustLineIntersector()
this._segStrings = null
const segStrings = arguments[0]
this._segStrings = segStrings
}
checkEndPtVertexIntersections() {
if (arguments.length === 0) {
for (let i = this._segStrings.iterator(); i.hasNext(); ) {
const ss = i.next()
const pts = ss.getCoordinates()
this.checkEndPtVertexIntersections(pts[0], this._segStrings)
this.checkEndPtVertexIntersections(pts[pts.length - 1], this._segStrings)
}
} else if (arguments.length === 2) {
const testPt = arguments[0], segStrings = arguments[1]
for (let i = segStrings.iterator(); i.hasNext(); ) {
const ss = i.next()
const pts = ss.getCoordinates()
for (let j = 1; j < pts.length - 1; j++)
if (pts[j].equals(testPt)) throw new RuntimeException('found endpt/interior pt intersection at index ' + j + ' :pt ' + testPt)
}
}
}
checkInteriorIntersections() {
if (arguments.length === 0) {
for (let i = this._segStrings.iterator(); i.hasNext(); ) {
const ss0 = i.next()
for (let j = this._segStrings.iterator(); j.hasNext(); ) {
const ss1 = j.next()
this.checkInteriorIntersections(ss0, ss1)
}
}
} else if (arguments.length === 2) {
const ss0 = arguments[0], ss1 = arguments[1]
const pts0 = ss0.getCoordinates()
const pts1 = ss1.getCoordinates()
for (let i0 = 0; i0 < pts0.length - 1; i0++)
for (let i1 = 0; i1 < pts1.length - 1; i1++)
this.checkInteriorIntersections(ss0, i0, ss1, i1)
} else if (arguments.length === 4) {
const e0 = arguments[0], segIndex0 = arguments[1], e1 = arguments[2], segIndex1 = arguments[3]
if (e0 === e1 && segIndex0 === segIndex1) return null
const p00 = e0.getCoordinates()[segIndex0]
const p01 = e0.getCoordinates()[segIndex0 + 1]
const p10 = e1.getCoordinates()[segIndex1]
const p11 = e1.getCoordinates()[segIndex1 + 1]
this._li.computeIntersection(p00, p01, p10, p11)
if (this._li.hasIntersection())
if (this._li.isProper() || this.hasInteriorIntersection(this._li, p00, p01) || this.hasInteriorIntersection(this._li, p10, p11))
throw new RuntimeException('found non-noded intersection at ' + p00 + '-' + p01 + ' and ' + p10 + '-' + p11)
}
}
checkValid() {
this.checkEndPtVertexIntersections()
this.checkInteriorIntersections()
this.checkCollapses()
}
checkCollapses() {
if (arguments.length === 0) {
for (let i = this._segStrings.iterator(); i.hasNext(); ) {
const ss = i.next()
this.checkCollapses(ss)
}
} else if (arguments.length === 1) {
const ss = arguments[0]
const pts = ss.getCoordinates()
for (let i = 0; i < pts.length - 2; i++)
this.checkCollapse(pts[i], pts[i + 1], pts[i + 2])
}
}
hasInteriorIntersection(li, p0, p1) {
for (let i = 0; i < li.getIntersectionNum(); i++) {
const intPt = li.getIntersection(i)
if (!(intPt.equals(p0) || intPt.equals(p1))) return true
}
return false
}
checkCollapse(p0, p1, p2) {
if (p0.equals(p2)) throw new RuntimeException('found non-noded collapse at ' + NodingValidator.fact.createLineString([p0, p1, p2]))
}
}
NodingValidator.fact = new GeometryFactory()