MCIndexSegmentSetMutualIntersector.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import SegmentSetMutualIntersector from './SegmentSetMutualIntersector'
  2. import STRtree from '../index/strtree/STRtree'
  3. import MonotoneChainOverlapAction from '../index/chain/MonotoneChainOverlapAction'
  4. import MonotoneChainBuilder from '../index/chain/MonotoneChainBuilder'
  5. import ArrayList from '../../../../java/util/ArrayList'
  6. export default class MCIndexSegmentSetMutualIntersector {
  7. constructor() {
  8. MCIndexSegmentSetMutualIntersector.constructor_.apply(this, arguments)
  9. }
  10. static constructor_() {
  11. this._index = new STRtree()
  12. const baseSegStrings = arguments[0]
  13. this.initBaseSegments(baseSegStrings)
  14. }
  15. addToIndex(segStr) {
  16. const segChains = MonotoneChainBuilder.getChains(segStr.getCoordinates(), segStr)
  17. for (let i = segChains.iterator(); i.hasNext(); ) {
  18. const mc = i.next()
  19. this._index.insert(mc.getEnvelope(), mc)
  20. }
  21. }
  22. addToMonoChains(segStr, monoChains) {
  23. const segChains = MonotoneChainBuilder.getChains(segStr.getCoordinates(), segStr)
  24. for (let i = segChains.iterator(); i.hasNext(); ) {
  25. const mc = i.next()
  26. monoChains.add(mc)
  27. }
  28. }
  29. process(segStrings, segInt) {
  30. const monoChains = new ArrayList()
  31. for (let i = segStrings.iterator(); i.hasNext(); )
  32. this.addToMonoChains(i.next(), monoChains)
  33. this.intersectChains(monoChains, segInt)
  34. }
  35. initBaseSegments(segStrings) {
  36. for (let i = segStrings.iterator(); i.hasNext(); )
  37. this.addToIndex(i.next())
  38. this._index.build()
  39. }
  40. getIndex() {
  41. return this._index
  42. }
  43. intersectChains(monoChains, segInt) {
  44. const overlapAction = new SegmentOverlapAction(segInt)
  45. for (let i = monoChains.iterator(); i.hasNext(); ) {
  46. const queryChain = i.next()
  47. const overlapChains = this._index.query(queryChain.getEnvelope())
  48. for (let j = overlapChains.iterator(); j.hasNext(); ) {
  49. const testChain = j.next()
  50. queryChain.computeOverlaps(testChain, overlapAction)
  51. if (segInt.isDone()) return null
  52. }
  53. }
  54. }
  55. get interfaces_() {
  56. return [SegmentSetMutualIntersector]
  57. }
  58. }
  59. class SegmentOverlapAction extends MonotoneChainOverlapAction {
  60. constructor() {
  61. super()
  62. SegmentOverlapAction.constructor_.apply(this, arguments)
  63. }
  64. static constructor_() {
  65. this._si = null
  66. const si = arguments[0]
  67. this._si = si
  68. }
  69. overlap() {
  70. if (arguments.length === 4) {
  71. const mc1 = arguments[0], start1 = arguments[1], mc2 = arguments[2], start2 = arguments[3]
  72. const ss1 = mc1.getContext()
  73. const ss2 = mc2.getContext()
  74. this._si.processIntersections(ss1, start1, ss2, start2)
  75. } else {
  76. return super.overlap.apply(this, arguments)
  77. }
  78. }
  79. }
  80. MCIndexSegmentSetMutualIntersector.SegmentOverlapAction = SegmentOverlapAction