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
236 lines (229 loc) • 6.99 kB
JavaScript
import Location from '../../geom/Location'
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 Orientation from '../../algorithm/Orientation'
import System from '../../../../../java/lang/System'
import CoordinateArrays from '../../geom/CoordinateArrays'
import ArrayList from '../../../../../java/util/ArrayList'
import Comparator from '../../../../../java/util/Comparator'
import IndexedPointInAreaLocator from '../../algorithm/locate/IndexedPointInAreaLocator'
import Assert from '../../util/Assert'
export default class EdgeRing {
constructor() {
EdgeRing.constructor_.apply(this, arguments)
}
static constructor_() {
this._factory = null
this._deList = new ArrayList()
this._lowestEdge = null
this._ring = null
this._locator = null
this._ringPts = null
this._holes = null
this._shell = null
this._isHole = null
this._isProcessed = false
this._isIncludedSet = false
this._isIncluded = false
const factory = arguments[0]
this._factory = factory
}
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, erList) {
const testRing = testEr.getRing()
const testEnv = testRing.getEnvelopeInternal()
let testPt = testRing.getCoordinateN(0)
let minRing = null
let minRingEnv = null
for (let it = erList.iterator(); it.hasNext(); ) {
const tryEdgeRing = it.next()
const tryRing = tryEdgeRing.getRing()
const tryShellEnv = tryRing.getEnvelopeInternal()
if (tryShellEnv.equals(testEnv)) continue
if (!tryShellEnv.contains(testEnv)) continue
testPt = CoordinateArrays.ptNotInList(testRing.getCoordinates(), tryEdgeRing.getCoordinates())
const isContained = tryEdgeRing.isInRing(testPt)
if (isContained)
if (minRing === null || minRingEnv.contains(tryShellEnv)) {
minRing = tryEdgeRing
minRingEnv = minRing.getRing().getEnvelopeInternal()
}
}
return minRing
}
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)
}
isInRing(pt) {
return Location.EXTERIOR !== this.getLocator().locate(pt)
}
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) {
const hole = arguments[0]
if (this._holes === null) this._holes = new ArrayList()
this._holes.add(hole)
} else if (arguments[0] instanceof EdgeRing) {
const 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 = Orientation.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()))
}
getLocator() {
if (this._locator === null)
this._locator = new IndexedPointInAreaLocator(this.getRing())
return this._locator
}
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
}
}
class EnvelopeComparator {
compare(obj0, obj1) {
const r0 = obj0
const r1 = obj1
return r0.getRing().getEnvelope().compareTo(r1.getRing().getEnvelope())
}
get interfaces_() {
return [Comparator]
}
}
EdgeRing.EnvelopeComparator = EnvelopeComparator