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

115 lines (112 loc) 3.53 kB
import StringBuffer from '../../../../../java/lang/StringBuffer' import CGAlgorithms from '../../algorithm/CGAlgorithms' import Coordinate from '../../geom/Coordinate' import Double from '../../../../../java/lang/Double' import Envelope from '../../geom/Envelope' export default class FacetSequence { constructor () { this._pts = null this._start = null this._end = null this._pt = new Coordinate() this._seqPt = new Coordinate() this._p0 = new Coordinate() this._p1 = new Coordinate() this._q0 = new Coordinate() this._q1 = new Coordinate() if (arguments.length === 2) { const pts = arguments[0] const start = arguments[1] this._pts = pts this._start = start this._end = start + 1 } else if (arguments.length === 3) { const pts = arguments[0] const start = arguments[1] const end = arguments[2] this._pts = pts this._start = start this._end = end } } size () { return this._end - this._start } computeLineLineDistance (facetSeq) { let minDistance = Double.MAX_VALUE for (let i = this._start; i < this._end - 1; i++) { for (let j = facetSeq._start; j < facetSeq._end - 1; j++) { this._pts.getCoordinate(i, this._p0) this._pts.getCoordinate(i + 1, this._p1) facetSeq._pts.getCoordinate(j, this._q0) facetSeq._pts.getCoordinate(j + 1, this._q1) const dist = CGAlgorithms.distanceLineLine(this._p0, this._p1, this._q0, this._q1) if (dist === 0.0) return 0.0 if (dist < minDistance) { minDistance = dist } } } return minDistance } getCoordinate (index) { return this._pts.getCoordinate(this._start + index) } getEnvelope () { const env = new Envelope() for (let i = this._start; i < this._end; i++) { env.expandToInclude(this._pts.getX(i), this._pts.getY(i)) } return env } computePointLineDistance (pt, facetSeq) { let minDistance = Double.MAX_VALUE for (let i = facetSeq._start; i < facetSeq._end - 1; i++) { facetSeq._pts.getCoordinate(i, this._q0) facetSeq._pts.getCoordinate(i + 1, this._q1) const dist = CGAlgorithms.distancePointLine(pt, this._q0, this._q1) if (dist === 0.0) return 0.0 if (dist < minDistance) { minDistance = dist } } return minDistance } toString () { const buf = new StringBuffer() buf.append('LINESTRING ( ') const p = new Coordinate() for (let i = this._start; i < this._end; i++) { if (i > this._start) buf.append(', ') this._pts.getCoordinate(i, p) buf.append(p.x + ' ' + p.y) } buf.append(' )') return buf.toString() } isPoint () { return this._end - this._start === 1 } distance (facetSeq) { const isPoint = this.isPoint() const isPointOther = facetSeq.isPoint() if (isPoint && isPointOther) { this._pts.getCoordinate(this._start, this._pt) facetSeq._pts.getCoordinate(facetSeq._start, this._seqPt) return this._pt.distance(this._seqPt) } else if (isPoint) { this._pts.getCoordinate(this._start, this._pt) return this.computePointLineDistance(this._pt, facetSeq) } else if (isPointOther) { facetSeq._pts.getCoordinate(facetSeq._start, this._seqPt) return this.computePointLineDistance(this._seqPt, this) } return this.computeLineLineDistance(facetSeq) } interfaces_ () { return [] } getClass () { return FacetSequence } }