GeometryPrecisionReducer.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import hasInterface from '../../../../hasInterface'
  2. import GeometryFactory from '../geom/GeometryFactory'
  3. import IsValidOp from '../operation/valid/IsValidOp'
  4. import GeometryEditor from '../geom/util/GeometryEditor'
  5. import BufferOp from '../operation/buffer/BufferOp'
  6. import Polygonal from '../geom/Polygonal'
  7. import PrecisionReducerCoordinateOperation from './PrecisionReducerCoordinateOperation'
  8. export default class GeometryPrecisionReducer {
  9. constructor() {
  10. GeometryPrecisionReducer.constructor_.apply(this, arguments)
  11. }
  12. static constructor_() {
  13. this._targetPM = null
  14. this._removeCollapsed = true
  15. this._changePrecisionModel = false
  16. this._isPointwise = false
  17. const pm = arguments[0]
  18. this._targetPM = pm
  19. }
  20. static reduce(g, precModel) {
  21. const reducer = new GeometryPrecisionReducer(precModel)
  22. return reducer.reduce(g)
  23. }
  24. static reducePointwise(g, precModel) {
  25. const reducer = new GeometryPrecisionReducer(precModel)
  26. reducer.setPointwise(true)
  27. return reducer.reduce(g)
  28. }
  29. fixPolygonalTopology(geom) {
  30. let geomToBuffer = geom
  31. if (!this._changePrecisionModel)
  32. geomToBuffer = this.changePM(geom, this._targetPM)
  33. const bufGeom = BufferOp.bufferOp(geomToBuffer, 0)
  34. return bufGeom
  35. }
  36. reducePointwise(geom) {
  37. let geomEdit = null
  38. if (this._changePrecisionModel) {
  39. const newFactory = this.createFactory(geom.getFactory(), this._targetPM)
  40. geomEdit = new GeometryEditor(newFactory)
  41. } else {
  42. geomEdit = new GeometryEditor()
  43. }
  44. let finalRemoveCollapsed = this._removeCollapsed
  45. if (geom.getDimension() >= 2) finalRemoveCollapsed = true
  46. const reduceGeom = geomEdit.edit(geom, new PrecisionReducerCoordinateOperation(this._targetPM, finalRemoveCollapsed))
  47. return reduceGeom
  48. }
  49. changePM(geom, newPM) {
  50. const geomEditor = this.createEditor(geom.getFactory(), newPM)
  51. return geomEditor.edit(geom, new GeometryEditor.NoOpGeometryOperation())
  52. }
  53. setRemoveCollapsedComponents(removeCollapsed) {
  54. this._removeCollapsed = removeCollapsed
  55. }
  56. createFactory(inputFactory, pm) {
  57. const newFactory = new GeometryFactory(pm, inputFactory.getSRID(), inputFactory.getCoordinateSequenceFactory())
  58. return newFactory
  59. }
  60. setChangePrecisionModel(changePrecisionModel) {
  61. this._changePrecisionModel = changePrecisionModel
  62. }
  63. reduce(geom) {
  64. const reducePW = this.reducePointwise(geom)
  65. if (this._isPointwise) return reducePW
  66. if (!hasInterface(reducePW, Polygonal)) return reducePW
  67. if (IsValidOp.isValid(reducePW)) return reducePW
  68. return this.fixPolygonalTopology(reducePW)
  69. }
  70. setPointwise(isPointwise) {
  71. this._isPointwise = isPointwise
  72. }
  73. createEditor(geomFactory, newPM) {
  74. if (geomFactory.getPrecisionModel() === newPM) return new GeometryEditor()
  75. const newFactory = this.createFactory(geomFactory, newPM)
  76. const geomEdit = new GeometryEditor(newFactory)
  77. return geomEdit
  78. }
  79. }