| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- 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
- }
- }
|