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
81 lines (79 loc) • 2.96 kB
JavaScript
import hasInterface from '../../../../hasInterface'
import GeometryFactory from '../geom/GeometryFactory'
import IsValidOp from '../operation/valid/IsValidOp'
import GeometryEditor from '../geom/util/GeometryEditor'
import BufferOp from '../operation/buffer/BufferOp'
import Polygonal from '../geom/Polygonal'
import PrecisionReducerCoordinateOperation from './PrecisionReducerCoordinateOperation'
export default class GeometryPrecisionReducer {
constructor() {
GeometryPrecisionReducer.constructor_.apply(this, arguments)
}
static constructor_() {
this._targetPM = null
this._removeCollapsed = true
this._changePrecisionModel = false
this._isPointwise = false
const pm = arguments[0]
this._targetPM = pm
}
static reduce(g, precModel) {
const reducer = new GeometryPrecisionReducer(precModel)
return reducer.reduce(g)
}
static reducePointwise(g, precModel) {
const reducer = new GeometryPrecisionReducer(precModel)
reducer.setPointwise(true)
return reducer.reduce(g)
}
fixPolygonalTopology(geom) {
let geomToBuffer = geom
if (!this._changePrecisionModel)
geomToBuffer = this.changePM(geom, this._targetPM)
const bufGeom = BufferOp.bufferOp(geomToBuffer, 0)
return bufGeom
}
reducePointwise(geom) {
let geomEdit = null
if (this._changePrecisionModel) {
const newFactory = this.createFactory(geom.getFactory(), this._targetPM)
geomEdit = new GeometryEditor(newFactory)
} else {
geomEdit = new GeometryEditor()
}
let finalRemoveCollapsed = this._removeCollapsed
if (geom.getDimension() >= 2) finalRemoveCollapsed = true
const reduceGeom = geomEdit.edit(geom, new PrecisionReducerCoordinateOperation(this._targetPM, finalRemoveCollapsed))
return reduceGeom
}
changePM(geom, newPM) {
const geomEditor = this.createEditor(geom.getFactory(), newPM)
return geomEditor.edit(geom, new GeometryEditor.NoOpGeometryOperation())
}
setRemoveCollapsedComponents(removeCollapsed) {
this._removeCollapsed = removeCollapsed
}
createFactory(inputFactory, pm) {
const newFactory = new GeometryFactory(pm, inputFactory.getSRID(), inputFactory.getCoordinateSequenceFactory())
return newFactory
}
setChangePrecisionModel(changePrecisionModel) {
this._changePrecisionModel = changePrecisionModel
}
reduce(geom) {
const reducePW = this.reducePointwise(geom)
if (this._isPointwise) return reducePW
if (!hasInterface(reducePW, Polygonal)) return reducePW
if (IsValidOp.isValid(reducePW)) return reducePW
return this.fixPolygonalTopology(reducePW)
}
setPointwise(isPointwise) {
this._isPointwise = isPointwise
}
createEditor(geomFactory, newPM) {
if (geomFactory.getPrecisionModel() === newPM) return new GeometryEditor()
const newFactory = this.createFactory(geomFactory, newPM)
const geomEdit = new GeometryEditor(newFactory)
return geomEdit
}
}