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
122 lines (120 loc) • 4.03 kB
JavaScript
import Location from '../../geom/Location'
import GeometryFactory from '../../geom/GeometryFactory'
import Position from '../../geomgraph/Position'
import Polygon from '../../geom/Polygon'
import MultiPolygon from '../../geom/MultiPolygon'
import MaximalEdgeRing from '../overlay/MaximalEdgeRing'
import OverlayNodeFactory from '../overlay/OverlayNodeFactory'
import ArrayList from '../../../../../java/util/ArrayList'
import Assert from '../../util/Assert'
import PlanarGraph from '../../geomgraph/PlanarGraph'
export default class ConnectedInteriorTester {
constructor () {
this._geometryFactory = new GeometryFactory()
this._geomGraph = null
this._disconnectedRingcoord = null
let geomGraph = arguments[0]
this._geomGraph = geomGraph
}
visitInteriorRing (ring, graph) {
const pts = ring.getCoordinates()
const pt0 = pts[0]
const pt1 = ConnectedInteriorTester.findDifferentPoint(pts, pt0)
const e = graph.findEdgeInSameDirection(pt0, pt1)
const de = graph.findEdgeEnd(e)
let intDe = null
if (de.getLabel().getLocation(0, Position.RIGHT) === Location.INTERIOR) {
intDe = de
} else if (de.getSym().getLabel().getLocation(0, Position.RIGHT) === Location.INTERIOR) {
intDe = de.getSym()
}
Assert.isTrue(intDe !== null, 'unable to find dirEdge with Interior on RHS')
this.visitLinkedDirectedEdges(intDe)
}
visitShellInteriors (g, graph) {
if (g instanceof Polygon) {
const p = g
this.visitInteriorRing(p.getExteriorRing(), graph)
}
if (g instanceof MultiPolygon) {
const mp = g
for (let i = 0; i < mp.getNumGeometries(); i++) {
const p = mp.getGeometryN(i)
this.visitInteriorRing(p.getExteriorRing(), graph)
}
}
}
getCoordinate () {
return this._disconnectedRingcoord
}
setInteriorEdgesInResult (graph) {
for (const it = graph.getEdgeEnds().iterator(); it.hasNext();) {
const de = it.next()
if (de.getLabel().getLocation(0, Position.RIGHT) === Location.INTERIOR) {
de.setInResult(true)
}
}
}
visitLinkedDirectedEdges (start) {
const startDe = start
let de = start
do {
Assert.isTrue(de !== null, 'found null Directed Edge')
de.setVisited(true)
de = de.getNext()
} while (de !== startDe)
}
buildEdgeRings (dirEdges) {
const edgeRings = new ArrayList()
for (const it = dirEdges.iterator(); it.hasNext();) {
const de = it.next()
if (de.isInResult() && de.getEdgeRing() === null) {
const er = new MaximalEdgeRing(de, this._geometryFactory)
er.linkDirectedEdgesForMinimalEdgeRings()
const minEdgeRings = er.buildMinimalRings()
edgeRings.addAll(minEdgeRings)
}
}
return edgeRings
}
hasUnvisitedShellEdge (edgeRings) {
for (let i = 0; i < edgeRings.size(); i++) {
const er = edgeRings.get(i)
if (er.isHole()) continue
const edges = er.getEdges()
let de = edges.get(0)
if (de.getLabel().getLocation(0, Position.RIGHT) !== Location.INTERIOR) continue
for (let j = 0; j < edges.size(); j++) {
de = edges.get(j)
if (!de.isVisited()) {
this._disconnectedRingcoord = de.getCoordinate()
return true
}
}
}
return false
}
isInteriorsConnected () {
const splitEdges = new ArrayList()
this._geomGraph.computeSplitEdges(splitEdges)
const graph = new PlanarGraph(new OverlayNodeFactory())
graph.addEdges(splitEdges)
this.setInteriorEdgesInResult(graph)
graph.linkResultDirectedEdges()
const edgeRings = this.buildEdgeRings(graph.getEdgeEnds())
this.visitShellInteriors(this._geomGraph.getGeometry(), graph)
return !this.hasUnvisitedShellEdge(edgeRings)
}
interfaces_ () {
return []
}
getClass () {
return ConnectedInteriorTester
}
static findDifferentPoint (coord, pt) {
for (let i = 0; i < coord.length; i++) {
if (!coord[i].equals(pt)) return coord[i]
}
return null
}
}