| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- import LineString from '../geom/LineString'
- import HashMap from '../../../../java/util/HashMap'
- import GeometryTransformer from '../geom/util/GeometryTransformer'
- import TaggedLinesSimplifier from './TaggedLinesSimplifier'
- import IllegalArgumentException from '../../../../java/lang/IllegalArgumentException'
- import GeometryComponentFilter from '../geom/GeometryComponentFilter'
- import TaggedLineString from './TaggedLineString'
- export default class TopologyPreservingSimplifier {
- constructor() {
- TopologyPreservingSimplifier.constructor_.apply(this, arguments)
- }
- static constructor_() {
- this._inputGeom = null
- this._lineSimplifier = new TaggedLinesSimplifier()
- this._linestringMap = null
- const inputGeom = arguments[0]
- this._inputGeom = inputGeom
- }
- static simplify(geom, distanceTolerance) {
- const tss = new TopologyPreservingSimplifier(geom)
- tss.setDistanceTolerance(distanceTolerance)
- return tss.getResultGeometry()
- }
- getResultGeometry() {
- if (this._inputGeom.isEmpty()) return this._inputGeom.copy()
- this._linestringMap = new HashMap()
- this._inputGeom.apply(new LineStringMapBuilderFilter(this))
- this._lineSimplifier.simplify(this._linestringMap.values())
- const result = new LineStringTransformer(this._linestringMap).transform(this._inputGeom)
- return result
- }
- setDistanceTolerance(distanceTolerance) {
- if (distanceTolerance < 0.0) throw new IllegalArgumentException('Tolerance must be non-negative')
- this._lineSimplifier.setDistanceTolerance(distanceTolerance)
- }
- }
- class LineStringTransformer extends GeometryTransformer {
- constructor() {
- super()
- LineStringTransformer.constructor_.apply(this, arguments)
- }
- static constructor_() {
- this._linestringMap = null
- const linestringMap = arguments[0]
- this._linestringMap = linestringMap
- }
- transformCoordinates(coords, parent) {
- if (coords.size() === 0) return null
- if (parent instanceof LineString) {
- const taggedLine = this._linestringMap.get(parent)
- return this.createCoordinateSequence(taggedLine.getResultCoordinates())
- }
- return super.transformCoordinates.call(this, coords, parent)
- }
- }
- class LineStringMapBuilderFilter {
- constructor() {
- LineStringMapBuilderFilter.constructor_.apply(this, arguments)
- }
- static constructor_() {
- this.tps = null
- const tps = arguments[0]
- this.tps = tps
- }
- filter(geom) {
- if (geom instanceof LineString) {
- const line = geom
- if (line.isEmpty()) return null
- const minSize = line.isClosed() ? 4 : 2
- const taggedLine = new TaggedLineString(line, minSize)
- this.tps._linestringMap.put(line, taggedLine)
- }
- }
- get interfaces_() {
- return [GeometryComponentFilter]
- }
- }
- TopologyPreservingSimplifier.LineStringTransformer = LineStringTransformer
- TopologyPreservingSimplifier.LineStringMapBuilderFilter = LineStringMapBuilderFilter
|