LineSegmentIndex.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import Quadtree from '../index/quadtree/Quadtree'
  2. import ItemVisitor from '../index/ItemVisitor'
  3. import LineSegment from '../geom/LineSegment'
  4. import ArrayList from '../../../../java/util/ArrayList'
  5. import Envelope from '../geom/Envelope'
  6. import TaggedLineString from './TaggedLineString'
  7. export default class LineSegmentIndex {
  8. constructor() {
  9. LineSegmentIndex.constructor_.apply(this, arguments)
  10. }
  11. static constructor_() {
  12. this._index = new Quadtree()
  13. }
  14. remove(seg) {
  15. this._index.remove(new Envelope(seg.p0, seg.p1), seg)
  16. }
  17. add() {
  18. if (arguments[0] instanceof TaggedLineString) {
  19. const line = arguments[0]
  20. const segs = line.getSegments()
  21. for (let i = 0; i < segs.length; i++) {
  22. const seg = segs[i]
  23. this.add(seg)
  24. }
  25. } else if (arguments[0] instanceof LineSegment) {
  26. const seg = arguments[0]
  27. this._index.insert(new Envelope(seg.p0, seg.p1), seg)
  28. }
  29. }
  30. query(querySeg) {
  31. const env = new Envelope(querySeg.p0, querySeg.p1)
  32. const visitor = new LineSegmentVisitor(querySeg)
  33. this._index.query(env, visitor)
  34. const itemsFound = visitor.getItems()
  35. return itemsFound
  36. }
  37. }
  38. class LineSegmentVisitor {
  39. constructor() {
  40. LineSegmentVisitor.constructor_.apply(this, arguments)
  41. }
  42. static constructor_() {
  43. this._querySeg = null
  44. this._items = new ArrayList()
  45. const querySeg = arguments[0]
  46. this._querySeg = querySeg
  47. }
  48. visitItem(item) {
  49. const seg = item
  50. if (Envelope.intersects(seg.p0, seg.p1, this._querySeg.p0, this._querySeg.p1)) this._items.add(item)
  51. }
  52. getItems() {
  53. return this._items
  54. }
  55. get interfaces_() {
  56. return [ItemVisitor]
  57. }
  58. }