Quadtree.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import Root from './Root'
  2. import SpatialIndex from '../SpatialIndex'
  3. import ArrayList from '../../../../../java/util/ArrayList'
  4. import ArrayListVisitor from '../ArrayListVisitor'
  5. import Serializable from '../../../../../java/io/Serializable'
  6. import Envelope from '../../geom/Envelope'
  7. export default class Quadtree {
  8. constructor() {
  9. Quadtree.constructor_.apply(this, arguments)
  10. }
  11. static constructor_() {
  12. this._root = null
  13. this._minExtent = 1.0
  14. this._root = new Root()
  15. }
  16. static ensureExtent(itemEnv, minExtent) {
  17. let minx = itemEnv.getMinX()
  18. let maxx = itemEnv.getMaxX()
  19. let miny = itemEnv.getMinY()
  20. let maxy = itemEnv.getMaxY()
  21. if (minx !== maxx && miny !== maxy) return itemEnv
  22. if (minx === maxx) {
  23. minx = minx - minExtent / 2.0
  24. maxx = maxx + minExtent / 2.0
  25. }
  26. if (miny === maxy) {
  27. miny = miny - minExtent / 2.0
  28. maxy = maxy + minExtent / 2.0
  29. }
  30. return new Envelope(minx, maxx, miny, maxy)
  31. }
  32. size() {
  33. if (this._root !== null) return this._root.size()
  34. return 0
  35. }
  36. insert(itemEnv, item) {
  37. this.collectStats(itemEnv)
  38. const insertEnv = Quadtree.ensureExtent(itemEnv, this._minExtent)
  39. this._root.insert(insertEnv, item)
  40. }
  41. query() {
  42. if (arguments.length === 1) {
  43. const searchEnv = arguments[0]
  44. const visitor = new ArrayListVisitor()
  45. this.query(searchEnv, visitor)
  46. return visitor.getItems()
  47. } else if (arguments.length === 2) {
  48. const searchEnv = arguments[0], visitor = arguments[1]
  49. this._root.visit(searchEnv, visitor)
  50. }
  51. }
  52. queryAll() {
  53. const foundItems = new ArrayList()
  54. this._root.addAllItems(foundItems)
  55. return foundItems
  56. }
  57. remove(itemEnv, item) {
  58. const posEnv = Quadtree.ensureExtent(itemEnv, this._minExtent)
  59. return this._root.remove(posEnv, item)
  60. }
  61. collectStats(itemEnv) {
  62. const delX = itemEnv.getWidth()
  63. if (delX < this._minExtent && delX > 0.0) this._minExtent = delX
  64. const delY = itemEnv.getHeight()
  65. if (delY < this._minExtent && delY > 0.0) this._minExtent = delY
  66. }
  67. depth() {
  68. if (this._root !== null) return this._root.depth()
  69. return 0
  70. }
  71. isEmpty() {
  72. if (this._root === null) return true
  73. return this._root.isEmpty()
  74. }
  75. get interfaces_() {
  76. return [SpatialIndex, Serializable]
  77. }
  78. }