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

119 lines (116 loc) 4.39 kB
import TreeSet from '../../../../../../java/util/TreeSet' import GeometryTransformer from '../../../geom/util/GeometryTransformer' import hasInterface from '../../../../../../hasInterface' import Double from '../../../../../../java/lang/Double' import LineStringSnapper from './LineStringSnapper' import PrecisionModel from '../../../geom/PrecisionModel' import Polygonal from '../../../geom/Polygonal' export default class GeometrySnapper { constructor() { GeometrySnapper.constructor_.apply(this, arguments) } static constructor_() { this._srcGeom = null const srcGeom = arguments[0] this._srcGeom = srcGeom } static snap(g0, g1, snapTolerance) { const snapGeom = new Array(2).fill(null) const snapper0 = new GeometrySnapper(g0) snapGeom[0] = snapper0.snapTo(g1, snapTolerance) const snapper1 = new GeometrySnapper(g1) snapGeom[1] = snapper1.snapTo(snapGeom[0], snapTolerance) return snapGeom } static computeOverlaySnapTolerance() { if (arguments.length === 1) { const g = arguments[0] let snapTolerance = GeometrySnapper.computeSizeBasedSnapTolerance(g) const pm = g.getPrecisionModel() if (pm.getType() === PrecisionModel.FIXED) { const fixedSnapTol = 1 / pm.getScale() * 2 / 1.415 if (fixedSnapTol > snapTolerance) snapTolerance = fixedSnapTol } return snapTolerance } else if (arguments.length === 2) { const g0 = arguments[0], g1 = arguments[1] return Math.min(GeometrySnapper.computeOverlaySnapTolerance(g0), GeometrySnapper.computeOverlaySnapTolerance(g1)) } } static computeSizeBasedSnapTolerance(g) { const env = g.getEnvelopeInternal() const minDimension = Math.min(env.getHeight(), env.getWidth()) const snapTol = minDimension * GeometrySnapper.SNAP_PRECISION_FACTOR return snapTol } static snapToSelf(geom, snapTolerance, cleanResult) { const snapper0 = new GeometrySnapper(geom) return snapper0.snapToSelf(snapTolerance, cleanResult) } snapTo(snapGeom, snapTolerance) { const snapPts = this.extractTargetCoordinates(snapGeom) const snapTrans = new SnapTransformer(snapTolerance, snapPts) return snapTrans.transform(this._srcGeom) } snapToSelf(snapTolerance, cleanResult) { const snapPts = this.extractTargetCoordinates(this._srcGeom) const snapTrans = new SnapTransformer(snapTolerance, snapPts, true) const snappedGeom = snapTrans.transform(this._srcGeom) let result = snappedGeom if (cleanResult && hasInterface(result, Polygonal)) result = snappedGeom.buffer(0) return result } computeSnapTolerance(ringPts) { const minSegLen = this.computeMinimumSegmentLength(ringPts) const snapTol = minSegLen / 10 return snapTol } extractTargetCoordinates(g) { const ptSet = new TreeSet() const pts = g.getCoordinates() for (let i = 0; i < pts.length; i++) ptSet.add(pts[i]) return ptSet.toArray(new Array(0).fill(null)) } computeMinimumSegmentLength(pts) { let minSegLen = Double.MAX_VALUE for (let i = 0; i < pts.length - 1; i++) { const segLen = pts[i].distance(pts[i + 1]) if (segLen < minSegLen) minSegLen = segLen } return minSegLen } } GeometrySnapper.SNAP_PRECISION_FACTOR = 1e-9 class SnapTransformer extends GeometryTransformer { constructor() { super() SnapTransformer.constructor_.apply(this, arguments) } static constructor_() { this._snapTolerance = null this._snapPts = null this._isSelfSnap = false if (arguments.length === 2) { const snapTolerance = arguments[0], snapPts = arguments[1] this._snapTolerance = snapTolerance this._snapPts = snapPts } else if (arguments.length === 3) { const snapTolerance = arguments[0], snapPts = arguments[1], isSelfSnap = arguments[2] this._snapTolerance = snapTolerance this._snapPts = snapPts this._isSelfSnap = isSelfSnap } } snapLine(srcPts, snapPts) { const snapper = new LineStringSnapper(srcPts, this._snapTolerance) snapper.setAllowSnappingToSourceVertices(this._isSelfSnap) return snapper.snapTo(snapPts) } transformCoordinates(coords, parent) { const srcPts = coords.toCoordinateArray() const newPts = this.snapLine(srcPts, this._snapPts) return this._factory.getCoordinateSequenceFactory().create(newPts) } }