DouglasPeuckerSimplifier.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import DouglasPeuckerLineSimplifier from './DouglasPeuckerLineSimplifier'
  2. import GeometryTransformer from '../geom/util/GeometryTransformer'
  3. import IllegalArgumentException from '../../../../java/lang/IllegalArgumentException'
  4. import Polygon from '../geom/Polygon'
  5. import LinearRing from '../geom/LinearRing'
  6. import MultiPolygon from '../geom/MultiPolygon'
  7. export default class DouglasPeuckerSimplifier {
  8. constructor() {
  9. DouglasPeuckerSimplifier.constructor_.apply(this, arguments)
  10. }
  11. static constructor_() {
  12. this._inputGeom = null
  13. this._distanceTolerance = null
  14. this._isEnsureValidTopology = true
  15. const inputGeom = arguments[0]
  16. this._inputGeom = inputGeom
  17. }
  18. static simplify(geom, distanceTolerance) {
  19. const tss = new DouglasPeuckerSimplifier(geom)
  20. tss.setDistanceTolerance(distanceTolerance)
  21. return tss.getResultGeometry()
  22. }
  23. setEnsureValid(isEnsureValidTopology) {
  24. this._isEnsureValidTopology = isEnsureValidTopology
  25. }
  26. getResultGeometry() {
  27. if (this._inputGeom.isEmpty()) return this._inputGeom.copy()
  28. return new DPTransformer(this._isEnsureValidTopology, this._distanceTolerance).transform(this._inputGeom)
  29. }
  30. setDistanceTolerance(distanceTolerance) {
  31. if (distanceTolerance < 0.0) throw new IllegalArgumentException('Tolerance must be non-negative')
  32. this._distanceTolerance = distanceTolerance
  33. }
  34. }
  35. class DPTransformer extends GeometryTransformer {
  36. constructor() {
  37. super()
  38. DPTransformer.constructor_.apply(this, arguments)
  39. }
  40. static constructor_() {
  41. this._isEnsureValidTopology = true
  42. this._distanceTolerance = null
  43. const isEnsureValidTopology = arguments[0], distanceTolerance = arguments[1]
  44. this._isEnsureValidTopology = isEnsureValidTopology
  45. this._distanceTolerance = distanceTolerance
  46. }
  47. transformPolygon(geom, parent) {
  48. if (geom.isEmpty()) return null
  49. const rawGeom = super.transformPolygon.call(this, geom, parent)
  50. if (parent instanceof MultiPolygon)
  51. return rawGeom
  52. return this.createValidArea(rawGeom)
  53. }
  54. createValidArea(rawAreaGeom) {
  55. if (this._isEnsureValidTopology) return rawAreaGeom.buffer(0.0)
  56. return rawAreaGeom
  57. }
  58. transformCoordinates(coords, parent) {
  59. const inputPts = coords.toCoordinateArray()
  60. let newPts = null
  61. if (inputPts.length === 0)
  62. newPts = new Array(0).fill(null)
  63. else
  64. newPts = DouglasPeuckerLineSimplifier.simplify(inputPts, this._distanceTolerance)
  65. return this._factory.getCoordinateSequenceFactory().create(newPts)
  66. }
  67. transformMultiPolygon(geom, parent) {
  68. const rawGeom = super.transformMultiPolygon.call(this, geom, parent)
  69. return this.createValidArea(rawGeom)
  70. }
  71. transformLinearRing(geom, parent) {
  72. const removeDegenerateRings = parent instanceof Polygon
  73. const simpResult = super.transformLinearRing.call(this, geom, parent)
  74. if (removeDegenerateRings && !(simpResult instanceof LinearRing)) return null
  75. return simpResult
  76. }
  77. }
  78. DouglasPeuckerSimplifier.DPTransformer = DPTransformer