Key.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import Coordinate from '../../geom/Coordinate'
  2. import DoubleBits from './DoubleBits'
  3. import Envelope from '../../geom/Envelope'
  4. export default class Key {
  5. constructor() {
  6. Key.constructor_.apply(this, arguments)
  7. }
  8. static constructor_() {
  9. this._pt = new Coordinate()
  10. this._level = 0
  11. this._env = null
  12. const itemEnv = arguments[0]
  13. this.computeKey(itemEnv)
  14. }
  15. static computeQuadLevel(env) {
  16. const dx = env.getWidth()
  17. const dy = env.getHeight()
  18. const dMax = dx > dy ? dx : dy
  19. const level = DoubleBits.exponent(dMax) + 1
  20. return level
  21. }
  22. getLevel() {
  23. return this._level
  24. }
  25. computeKey() {
  26. if (arguments.length === 1) {
  27. const itemEnv = arguments[0]
  28. this._level = Key.computeQuadLevel(itemEnv)
  29. this._env = new Envelope()
  30. this.computeKey(this._level, itemEnv)
  31. while (!this._env.contains(itemEnv)) {
  32. this._level += 1
  33. this.computeKey(this._level, itemEnv)
  34. }
  35. } else if (arguments.length === 2) {
  36. const level = arguments[0], itemEnv = arguments[1]
  37. const quadSize = DoubleBits.powerOf2(level)
  38. this._pt.x = Math.floor(itemEnv.getMinX() / quadSize) * quadSize
  39. this._pt.y = Math.floor(itemEnv.getMinY() / quadSize) * quadSize
  40. this._env.init(this._pt.x, this._pt.x + quadSize, this._pt.y, this._pt.y + quadSize)
  41. }
  42. }
  43. getEnvelope() {
  44. return this._env
  45. }
  46. getCentre() {
  47. return new Coordinate((this._env.getMinX() + this._env.getMaxX()) / 2, (this._env.getMinY() + this._env.getMaxY()) / 2)
  48. }
  49. getPoint() {
  50. return this._pt
  51. }
  52. }