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
80 lines (79 loc) • 2.92 kB
JavaScript
import LineString from '../geom/LineString'
import HashMap from '../../../../java/util/HashMap'
import GeometryTransformer from '../geom/util/GeometryTransformer'
import TaggedLinesSimplifier from './TaggedLinesSimplifier'
import IllegalArgumentException from '../../../../java/lang/IllegalArgumentException'
import GeometryComponentFilter from '../geom/GeometryComponentFilter'
import TaggedLineString from './TaggedLineString'
export default class TopologyPreservingSimplifier {
constructor() {
TopologyPreservingSimplifier.constructor_.apply(this, arguments)
}
static constructor_() {
this._inputGeom = null
this._lineSimplifier = new TaggedLinesSimplifier()
this._linestringMap = null
const inputGeom = arguments[0]
this._inputGeom = inputGeom
}
static simplify(geom, distanceTolerance) {
const tss = new TopologyPreservingSimplifier(geom)
tss.setDistanceTolerance(distanceTolerance)
return tss.getResultGeometry()
}
getResultGeometry() {
if (this._inputGeom.isEmpty()) return this._inputGeom.copy()
this._linestringMap = new HashMap()
this._inputGeom.apply(new LineStringMapBuilderFilter(this))
this._lineSimplifier.simplify(this._linestringMap.values())
const result = new LineStringTransformer(this._linestringMap).transform(this._inputGeom)
return result
}
setDistanceTolerance(distanceTolerance) {
if (distanceTolerance < 0.0) throw new IllegalArgumentException('Tolerance must be non-negative')
this._lineSimplifier.setDistanceTolerance(distanceTolerance)
}
}
class LineStringTransformer extends GeometryTransformer {
constructor() {
super()
LineStringTransformer.constructor_.apply(this, arguments)
}
static constructor_() {
this._linestringMap = null
const linestringMap = arguments[0]
this._linestringMap = linestringMap
}
transformCoordinates(coords, parent) {
if (coords.size() === 0) return null
if (parent instanceof LineString) {
const taggedLine = this._linestringMap.get(parent)
return this.createCoordinateSequence(taggedLine.getResultCoordinates())
}
return super.transformCoordinates.call(this, coords, parent)
}
}
class LineStringMapBuilderFilter {
constructor() {
LineStringMapBuilderFilter.constructor_.apply(this, arguments)
}
static constructor_() {
this.tps = null
const tps = arguments[0]
this.tps = tps
}
filter(geom) {
if (geom instanceof LineString) {
const line = geom
if (line.isEmpty()) return null
const minSize = line.isClosed() ? 4 : 2
const taggedLine = new TaggedLineString(line, minSize)
this.tps._linestringMap.put(line, taggedLine)
}
}
get interfaces_() {
return [GeometryComponentFilter]
}
}
TopologyPreservingSimplifier.LineStringTransformer = LineStringTransformer
TopologyPreservingSimplifier.LineStringMapBuilderFilter = LineStringMapBuilderFilter