UNPKG

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

159 lines (154 loc) 4.72 kB
import Coordinate from '../../geom/Coordinate' import Polygon from '../../geom/Polygon' import RectangleLineIntersector from '../../algorithm/RectangleLineIntersector' import ShortCircuitedGeometryVisitor from '../../geom/util/ShortCircuitedGeometryVisitor' import SimplePointInAreaLocator from '../../algorithm/locate/SimplePointInAreaLocator' import LinearComponentExtracter from '../../geom/util/LinearComponentExtracter' export default class RectangleIntersects { constructor (rectangle) { this._rectangle = null this._rectEnv = null this._rectangle = rectangle this._rectEnv = rectangle.getEnvelopeInternal() } intersects (geom) { if (!this._rectEnv.intersects(geom.getEnvelopeInternal())) return false var visitor = new EnvelopeIntersectsVisitor(this._rectEnv) visitor.applyTo(geom) if (visitor.intersects()) return true var ecpVisitor = new GeometryContainsPointVisitor(this._rectangle) ecpVisitor.applyTo(geom) if (ecpVisitor.containsPoint()) return true var riVisitor = new RectangleIntersectsSegmentVisitor(this._rectangle) riVisitor.applyTo(geom) if (riVisitor.intersects()) return true return false } interfaces_ () { return [] } getClass () { return RectangleIntersects } static intersects (rectangle, b) { var rp = new RectangleIntersects(rectangle) return rp.intersects(b) } } class EnvelopeIntersectsVisitor extends ShortCircuitedGeometryVisitor { constructor (rectEnv) { super() this._rectEnv = null this._intersects = false this._rectEnv = rectEnv } isDone () { return this._intersects === true } visit (element) { var elementEnv = element.getEnvelopeInternal() if (!this._rectEnv.intersects(elementEnv)) { return null } if (this._rectEnv.contains(elementEnv)) { this._intersects = true return null } if (elementEnv.getMinX() >= this._rectEnv.getMinX() && elementEnv.getMaxX() <= this._rectEnv.getMaxX()) { this._intersects = true return null } if (elementEnv.getMinY() >= this._rectEnv.getMinY() && elementEnv.getMaxY() <= this._rectEnv.getMaxY()) { this._intersects = true return null } } intersects () { return this._intersects } interfaces_ () { return [] } getClass () { return EnvelopeIntersectsVisitor } } class GeometryContainsPointVisitor extends ShortCircuitedGeometryVisitor { constructor (rectangle) { super() this._containsPoint = false this._rectSeq = rectangle.getExteriorRing().getCoordinateSequence() || null this._rectEnv = rectangle.getEnvelopeInternal() || null } isDone () { return this._containsPoint === true } visit (geom) { if (!(geom instanceof Polygon)) return null var elementEnv = geom.getEnvelopeInternal() if (!this._rectEnv.intersects(elementEnv)) return null var rectPt = new Coordinate() for (var i = 0; i < 4; i++) { this._rectSeq.getCoordinate(i, rectPt) if (!elementEnv.contains(rectPt)) continue if (SimplePointInAreaLocator.containsPointInPolygon(rectPt, geom)) { this._containsPoint = true return null } } } containsPoint () { return this._containsPoint } interfaces_ () { return [] } getClass () { return GeometryContainsPointVisitor } } class RectangleIntersectsSegmentVisitor extends ShortCircuitedGeometryVisitor { constructor (rectangle) { super() this._p0 = new Coordinate() this._p1 = new Coordinate() this._rectEnv = rectangle.getEnvelopeInternal() || null this._rectIntersector = new RectangleLineIntersector(this._rectEnv) || false } intersects () { return this._hasIntersection } isDone () { return this._hasIntersection === true } visit (geom) { var elementEnv = geom.getEnvelopeInternal() if (!this._rectEnv.intersects(elementEnv)) return null var lines = LinearComponentExtracter.getLines(geom) this.checkIntersectionWithLineStrings(lines) } checkIntersectionWithLineStrings (lines) { for (var i = lines.iterator(); i.hasNext();) { var testLine = i.next() this.checkIntersectionWithSegments(testLine) if (this._hasIntersection) return null } } checkIntersectionWithSegments (testLine) { var seq1 = testLine.getCoordinateSequence() for (var j = 1; j < seq1.size(); j++) { seq1.getCoordinate(j - 1, this._p0) seq1.getCoordinate(j, this._p1) if (this._rectIntersector.intersects(this._p0, this._p1)) { this._hasIntersection = true return null } } } interfaces_ () { return [] } getClass () { return RectangleIntersectsSegmentVisitor } }