PreparedPolygon.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import PreparedPolygonIntersects from './PreparedPolygonIntersects'
  2. import FastSegmentSetIntersectionFinder from '../../noding/FastSegmentSetIntersectionFinder'
  3. import SegmentStringUtil from '../../noding/SegmentStringUtil'
  4. import PreparedPolygonContainsProperly from './PreparedPolygonContainsProperly'
  5. import PreparedPolygonContains from './PreparedPolygonContains'
  6. import PreparedPolygonCovers from './PreparedPolygonCovers'
  7. import BasicPreparedGeometry from './BasicPreparedGeometry'
  8. import IndexedPointInAreaLocator from '../../algorithm/locate/IndexedPointInAreaLocator'
  9. import RectangleContains from '../../operation/predicate/RectangleContains'
  10. import RectangleIntersects from '../../operation/predicate/RectangleIntersects'
  11. export default class PreparedPolygon extends BasicPreparedGeometry {
  12. constructor() {
  13. super()
  14. PreparedPolygon.constructor_.apply(this, arguments)
  15. }
  16. static constructor_() {
  17. this._isRectangle = null
  18. this._segIntFinder = null
  19. this._pia = null
  20. const poly = arguments[0]
  21. BasicPreparedGeometry.constructor_.call(this, poly)
  22. this._isRectangle = this.getGeometry().isRectangle()
  23. }
  24. containsProperly(g) {
  25. if (!this.envelopeCovers(g)) return false
  26. return PreparedPolygonContainsProperly.containsProperly(this, g)
  27. }
  28. getPointLocator() {
  29. if (this._pia === null) this._pia = new IndexedPointInAreaLocator(this.getGeometry())
  30. return this._pia
  31. }
  32. covers(g) {
  33. if (!this.envelopeCovers(g)) return false
  34. if (this._isRectangle)
  35. return true
  36. return PreparedPolygonCovers.covers(this, g)
  37. }
  38. intersects(g) {
  39. if (!this.envelopesIntersect(g)) return false
  40. if (this._isRectangle)
  41. return RectangleIntersects.intersects(this.getGeometry(), g)
  42. return PreparedPolygonIntersects.intersects(this, g)
  43. }
  44. contains(g) {
  45. if (!this.envelopeCovers(g)) return false
  46. if (this._isRectangle)
  47. return RectangleContains.contains(this.getGeometry(), g)
  48. return PreparedPolygonContains.contains(this, g)
  49. }
  50. getIntersectionFinder() {
  51. if (this._segIntFinder === null) this._segIntFinder = new FastSegmentSetIntersectionFinder(SegmentStringUtil.extractSegmentStrings(this.getGeometry()))
  52. return this._segIntFinder
  53. }
  54. }