maplib.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. /**
  2. * @fileoverview MarkerClusterer标记聚合器用来解决加载大量点要素到地图上产生覆盖现象的问题,并提高性能。
  3. * 主入口类是<a href="symbols/BMapLib.MarkerClusterer.html">MarkerClusterer</a>,
  4. * 基于Baidu Map API 1.2。
  5. *
  6. * @author Baidu Map Api Group
  7. * @version 1.2
  8. */
  9. /**
  10. * @namespace BMap的所有library类均放在BMapLib命名空间下
  11. */
  12. var BMapLib = window.BMapLib = BMapLib || {};
  13. (function(){
  14. /**
  15. * 获取一个扩展的视图范围,把上下左右都扩大一样的像素值。
  16. * @param {Map} map BMap.Map的实例化对象
  17. * @param {BMap.Bounds} bounds BMap.Bounds的实例化对象
  18. * @param {Number} gridSize 要扩大的像素值
  19. *
  20. * @return {BMap.Bounds} 返回扩大后的视图范围。
  21. */
  22. var getExtendedBounds = function(map, bounds, gridSize){
  23. bounds = cutBoundsInRange(bounds);
  24. var pixelNE = map.pointToPixel(bounds.getNorthEast());
  25. var pixelSW = map.pointToPixel(bounds.getSouthWest());
  26. pixelNE.x += gridSize;
  27. pixelNE.y -= gridSize;
  28. pixelSW.x -= gridSize;
  29. pixelSW.y += gridSize;
  30. var newNE = map.pixelToPoint(pixelNE);
  31. var newSW = map.pixelToPoint(pixelSW);
  32. return new BMap.Bounds(newSW, newNE);
  33. };
  34. /**
  35. * 按照百度地图支持的世界范围对bounds进行边界处理
  36. * @param {BMap.Bounds} bounds BMap.Bounds的实例化对象
  37. *
  38. * @return {BMap.Bounds} 返回不越界的视图范围
  39. */
  40. var cutBoundsInRange = function (bounds) {
  41. var maxX = getRange(bounds.getNorthEast().lng, -180, 180);
  42. var minX = getRange(bounds.getSouthWest().lng, -180, 180);
  43. var maxY = getRange(bounds.getNorthEast().lat, -74, 74);
  44. var minY = getRange(bounds.getSouthWest().lat, -74, 74);
  45. return new BMap.Bounds(new BMap.Point(minX, minY), new BMap.Point(maxX, maxY));
  46. };
  47. /**
  48. * 对单个值进行边界处理。
  49. * @param {Number} i 要处理的数值
  50. * @param {Number} min 下边界值
  51. * @param {Number} max 上边界值
  52. *
  53. * @return {Number} 返回不越界的数值
  54. */
  55. var getRange = function (i, mix, max) {
  56. mix && (i = Math.max(i, mix));
  57. max && (i = Math.min(i, max));
  58. return i;
  59. };
  60. /**
  61. * 判断给定的对象是否为数组
  62. * @param {Object} source 要测试的对象
  63. *
  64. * @return {Boolean} 如果是数组返回true,否则返回false
  65. */
  66. var isArray = function (source) {
  67. return '[object Array]' === Object.prototype.toString.call(source);
  68. };
  69. /**
  70. * 返回item在source中的索引位置
  71. * @param {Object} item 要测试的对象
  72. * @param {Array} source 数组
  73. *
  74. * @return {Number} 如果在数组内,返回索引,否则返回-1
  75. */
  76. var indexOf = function(item, source){
  77. var index = -1;
  78. if(isArray(source)){
  79. if (source.indexOf) {
  80. index = source.indexOf(item);
  81. } else {
  82. for (var i = 0, m; m = source[i]; i++) {
  83. if (m === item) {
  84. index = i;
  85. break;
  86. }
  87. }
  88. }
  89. }
  90. return index;
  91. };
  92. /**
  93. *@exports MarkerClusterer as BMapLib.MarkerClusterer
  94. */
  95. var MarkerClusterer =
  96. /**
  97. * MarkerClusterer
  98. * @class 用来解决加载大量点要素到地图上产生覆盖现象的问题,并提高性能
  99. * @constructor
  100. * @param {Map} map 地图的一个实例。
  101. * @param {Json Object} options 可选参数,可选项包括:<br />
  102. * markers {Array<Marker>} 要聚合的标记数组<br />
  103. * girdSize {Number} 聚合计算时网格的像素大小,默认60<br />
  104. * maxZoom {Number} 最大的聚合级别,大于该级别就不进行相应的聚合<br />
  105. * minClusterSize {Number} 最小的聚合数量,小于该数量的不能成为一个聚合,默认为2<br />
  106. * isAverangeCenter {Boolean} 聚合点的落脚位置是否是所有聚合在内点的平均值,默认为否,落脚在聚合内的第一个点<br />
  107. * styles {Array<IconStyle>} 自定义聚合后的图标风格,请参考TextIconOverlay类<br />
  108. */
  109. BMapLib.MarkerClusterer = function(map, options){
  110. if (!map){
  111. return;
  112. }
  113. this._map = map;
  114. this._markers = [];//所有的点位
  115. this._clusters = [];//聚合的数组
  116. var opts = options || {};
  117. this._getCent = opts["getCent"]; //传过来的数据
  118. this._geoc = opts["geoc"]; //传过来的数据
  119. this._ladata = opts["ladata"]; //传过来的数据
  120. this._gridSize = opts["gridSize"] || 60;
  121. this._maxZoom = opts["maxZoom"] || 18;
  122. this._minClusterSize = opts["minClusterSize"] || 1;
  123. this._isAverageCenter = false; //聚合点的落脚位置是否是所有聚合在内点的平均值
  124. if (opts['isAverageCenter'] != undefined) {
  125. this._isAverageCenter = opts['isAverageCenter'];
  126. }
  127. this._styles = opts["styles"] || [];
  128. var that = this;
  129. this._map.addEventListener("zoomend",function(){
  130. that._redraw();
  131. });
  132. this._map.addEventListener("moveend",function(){
  133. that._redraw();
  134. });
  135. var mkrs = opts["markers"];
  136. isArray(mkrs) && this.addMarkers(mkrs);
  137. };
  138. /**
  139. * 添加要聚合的标记数组。
  140. * @param {Array<Marker>} markers 要聚合的标记数组
  141. *
  142. * @return 无返回值。
  143. */
  144. MarkerClusterer.prototype.addMarkers = function(markers){
  145. for(var i = 0, len = markers.length; i <len ; i++){
  146. this._pushMarkerTo(markers[i]);
  147. }
  148. this._createClusters();
  149. };
  150. /**
  151. * MarkerClusterer中 this._getCent 从 HTML 文件中传过来的值,
  152. * 再使用一个属性对象返回值;
  153. * 在下面数据中才能调用;
  154. */
  155. MarkerClusterer.prototype.getTitle = function(){
  156. return this._getCent;
  157. };
  158. MarkerClusterer.prototype.getGeoc = function(){
  159. return this._geoc;
  160. };
  161. MarkerClusterer.prototype.clusters = function(){ //聚合点集合坐标
  162. return this._clusters;
  163. };
  164. MarkerClusterer.prototype.ladata = function(){ //经纬度内容
  165. return this._ladata;
  166. };
  167. /**
  168. * 把一个标记添加到要聚合的标记数组中
  169. * @param {BMap.Marker} marker 要添加的标记
  170. *
  171. * @return 无返回值。
  172. */
  173. MarkerClusterer.prototype._pushMarkerTo = function(marker){
  174. var index = indexOf(marker, this._markers);
  175. if(index === -1){
  176. marker.isInCluster = false;
  177. this._markers.push(marker);//Marker拖放后enableDragging不做变化,忽略
  178. }
  179. };
  180. /**
  181. * 添加一个聚合的标记。
  182. * @param {BMap.Marker} marker 要聚合的单个标记。
  183. * @return 无返回值。
  184. */
  185. MarkerClusterer.prototype.addMarker = function(marker) {
  186. this._pushMarkerTo(marker);
  187. this._createClusters();
  188. };
  189. /**
  190. * 根据所给定的标记,创建聚合点
  191. * @return 无返回值
  192. */
  193. MarkerClusterer.prototype._createClusters = function(){
  194. var mapBounds = this._map.getBounds();
  195. var extendedBounds = getExtendedBounds(this._map, mapBounds, this._gridSize);
  196. for(var i = 0, marker; marker = this._markers[i]; i++){
  197. if(!marker.isInCluster && extendedBounds.containsPoint(marker.getPosition()) ){
  198. this._addToClosestCluster(marker);
  199. }
  200. }
  201. // 2018.2.8添加了一个方法并在这里执行----------------------------------------------------
  202. var len = this._markers.length;
  203. for (var i = 0; i < len; i++) {
  204. if(this._clusters[i]){
  205. this._clusters[i].render();
  206. }
  207. }
  208. };
  209. /**
  210. * 根据标记的位置,把它添加到最近的聚合中
  211. * @param {BMap.Marker} marker 要进行聚合的单个标记
  212. *
  213. * @return 无返回值。
  214. */
  215. MarkerClusterer.prototype._addToClosestCluster = function (marker){
  216. var distance = 4000000;
  217. var clusterToAddTo = null;
  218. var position = marker.getPosition();
  219. for(var i = 0, cluster; cluster = this._clusters[i]; i++){
  220. var center = cluster.getCenter();
  221. if(center){
  222. var d = this._map.getDistance(center, marker.getPosition());
  223. if(d < distance){
  224. distance = d;
  225. clusterToAddTo = cluster;
  226. }
  227. }
  228. }
  229. if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)){
  230. clusterToAddTo.addMarker(marker);
  231. } else {
  232. //单个标记
  233. var cluster = new Cluster(this);
  234. cluster.addMarker(marker);
  235. this._clusters.push(cluster);
  236. }
  237. };
  238. /**
  239. * 清除上一次的聚合的结果
  240. * @return 无返回值。
  241. */
  242. MarkerClusterer.prototype._clearLastClusters = function(){
  243. for(var i = 0, cluster; cluster = this._clusters[i]; i++){
  244. cluster.remove();
  245. }
  246. this._clusters = [];//置空Cluster数组
  247. this._removeMarkersFromCluster();//把Marker的cluster标记设为false
  248. };
  249. /**
  250. * 清除某个聚合中的所有标记
  251. * @return 无返回值
  252. */
  253. MarkerClusterer.prototype._removeMarkersFromCluster = function(){
  254. for(var i = 0, marker; marker = this._markers[i]; i++){
  255. var u = mp.getZoom(); // 定义地图缩放等级的变量
  256. if(u <= 12){
  257. mp.clearOverlays(); //清除地图上所有的覆盖物
  258. }
  259. marker.isInCluster = false;
  260. }
  261. };
  262. /**
  263. * 把所有的标记从地图上清除
  264. * @return 无返回值
  265. */
  266. MarkerClusterer.prototype._removeMarkersFromMap = function(){
  267. for(var i = 0, marker; marker = this._markers[i]; i++){
  268. var u = mp.getZoom(); // 定义地图缩放等级的变量
  269. if(u <= 12){
  270. mp.clearOverlays(); //清除地图上所有的覆盖物
  271. }
  272. marker.isInCluster = false;
  273. this._map.removeOverlay(marker);
  274. }
  275. };
  276. /**
  277. * 删除单个标记
  278. * @param {BMap.Marker} marker 需要被删除的marker
  279. *
  280. * @return {Boolean} 删除成功返回true,否则返回false
  281. */
  282. MarkerClusterer.prototype._removeMarker = function(marker) {
  283. var index = indexOf(marker, this._markers);
  284. if (index === -1) {
  285. return false;
  286. }
  287. var u = mp.getZoom(); // 定义地图缩放等级的变量
  288. if(u <= 12){
  289. mp.clearOverlays(); //清除地图上所有的覆盖物
  290. }
  291. this._map.removeOverlay(marker);
  292. this._markers.splice(index, 1);
  293. return true;
  294. };
  295. /**
  296. * 删除单个标记
  297. * @param {BMap.Marker} marker 需要被删除的marker
  298. *
  299. * @return {Boolean} 删除成功返回true,否则返回false
  300. */
  301. MarkerClusterer.prototype.removeMarker = function(marker) {
  302. var success = this._removeMarker(marker);
  303. if (success) {
  304. this._clearLastClusters();
  305. this._createClusters();
  306. }
  307. return success;
  308. };
  309. /**
  310. * 删除一组标记
  311. * @param {Array<BMap.Marker>} markers 需要被删除的marker数组
  312. *
  313. * @return {Boolean} 删除成功返回true,否则返回false
  314. */
  315. MarkerClusterer.prototype.removeMarkers = function(markers) {
  316. var success = false;
  317. for (var i = 0; i < markers.length; i++) {
  318. var r = this._removeMarker(markers[i]);
  319. success = success || r;
  320. }
  321. if (success) {
  322. this._clearLastClusters();
  323. this._createClusters();
  324. }
  325. return success;
  326. };
  327. /**
  328. * 从地图上彻底清除所有的标记
  329. * @return 无返回值
  330. */
  331. MarkerClusterer.prototype.clearMarkers = function() {
  332. var u = mp.getZoom(); // 定义地图缩放等级的变量
  333. if(u <= 12){
  334. mp.clearOverlays(); //清除地图上所有的覆盖物
  335. }
  336. this._clearLastClusters();
  337. this._removeMarkersFromMap();
  338. this._markers = [];
  339. };
  340. /**
  341. * 重新生成,比如改变了属性等
  342. * @return 无返回值
  343. */
  344. MarkerClusterer.prototype._redraw = function () {
  345. this._clearLastClusters();
  346. // this._map.clearOverlays();
  347. this._createClusters();
  348. };
  349. /**
  350. * 获取网格大小
  351. * @return {Number} 网格大小
  352. */
  353. MarkerClusterer.prototype.getGridSize = function() {
  354. return this._gridSize;
  355. };
  356. /**
  357. * 设置网格大小
  358. * @param {Number} size 网格大小
  359. * @return 无返回值
  360. */
  361. MarkerClusterer.prototype.setGridSize = function(size) {
  362. this._gridSize = size;
  363. this._redraw();
  364. };
  365. /**
  366. * 获取聚合的最大缩放级别。
  367. * @return {Number} 聚合的最大缩放级别。
  368. */
  369. MarkerClusterer.prototype.getMaxZoom = function() {
  370. return this._maxZoom;
  371. };
  372. /**
  373. * 设置聚合的最大缩放级别
  374. * @param {Number} maxZoom 聚合的最大缩放级别
  375. * @return 无返回值
  376. */
  377. MarkerClusterer.prototype.setMaxZoom = function(maxZoom) {
  378. this._maxZoom = maxZoom;
  379. this._redraw();
  380. };
  381. /**
  382. * 获取聚合的样式风格集合
  383. * @return {Array<IconStyle>} 聚合的样式风格集合
  384. */
  385. MarkerClusterer.prototype.getStyles = function() {
  386. return this._styles;
  387. };
  388. /**
  389. * 设置聚合的样式风格集合
  390. * @param {Array<IconStyle>} styles 样式风格数组
  391. * @return 无返回值
  392. */
  393. MarkerClusterer.prototype.setStyles = function(styles) {
  394. this._styles = styles;
  395. this._redraw();
  396. };
  397. /**
  398. * 获取单个聚合的最小数量。
  399. * @return {Number} 单个聚合的最小数量。
  400. */
  401. MarkerClusterer.prototype.getMinClusterSize = function() {
  402. return this._minClusterSize;
  403. };
  404. /**
  405. * 设置单个聚合的最小数量。
  406. * @param {Number} size 单个聚合的最小数量。
  407. * @return 无返回值。
  408. */
  409. MarkerClusterer.prototype.setMinClusterSize = function(size) {
  410. this._minClusterSize = size;
  411. this._redraw();
  412. };
  413. /**
  414. * 获取单个聚合的落脚点是否是聚合内所有标记的平均中心。
  415. * @return {Boolean} true或false。
  416. */
  417. MarkerClusterer.prototype.isAverageCenter = function() {
  418. return this._isAverageCenter;
  419. };
  420. /**
  421. * 获取聚合的Map实例。
  422. * @return {Map} Map的示例。
  423. */
  424. MarkerClusterer.prototype.getMap = function() {
  425. return this._map;
  426. };
  427. /**
  428. * 获取所有的标记数组。
  429. * @return {Array<Marker>} 标记数组。
  430. */
  431. MarkerClusterer.prototype.getMarkers = function() {
  432. return this._markers;
  433. };
  434. /**
  435. * 获取聚合的总数量。
  436. * @return {Number} 聚合的总数量。
  437. */
  438. MarkerClusterer.prototype.getClustersCount = function() {
  439. var count = 0;
  440. for(var i = 0, cluster; cluster = this._clusters[i]; i++){
  441. cluster.isReal() && count++;
  442. }
  443. return count;
  444. };
  445. /**
  446. * @ignore
  447. * Cluster
  448. * @class 表示一个聚合对象,该聚合,包含有N个标记,这N个标记组成的范围,并有予以显示在Map上的TextIconOverlay等。
  449. * @constructor
  450. * @param {MarkerClusterer} markerClusterer 一个标记聚合器示例。
  451. */
  452. function Cluster(markerClusterer){
  453. this._markerClusterer = markerClusterer;
  454. this._map = markerClusterer.getMap();
  455. this._text=markerClusterer.getTitle() //从markerclusterer 调用从html中传过来的数据
  456. this._geoc=markerClusterer.getGeoc() //从markerclusterer 调用从html中传过来的数据
  457. this._clusters=markerClusterer.clusters() //从markerclusterer 从调用聚合的数组
  458. this._lad=markerClusterer.ladata() //从markerclusterer 从调用聚合的数组
  459. this._minClusterSize = markerClusterer.getMinClusterSize();
  460. this._isAverageCenter = markerClusterer.isAverageCenter();
  461. this._center = null;//落脚位置
  462. this._markers = [];//这个Cluster中所包含的markers
  463. this._gridBounds = null;//以中心点为准,向四边扩大gridSize个像素的范围,也即网格范围
  464. this._showPosition = null; //2018.3.17
  465. this._isReal = false; //真的是个聚合
  466. this._styles = markerClusterer.getStyles();
  467. this._labels = [];
  468. this._clusterMarker = new BMapLib.TextIconOverlay(this._center, {name:'区域',value : this._markers.length}, {"styles":this._markerClusterer.getStyles()});
  469. //this._map.addOverlay(this._clusterMarker);
  470. }
  471. // console.log(this._ladata)
  472. /**
  473. * 向该聚合添加一个标记。
  474. * @param {Marker} marker 要添加的标记。
  475. * @return 无返回值。
  476. */
  477. //-----------------------------------
  478. Cluster.prototype.addMarker = function(marker){
  479. if(this.isMarkerInCluster(marker)){
  480. return false;
  481. }//也可用marker.isInCluster判断,外面判断OK,这里基本不会命中
  482. if (!this._center){
  483. this._center = marker.getPosition();
  484. this.updateGridBounds();//
  485. } else {
  486. if(this._isAverageCenter){
  487. var l = this._markers.length + 1;
  488. var lat = (this._center.lat * (l - 1) + marker.getPosition().lat) / l;
  489. var lng = (this._center.lng * (l - 1) + marker.getPosition().lng) / l;
  490. this._center = new BMap.Point(lng, lat);
  491. this.updateGridBounds();
  492. }//计算新的Center
  493. }
  494. marker.isInCluster = true;
  495. this._markers.push(marker);
  496. /*
  497. * 以下这段代码直接操作dom,造成太卡,把这里删除
  498. * 2018.2.8
  499. */
  500. /*
  501. var len = this._markers.length;
  502. if(len < this._minClusterSize ){
  503. this._map.addOverlay(marker);
  504. //this.updateClusterMarker();
  505. return true;
  506. } else if (len === this._minClusterSize) {
  507. for (var i = 0; i < len; i++) {
  508. this._markers[i].getMap() && this._map.removeOverlay(this._markers[i]);
  509. }
  510. }
  511. this._map.addOverlay(this._clusterMarker);
  512. this._isReal = true;
  513. this.updateClusterMarker();
  514. return true;
  515. */
  516. };
  517. //-----------------------------------
  518. /**
  519. * 以上直接太卡改抽离出来;2018.2.8
  520. * 进行dom操作
  521. * @return 无返回值
  522. */
  523. Cluster.prototype.render = function(){
  524. var len = this._markers.length;
  525. if (len < this._minClusterSize) {
  526. for (var i = 0; i < len; i++) {
  527. this._map.addOverlay(this._markers[i]);
  528. }
  529. } else {
  530. this._map.addOverlay(this._clusterMarker);
  531. this._isReal = true;
  532. this.updateClusterMarker();
  533. }
  534. }
  535. /**
  536. * 判断一个标记是否在该聚合中。
  537. * @param {Marker} marker 要判断的标记。
  538. * @return {Boolean} true或false。
  539. */
  540. Cluster.prototype.isMarkerInCluster= function(marker){
  541. if (this._markers.indexOf) {
  542. return this._markers.indexOf(marker) != -1;
  543. } else {
  544. for (var i = 0, m; m = this._markers[i]; i++) {
  545. if (m === marker) {
  546. return true;
  547. }
  548. }
  549. }
  550. return false;
  551. };
  552. /**
  553. * 判断一个标记是否在该聚合网格范围中。
  554. * @param {Marker} marker 要判断的标记。
  555. * @return {Boolean} true或false。
  556. */
  557. Cluster.prototype.isMarkerInClusterBounds = function(marker) {
  558. return this._gridBounds.containsPoint(marker.getPosition());
  559. };
  560. Cluster.prototype.isReal = function(marker) {
  561. return this._isReal;
  562. };
  563. /**
  564. * 更新该聚合的网格范围。
  565. * @return 无返回值。
  566. */
  567. Cluster.prototype.updateGridBounds = function() {
  568. var bounds = new BMap.Bounds(this._center, this._center);
  569. this._gridBounds = getExtendedBounds(this._map, bounds, this._markerClusterer.getGridSize());
  570. };
  571. /**
  572. * 对于单个点添加label
  573. */
  574. Cluster.prototype.addLabel = function (marker,title) {
  575. //获取marker的坐标
  576. var position = marker.getPosition();
  577. // var position = marker;
  578. //创建label
  579. var label = new BMap.Label({position : position});
  580. label.setStyle({
  581. height : '25px',
  582. color : "#fff",
  583. backgroundColor : this._styles[0].backgroundColor,
  584. border : 'none',
  585. borderRadius : "25px",
  586. fontWeight : 'bold',
  587. });
  588. var content = '<span style="color:'+this._styles[0].backgroundColor+'"><i class="fa fa-map-marker"></i></span>'+'<p style="padding:0px 13px;text-align:center;margin-top:5px;">'+title+'</p>';
  589. label.setContent(content)
  590. label.setPosition(position);
  591. this._labels.push(label);
  592. this._map.addOverlay(label);
  593. }
  594. /**
  595. * 更新该聚合的显示样式,也即TextIconOverlay。
  596. * @return 无返回值。
  597. */
  598. Cluster.prototype.updateClusterMarker = function () {
  599. // console.log(this._map.getZoom())
  600. if (this._map.getZoom() > this._markerClusterer.getMaxZoom()) {
  601. this._clusterMarker && this._map.removeOverlay(this._clusterMarker);
  602. // for (var i = 0, marker; marker = this._markers[i]; i++) {
  603. for (var i = 0, marker; marker = this._lad[i]; i++) {
  604. var title =this._lad[i].title;
  605. marker = new BMap.Marker(this._lad[i].point);
  606. // this.addLabel(marker,title);
  607. }
  608. return;
  609. }
  610. if (this._markers.length < this._minClusterSize) {
  611. this._clusterMarker.hide();
  612. return;
  613. }
  614. this._clusterMarker.setPosition(this._center);
  615. // -------------------------------区域 start------------------------------------------------
  616. /*
  617. * 2018.3.18
  618. * 在地图上添加区域
  619. * setaa._position 聚合的经纬度
  620. */
  621. var _city,setaa,leaa,arr;
  622. setaa = this._clusterMarker; //数据
  623. leaa = this._markers; //经纬度集合
  624. arr = this._clusters; //传过来的经纬度集合数量
  625. // console.log(setaa._position) //聚合点经纬度
  626. for(var i = 0,occupational;occupational = arr[i];i++){
  627. this._geoc.getLocation(setaa._position, function(rs){
  628. var addComp = rs.addressComponents;
  629. if(addComp.city !=''){
  630. _city=(addComp.city);
  631. }else {
  632. _city=(addComp.district);
  633. }
  634. setaa.setText({name : _city , value : leaa.length});
  635. });
  636. }
  637. // -------------------------------区域 end----------------------------------------
  638. // this._clusterMarker.setText({name : '共找到' , value : this._markers.length});
  639. var thatMap = this._map;
  640. var thatBounds = this.getBounds();
  641. var center = this._center;
  642. this._clusterMarker.addEventListener("click", function(event){
  643. //这个方法容易造成晃动
  644. //thatMap.setViewport(thatBounds);
  645. // console.log(center);
  646. var zoom = thatMap.getZoom();
  647. zoom = zoom > 14 ? zoom : 14;
  648. thatMap.setZoom(zoom);
  649. thatMap.setCenter(center);
  650. });
  651. // -------------------------2018.3.19---------------
  652. };
  653. /**
  654. * 删除该聚合。
  655. * @return 无返回值。
  656. */
  657. Cluster.prototype.remove = function(){
  658. for (var i = 0, m; m = this._labels[i]; i++) {
  659. this._map.removeOverlay(m);
  660. }//清除散的标记点
  661. this._map.removeOverlay(this._clusterMarker);
  662. this._markers.length = 0;
  663. delete this._markers;
  664. }
  665. /**
  666. * 获取该聚合所包含的所有标记的最小外接矩形的范围。
  667. * @return {BMap.Bounds} 计算出的范围。
  668. */
  669. Cluster.prototype.getBounds = function() {
  670. var bounds = new BMap.Bounds(this._center,this._center);
  671. for (var i = 0, marker; marker = this._markers[i]; i++) {
  672. bounds.extend(marker.getPosition());
  673. }
  674. return bounds;
  675. };
  676. /**
  677. * 获取该聚合的落脚点。
  678. * @return {BMap.Point} 该聚合的落脚点。
  679. */
  680. Cluster.prototype.getCenter = function() {
  681. return this._center;
  682. };
  683. })();