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
171 lines (166 loc) • 5.58 kB
JavaScript
import LineString from '../../geom/LineString'
import Geometry from '../../geom/Geometry'
import PolygonizeGraph from './PolygonizeGraph'
import hasInterface from '../../../../../hasInterface'
import GeometryFactory from '../../geom/GeometryFactory'
import Collection from '../../../../../java/util/Collection'
import Collections from '../../../../../java/util/Collections'
import EdgeRing from './EdgeRing'
import GeometryComponentFilter from '../../geom/GeometryComponentFilter'
import ArrayList from '../../../../../java/util/ArrayList'
import HoleAssigner from './HoleAssigner'
export default class Polygonizer {
constructor() {
Polygonizer.constructor_.apply(this, arguments)
}
static constructor_() {
this._lineStringAdder = new LineStringAdder(this)
this._graph = null
this._dangles = new ArrayList()
this._cutEdges = new ArrayList()
this._invalidRingLines = new ArrayList()
this._holeList = null
this._shellList = null
this._polyList = null
this._isCheckingRingsValid = true
this._extractOnlyPolygonal = null
this._geomFactory = null
if (arguments.length === 0) {
Polygonizer.constructor_.call(this, false)
} else if (arguments.length === 1) {
const extractOnlyPolygonal = arguments[0]
this._extractOnlyPolygonal = extractOnlyPolygonal
}
}
static extractPolygons(shellList, includeAll) {
const polyList = new ArrayList()
for (let i = shellList.iterator(); i.hasNext(); ) {
const er = i.next()
if (includeAll || er.isIncluded())
polyList.add(er.getPolygon())
}
return polyList
}
static findOuterShells(shellList) {
for (let i = shellList.iterator(); i.hasNext(); ) {
const er = i.next()
const outerHoleER = er.getOuterHole()
if (outerHoleER !== null && !outerHoleER.isProcessed()) {
er.setIncluded(true)
outerHoleER.setProcessed(true)
}
}
}
static findDisjointShells(shellList) {
Polygonizer.findOuterShells(shellList)
let isMoreToScan = null
do {
isMoreToScan = false
for (let i = shellList.iterator(); i.hasNext(); ) {
const er = i.next()
if (er.isIncludedSet()) continue
er.updateIncluded()
if (!er.isIncludedSet())
isMoreToScan = true
}
} while (isMoreToScan)
}
getGeometry() {
if (this._geomFactory === null) this._geomFactory = new GeometryFactory()
this.polygonize()
if (this._extractOnlyPolygonal)
return this._geomFactory.buildGeometry(this._polyList)
return this._geomFactory.createGeometryCollection(GeometryFactory.toGeometryArray(this._polyList))
}
getInvalidRingLines() {
this.polygonize()
return this._invalidRingLines
}
findValidRings(edgeRingList, validEdgeRingList, invalidRingList) {
for (let i = edgeRingList.iterator(); i.hasNext(); ) {
const er = i.next()
if (er.isValid()) validEdgeRingList.add(er); else invalidRingList.add(er.getLineString())
}
}
polygonize() {
if (this._polyList !== null) return null
this._polyList = new ArrayList()
if (this._graph === null) return null
this._dangles = this._graph.deleteDangles()
this._cutEdges = this._graph.deleteCutEdges()
const edgeRingList = this._graph.getEdgeRings()
let validEdgeRingList = new ArrayList()
this._invalidRingLines = new ArrayList()
if (this._isCheckingRingsValid)
this.findValidRings(edgeRingList, validEdgeRingList, this._invalidRingLines)
else
validEdgeRingList = edgeRingList
this.findShellsAndHoles(validEdgeRingList)
HoleAssigner.assignHolesToShells(this._holeList, this._shellList)
Collections.sort(this._shellList, new EdgeRing.EnvelopeComparator())
let includeAll = true
if (this._extractOnlyPolygonal) {
Polygonizer.findDisjointShells(this._shellList)
includeAll = false
}
this._polyList = Polygonizer.extractPolygons(this._shellList, includeAll)
}
getDangles() {
this.polygonize()
return this._dangles
}
getCutEdges() {
this.polygonize()
return this._cutEdges
}
getPolygons() {
this.polygonize()
return this._polyList
}
add() {
if (hasInterface(arguments[0], Collection)) {
const geomList = arguments[0]
for (let i = geomList.iterator(); i.hasNext(); ) {
const geometry = i.next()
this.add(geometry)
}
} else if (arguments[0] instanceof LineString) {
const line = arguments[0]
this._geomFactory = line.getFactory()
if (this._graph === null) this._graph = new PolygonizeGraph(this._geomFactory)
this._graph.addEdge(line)
} else if (arguments[0] instanceof Geometry) {
const g = arguments[0]
g.apply(this._lineStringAdder)
}
}
setCheckRingsValid(isCheckingRingsValid) {
this._isCheckingRingsValid = isCheckingRingsValid
}
findShellsAndHoles(edgeRingList) {
this._holeList = new ArrayList()
this._shellList = new ArrayList()
for (let i = edgeRingList.iterator(); i.hasNext(); ) {
const er = i.next()
er.computeHole()
if (er.isHole()) this._holeList.add(er); else this._shellList.add(er)
}
}
}
class LineStringAdder {
constructor() {
LineStringAdder.constructor_.apply(this, arguments)
}
static constructor_() {
this.p = null
const p = arguments[0]
this.p = p
}
filter(g) {
if (g instanceof LineString) this.p.add(g)
}
get interfaces_() {
return [GeometryComponentFilter]
}
}
Polygonizer.LineStringAdder = LineStringAdder