MarkerClusterer.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <template>
  2. <span>
  3. <slot></slot>
  4. </span>
  5. </template>
  6. <script>
  7. import MarkerClusterer from 'bmaplib.markerclusterer'
  8. import { createSize } from '../base/factory.js'
  9. import commonMixin from '../base/mixins/common.js'
  10. const markers = [];
  11. export default {
  12. name: 'bml-marker-clusterer',
  13. mixins: [commonMixin('markerClusterer')],
  14. provide() {
  15. return {
  16. Cluster: this
  17. }
  18. },
  19. props: {
  20. gridSize: {
  21. type: Number
  22. },
  23. maxZoom: {
  24. type: Number
  25. },
  26. minClusterSize: {
  27. type: Number
  28. },
  29. styles: {
  30. type: Array,
  31. default() {
  32. return []
  33. }
  34. },
  35. averageCenter: {
  36. type: Boolean,
  37. default: false
  38. }
  39. },
  40. data() {
  41. return {
  42. }
  43. },
  44. watch: {
  45. gridSize: {
  46. handler(val) {
  47. const { BMap, originInstance } = this
  48. originInstance.setGridSize(val)
  49. },
  50. deep: true
  51. },
  52. maxZoom(val) {
  53. const { originInstance } = this
  54. originInstance.setMaxZoom(val)
  55. },
  56. minClusterSize: {
  57. handler(val) {
  58. const { BMap, originInstance } = this
  59. originInstance.setMinClusterSize(val)
  60. },
  61. deep: true
  62. },
  63. styles: {
  64. handler(val) {
  65. const { BMap, originInstance } = this
  66. const obj = JSON.parse(JSON.stringify(val)).map(item => {
  67. item.size = item.size && createSize(BMap, item.size)
  68. return item
  69. })
  70. originInstance.setStyles(obj)
  71. },
  72. deep: true
  73. },
  74. averageCenter(val) {
  75. this.reload()
  76. }
  77. },
  78. methods: {
  79. load() {
  80. const { BMap, map, gridSize, minClusterSize, maxZoom, styles, averageCenter } = this
  81. this.originInstance = new MarkerClusterer(map, {
  82. gridSize: gridSize ||60,
  83. maxZoom,
  84. minClusterSize: minClusterSize || 2,
  85. styles: styles.map(item => {
  86. item.size = createSize(BMap, item.size)
  87. return item
  88. }),
  89. isAverageCenter: averageCenter
  90. })
  91. this.$nextTick(() => {
  92. const markersInstance = markers.map(inst => inst.originInstance).filter(marker => marker instanceof BMap.Marker)
  93. this.originInstance.addMarkers(markersInstance)
  94. })
  95. },
  96. addMaker(maker) {
  97. markers.push(maker);
  98. },
  99. removeMaker(maker) {
  100. markers.splice(markers.indexOf(maker), 1);
  101. }
  102. },
  103. beforeCreate() {
  104. this.preventChildrenRender = true
  105. }
  106. }
  107. </script>