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
63 lines (61 loc) • 2.63 kB
JavaScript
import hasInterface from '../../../../../hasInterface'
import SegmentIntersectionDetector from '../../noding/SegmentIntersectionDetector'
import SegmentStringUtil from '../../noding/SegmentStringUtil'
import Polygonal from '../Polygonal'
import PreparedPolygonPredicate from './PreparedPolygonPredicate'
export default class AbstractPreparedPolygonContains extends PreparedPolygonPredicate {
constructor (prepPoly) {
super(prepPoly)
this._requireSomePointInInterior = true
this._hasSegmentIntersection = false
this._hasProperIntersection = false
this._hasNonProperIntersection = false
}
eval (geom) {
const isAllInTargetArea = this.isAllTestComponentsInTarget(geom)
if (!isAllInTargetArea) return false
if (this._requireSomePointInInterior && geom.getDimension() === 0) {
const isAnyInTargetInterior = this.isAnyTestComponentInTargetInterior(geom)
return isAnyInTargetInterior
}
const properIntersectionImpliesNotContained = this.isProperIntersectionImpliesNotContainedSituation(geom)
this.findAndClassifyIntersections(geom)
if (properIntersectionImpliesNotContained && this._hasProperIntersection) return false
if (this._hasSegmentIntersection && !this._hasNonProperIntersection) return false
if (this._hasSegmentIntersection) {
return this.fullTopologicalPredicate(geom)
}
if (hasInterface(geom, Polygonal)) {
const isTargetInTestArea = this.isAnyTargetComponentInAreaTest(geom, this._prepPoly.getRepresentativePoints())
if (isTargetInTestArea) return false
}
return true
}
findAndClassifyIntersections (geom) {
const lineSegStr = SegmentStringUtil.extractSegmentStrings(geom)
const intDetector = new SegmentIntersectionDetector()
intDetector.setFindAllIntersectionTypes(true)
this._prepPoly.getIntersectionFinder().intersects(lineSegStr, intDetector)
this._hasSegmentIntersection = intDetector.hasIntersection()
this._hasProperIntersection = intDetector.hasProperIntersection()
this._hasNonProperIntersection = intDetector.hasNonProperIntersection()
}
isProperIntersectionImpliesNotContainedSituation (testGeom) {
if (hasInterface(testGeom, Polygonal)) return true
if (this.isSingleShell(this._prepPoly.getGeometry())) return true
return false
}
isSingleShell (geom) {
if (geom.getNumGeometries() !== 1) return false
const poly = geom.getGeometryN(0)
const numHoles = poly.getNumInteriorRing()
if (numHoles === 0) return true
return false
}
interfaces_ () {
return []
}
getClass () {
return AbstractPreparedPolygonContains
}
}