| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- import LineString from '../../geom/LineString'
- import Geometry from '../../geom/Geometry'
- import PolygonizeGraph from './PolygonizeGraph'
- import hasInterface from '../../../../../hasInterface'
- import GeometryFactory from '../../geom/GeometryFactory'
- import Collection from '../../../../../java/util/Collection'
- import Collections from '../../../../../java/util/Collections'
- import EdgeRing from './EdgeRing'
- import GeometryComponentFilter from '../../geom/GeometryComponentFilter'
- import ArrayList from '../../../../../java/util/ArrayList'
- import HoleAssigner from './HoleAssigner'
- export default class Polygonizer {
- constructor() {
- Polygonizer.constructor_.apply(this, arguments)
- }
- static constructor_() {
- this._lineStringAdder = new LineStringAdder(this)
- this._graph = null
- this._dangles = new ArrayList()
- this._cutEdges = new ArrayList()
- this._invalidRingLines = new ArrayList()
- this._holeList = null
- this._shellList = null
- this._polyList = null
- this._isCheckingRingsValid = true
- this._extractOnlyPolygonal = null
- this._geomFactory = null
- if (arguments.length === 0) {
- Polygonizer.constructor_.call(this, false)
- } else if (arguments.length === 1) {
- const extractOnlyPolygonal = arguments[0]
- this._extractOnlyPolygonal = extractOnlyPolygonal
- }
- }
- static extractPolygons(shellList, includeAll) {
- const polyList = new ArrayList()
- for (let i = shellList.iterator(); i.hasNext(); ) {
- const er = i.next()
- if (includeAll || er.isIncluded())
- polyList.add(er.getPolygon())
-
- }
- return polyList
- }
- static findOuterShells(shellList) {
- for (let i = shellList.iterator(); i.hasNext(); ) {
- const er = i.next()
- const outerHoleER = er.getOuterHole()
- if (outerHoleER !== null && !outerHoleER.isProcessed()) {
- er.setIncluded(true)
- outerHoleER.setProcessed(true)
- }
- }
- }
- static findDisjointShells(shellList) {
- Polygonizer.findOuterShells(shellList)
- let isMoreToScan = null
- do {
- isMoreToScan = false
- for (let i = shellList.iterator(); i.hasNext(); ) {
- const er = i.next()
- if (er.isIncludedSet()) continue
- er.updateIncluded()
- if (!er.isIncludedSet())
- isMoreToScan = true
-
- }
- } while (isMoreToScan)
- }
- getGeometry() {
- if (this._geomFactory === null) this._geomFactory = new GeometryFactory()
- this.polygonize()
- if (this._extractOnlyPolygonal)
- return this._geomFactory.buildGeometry(this._polyList)
-
- return this._geomFactory.createGeometryCollection(GeometryFactory.toGeometryArray(this._polyList))
- }
- getInvalidRingLines() {
- this.polygonize()
- return this._invalidRingLines
- }
- findValidRings(edgeRingList, validEdgeRingList, invalidRingList) {
- for (let i = edgeRingList.iterator(); i.hasNext(); ) {
- const er = i.next()
- if (er.isValid()) validEdgeRingList.add(er); else invalidRingList.add(er.getLineString())
- }
- }
- polygonize() {
- if (this._polyList !== null) return null
- this._polyList = new ArrayList()
- if (this._graph === null) return null
- this._dangles = this._graph.deleteDangles()
- this._cutEdges = this._graph.deleteCutEdges()
- const edgeRingList = this._graph.getEdgeRings()
- let validEdgeRingList = new ArrayList()
- this._invalidRingLines = new ArrayList()
- if (this._isCheckingRingsValid)
- this.findValidRings(edgeRingList, validEdgeRingList, this._invalidRingLines)
- else
- validEdgeRingList = edgeRingList
-
- this.findShellsAndHoles(validEdgeRingList)
- HoleAssigner.assignHolesToShells(this._holeList, this._shellList)
- Collections.sort(this._shellList, new EdgeRing.EnvelopeComparator())
- let includeAll = true
- if (this._extractOnlyPolygonal) {
- Polygonizer.findDisjointShells(this._shellList)
- includeAll = false
- }
- this._polyList = Polygonizer.extractPolygons(this._shellList, includeAll)
- }
- getDangles() {
- this.polygonize()
- return this._dangles
- }
- getCutEdges() {
- this.polygonize()
- return this._cutEdges
- }
- getPolygons() {
- this.polygonize()
- return this._polyList
- }
- add() {
- if (hasInterface(arguments[0], Collection)) {
- const geomList = arguments[0]
- for (let i = geomList.iterator(); i.hasNext(); ) {
- const geometry = i.next()
- this.add(geometry)
- }
- } else if (arguments[0] instanceof LineString) {
- const line = arguments[0]
- this._geomFactory = line.getFactory()
- if (this._graph === null) this._graph = new PolygonizeGraph(this._geomFactory)
- this._graph.addEdge(line)
- } else if (arguments[0] instanceof Geometry) {
- const g = arguments[0]
- g.apply(this._lineStringAdder)
- }
- }
- setCheckRingsValid(isCheckingRingsValid) {
- this._isCheckingRingsValid = isCheckingRingsValid
- }
- findShellsAndHoles(edgeRingList) {
- this._holeList = new ArrayList()
- this._shellList = new ArrayList()
- for (let i = edgeRingList.iterator(); i.hasNext(); ) {
- const er = i.next()
- er.computeHole()
- if (er.isHole()) this._holeList.add(er); else this._shellList.add(er)
- }
- }
- }
- class LineStringAdder {
- constructor() {
- LineStringAdder.constructor_.apply(this, arguments)
- }
- static constructor_() {
- this.p = null
- const p = arguments[0]
- this.p = p
- }
- filter(g) {
- if (g instanceof LineString) this.p.add(g)
- }
- get interfaces_() {
- return [GeometryComponentFilter]
- }
- }
- Polygonizer.LineStringAdder = LineStringAdder
|