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
233 lines (230 loc) • 6.78 kB
JavaScript
import CGAlgorithms from '../../algorithm/CGAlgorithms'
import CoordinateList from '../../geom/CoordinateList'
import WKTWriter from '../../io/WKTWriter'
import CoordinateArraySequence from '../../geom/impl/CoordinateArraySequence'
import IsValidOp from '../valid/IsValidOp'
import LinearRing from '../../geom/LinearRing'
import Exception from '../../../../../java/lang/Exception'
import System from '../../../../../java/lang/System'
import CoordinateArrays from '../../geom/CoordinateArrays'
import ArrayList from '../../../../../java/util/ArrayList'
import Comparator from '../../../../../java/util/Comparator'
import Assert from '../../util/Assert'
export default class EdgeRing {
constructor () {
this._factory = null
this._deList = new ArrayList()
this._lowestEdge = null
this._ring = null
this._ringPts = null
this._holes = null
this._shell = null
this._isHole = null
this._isProcessed = false
this._isIncludedSet = false
this._isIncluded = false
let factory = arguments[0]
this._factory = factory
}
isIncluded () {
return this._isIncluded
}
getCoordinates () {
if (this._ringPts === null) {
const coordList = new CoordinateList()
for (let i = this._deList.iterator(); i.hasNext();) {
const de = i.next()
const edge = de.getEdge()
EdgeRing.addEdge(edge.getLine().getCoordinates(), de.getEdgeDirection(), coordList)
}
this._ringPts = coordList.toCoordinateArray()
}
return this._ringPts
}
isIncludedSet () {
return this._isIncludedSet
}
isValid () {
this.getCoordinates()
if (this._ringPts.length <= 3) return false
this.getRing()
return IsValidOp.isValid(this._ring)
}
build (startDE) {
let de = startDE
do {
this.add(de)
de.setRing(this)
de = de.getNext()
Assert.isTrue(de !== null, 'found null DE in ring')
Assert.isTrue(de === startDE || !de.isInRing(), 'found DE already in ring')
} while (de !== startDE)
}
isOuterHole () {
if (!this._isHole) return false
return !this.hasShell()
}
getPolygon () {
let holeLR = null
if (this._holes !== null) {
holeLR = new Array(this._holes.size()).fill(null)
for (let i = 0; i < this._holes.size(); i++) {
holeLR[i] = this._holes.get(i)
}
}
const poly = this._factory.createPolygon(this._ring, holeLR)
return poly
}
isHole () {
return this._isHole
}
isProcessed () {
return this._isProcessed
}
addHole () {
if (arguments[0] instanceof LinearRing) {
let hole = arguments[0]
if (this._holes === null) this._holes = new ArrayList()
this._holes.add(hole)
} else if (arguments[0] instanceof EdgeRing) {
let holeER = arguments[0]
holeER.setShell(this)
const hole = holeER.getRing()
if (this._holes === null) this._holes = new ArrayList()
this._holes.add(hole)
}
}
setIncluded (isIncluded) {
this._isIncluded = isIncluded
this._isIncludedSet = true
}
getOuterHole () {
if (this.isHole()) return null
for (let i = 0; i < this._deList.size(); i++) {
const de = this._deList.get(i)
const adjRing = de.getSym().getRing()
if (adjRing.isOuterHole()) return adjRing
}
return null
}
computeHole () {
const ring = this.getRing()
this._isHole = CGAlgorithms.isCCW(ring.getCoordinates())
}
hasShell () {
return this._shell !== null
}
isOuterShell () {
return this.getOuterHole() !== null
}
getLineString () {
this.getCoordinates()
return this._factory.createLineString(this._ringPts)
}
toString () {
return WKTWriter.toLineString(new CoordinateArraySequence(this.getCoordinates()))
}
getShell () {
if (this.isHole()) return this._shell
return this
}
add (de) {
this._deList.add(de)
}
getRing () {
if (this._ring !== null) return this._ring
this.getCoordinates()
if (this._ringPts.length < 3) System.out.println(this._ringPts)
try {
this._ring = this._factory.createLinearRing(this._ringPts)
} catch (ex) {
if (ex instanceof Exception) {
System.out.println(this._ringPts)
} else throw ex
} finally {}
return this._ring
}
updateIncluded () {
if (this.isHole()) return null
for (let i = 0; i < this._deList.size(); i++) {
const de = this._deList.get(i)
const adjShell = de.getSym().getRing().getShell()
if (adjShell !== null && adjShell.isIncludedSet()) {
this.setIncluded(!adjShell.isIncluded())
return null
}
}
}
setShell (shell) {
this._shell = shell
}
setProcessed (isProcessed) {
this._isProcessed = isProcessed
}
interfaces_ () {
return []
}
getClass () {
return EdgeRing
}
static findDirEdgesInRing (startDE) {
let de = startDE
const edges = new ArrayList()
do {
edges.add(de)
de = de.getNext()
Assert.isTrue(de !== null, 'found null DE in ring')
Assert.isTrue(de === startDE || !de.isInRing(), 'found DE already in ring')
} while (de !== startDE)
return edges
}
static addEdge (coords, isForward, coordList) {
if (isForward) {
for (let i = 0; i < coords.length; i++) {
coordList.add(coords[i], false)
}
} else {
for (let i = coords.length - 1; i >= 0; i--) {
coordList.add(coords[i], false)
}
}
}
static findEdgeRingContaining (testEr, shellList) {
const testRing = testEr.getRing()
const testEnv = testRing.getEnvelopeInternal()
let testPt = testRing.getCoordinateN(0)
let minShell = null
let minShellEnv = null
for (const it = shellList.iterator(); it.hasNext();) {
const tryShell = it.next()
const tryShellRing = tryShell.getRing()
const tryShellEnv = tryShellRing.getEnvelopeInternal()
if (tryShellEnv.equals(testEnv)) continue
if (!tryShellEnv.contains(testEnv)) continue
testPt = CoordinateArrays.ptNotInList(testRing.getCoordinates(), tryShellRing.getCoordinates())
let isContained = false
if (CGAlgorithms.isPointInRing(testPt, tryShellRing.getCoordinates())) isContained = true
if (isContained) {
if (minShell === null || minShellEnv.contains(tryShellEnv)) {
minShell = tryShell
minShellEnv = minShell.getRing().getEnvelopeInternal()
}
}
}
return minShell
}
static EnvelopeComparator () { return EnvelopeComparator }
}
class EnvelopeComparator {
compare (obj0, obj1) {
const r0 = obj0
const r1 = obj1
return r0.getRing().getEnvelope().compareTo(r1.getRing().getEnvelope())
}
interfaces_ () {
return [Comparator]
}
getClass () {
return EnvelopeComparator
}
}