(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.BMapLib = global.BMapLib || {}, global.BMapLib.MarkerClusterer = factory()); }(this, (function () { 'use strict'; var __commonjs_global = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : this; function __commonjs(fn, module) { return module = { exports: {} }, fn(module, module.exports, __commonjs_global), module.exports; } var index$1 = __commonjs(function (module, exports, global) { (function (root, factory) { if (typeof exports === 'object') { module.exports = factory(); } else if (typeof define === 'function' && define.amd) { define(factory); } else { root.BMapLib = root.BMapLib || {}; root.BMapLib.TextIconOverlay = root.BMapLib.TextIconOverlay || factory(); } })(__commonjs_global, function() { var T, baidu = T = baidu || {version: "1.3.8"}; var context = {}; //鎻愬嚭guid锛岄槻姝㈠湪涓庤€佺増鏈琓angram娣风敤鏃� //鍦ㄤ笅涓€琛岄敊璇殑淇敼context[undefined] baidu.guid = "$BAIDU$"; //Tangram鍙兘琚斁鍦ㄩ棴鍖呬腑 //涓€浜涢〉闈㈢骇鍒敮涓€鐨勫睘鎬э紝闇€瑕佹寕杞藉湪context[baidu.guid]涓� context[baidu.guid] = context[baidu.guid] || {}; /** * @ignore * @namespace baidu.dom 鎿嶄綔dom鐨勬柟娉曘€� */ baidu.dom = baidu.dom || {}; /** * 浠庢枃妗d腑鑾峰彇鎸囧畾鐨凞OM鍏冪礌 * @name baidu.dom.g * @function * @grammar baidu.dom.g(id) * @param {string|HTMLElement} id 鍏冪礌鐨刬d鎴朌OM鍏冪礌 * @shortcut g,T.G * @meta standard * @see baidu.dom.q * * @returns {HTMLElement|null} 鑾峰彇鐨勫厓绱狅紝鏌ユ壘涓嶅埌鏃惰繑鍥瀗ull,濡傛灉鍙傛暟涓嶅悎娉曪紝鐩存帴杩斿洖鍙傛暟 */ baidu.dom.g = function (id) { if ('string' == typeof id || id instanceof String) { return document.getElementById(id); } else if (id && id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) { return id; } return null; }; // 澹版槑蹇嵎鏂规硶 baidu.g = baidu.G = baidu.dom.g; /** * 鑾峰彇鐩爣鍏冪礌鎵€灞炵殑document瀵硅薄 * @name baidu.dom.getDocument * @function * @grammar baidu.dom.getDocument(element) * @param {HTMLElement|string} element 鐩爣鍏冪礌鎴栫洰鏍囧厓绱犵殑id * @meta standard * @see baidu.dom.getWindow * * @returns {HTMLDocument} 鐩爣鍏冪礌鎵€灞炵殑document瀵硅薄 */ baidu.dom.getDocument = function (element) { element = baidu.dom.g(element); return element.nodeType == 9 ? element : element.ownerDocument || element.document; }; /** * @ignore * @namespace baidu.lang 瀵硅瑷€灞傞潰鐨勫皝瑁咃紝鍖呮嫭绫诲瀷鍒ゆ柇銆佹ā鍧楁墿灞曘€佺户鎵垮熀绫讳互鍙婂璞¤嚜瀹氫箟浜嬩欢鐨勬敮鎸併€� */ baidu.lang = baidu.lang || {}; /** * 鍒ゆ柇鐩爣鍙傛暟鏄惁string绫诲瀷鎴朣tring瀵硅薄 * @name baidu.lang.isString * @function * @grammar baidu.lang.isString(source) * @param {Any} source 鐩爣鍙傛暟 * @shortcut isString * @meta standard * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate * * @returns {boolean} 绫诲瀷鍒ゆ柇缁撴灉 */ baidu.lang.isString = function (source) { return '[object String]' == Object.prototype.toString.call(source); }; // 澹版槑蹇嵎鏂规硶 baidu.isString = baidu.lang.isString; /** * 浠庢枃妗d腑鑾峰彇鎸囧畾鐨凞OM鍏冪礌 * **鍐呴儴鏂规硶** * * @param {string|HTMLElement} id 鍏冪礌鐨刬d鎴朌OM鍏冪礌 * @meta standard * @return {HTMLElement} DOM鍏冪礌锛屽鏋滀笉瀛樺湪锛岃繑鍥瀗ull锛屽鏋滃弬鏁颁笉鍚堟硶锛岀洿鎺ヨ繑鍥炲弬鏁� */ baidu.dom._g = function (id) { if (baidu.lang.isString(id)) { return document.getElementById(id); } return id; }; // 澹版槑蹇嵎鏂规硶 baidu._g = baidu.dom._g; /** * @ignore * @namespace baidu.browser 鍒ゆ柇娴忚鍣ㄧ被鍨嬪拰鐗规€х殑灞炴€с€� */ baidu.browser = baidu.browser || {}; if (/msie (\d+\.\d)/i.test(navigator.userAgent)) { //IE 8涓嬶紝浠ocumentMode涓哄噯 //鍦ㄧ櫨搴︽ā鏉夸腑锛屽彲鑳戒細鏈�$锛岄槻姝㈠啿绐侊紝灏�$1 鍐欐垚 \x241 /** * 鍒ゆ柇鏄惁涓篿e娴忚鍣� * @property ie ie鐗堟湰鍙� * @grammar baidu.browser.ie * @meta standard * @shortcut ie * @see baidu.browser.firefox,baidu.browser.safari,baidu.browser.opera,baidu.browser.chrome,baidu.browser.maxthon */ baidu.browser.ie = baidu.ie = document.documentMode || + RegExp['\x241']; } /** * 鑾峰彇鐩爣鍏冪礌鐨刢omputed style鍊笺€傚鏋滃厓绱犵殑鏍峰紡鍊间笉鑳借娴忚鍣ㄨ绠楋紝鍒欎細杩斿洖绌哄瓧绗︿覆锛圛E锛� * * @author berg * @name baidu.dom.getComputedStyle * @function * @grammar baidu.dom.getComputedStyle(element, key) * @param {HTMLElement|string} element 鐩爣鍏冪礌鎴栫洰鏍囧厓绱犵殑id * @param {string} key 瑕佽幏鍙栫殑鏍峰紡鍚� * * @see baidu.dom.getStyle * * @returns {string} 鐩爣鍏冪礌鐨刢omputed style鍊� */ baidu.dom.getComputedStyle = function(element, key){ element = baidu.dom._g(element); var doc = baidu.dom.getDocument(element), styles; if (doc.defaultView && doc.defaultView.getComputedStyle) { styles = doc.defaultView.getComputedStyle(element, null); if (styles) { return styles[key] || styles.getPropertyValue(key); } } return ''; }; /** * 鎻愪緵缁檚etStyle涓巊etStyle浣跨敤 */ baidu.dom._styleFixer = baidu.dom._styleFixer || {}; /** * 鎻愪緵缁檚etStyle涓巊etStyle浣跨敤 */ baidu.dom._styleFilter = baidu.dom._styleFilter || []; /** * 涓鸿幏鍙栧拰璁剧疆鏍峰紡鐨勮繃婊ゅ櫒 * @private * @meta standard */ baidu.dom._styleFilter.filter = function (key, value, method) { for (var i = 0, filters = baidu.dom._styleFilter, filter; filter = filters[i]; i++) { if (filter = filter[method]) { value = filter(key, value); } } return value; }; /** * @ignore * @namespace baidu.string 鎿嶄綔瀛楃涓茬殑鏂规硶銆� */ baidu.string = baidu.string || {}; /** * 灏嗙洰鏍囧瓧绗︿覆杩涜椹煎嘲鍖栧鐞� * @name baidu.string.toCamelCase * @function * @grammar baidu.string.toCamelCase(source) * @param {string} source 鐩爣瀛楃涓� * @remark * 鏀寔鍗曡瘝浠モ€�-_鈥濆垎闅� * @meta standard * * @returns {string} 椹煎嘲鍖栧鐞嗗悗鐨勫瓧绗︿覆 */ baidu.string.toCamelCase = function (source) { //鎻愬墠鍒ゆ柇锛屾彁楂榞etStyle绛夌殑鏁堢巼 thanks xianwei if (source.indexOf('-') < 0 && source.indexOf('_') < 0) { return source; } return source.replace(/[-_][^-_]/g, function (match) { return match.charAt(1).toUpperCase(); }); }; /** * 鑾峰彇鐩爣鍏冪礌鐨勬牱寮忓€� * @name baidu.dom.getStyle * @function * @grammar baidu.dom.getStyle(element, key) * @param {HTMLElement|string} element 鐩爣鍏冪礌鎴栫洰鏍囧厓绱犵殑id * @param {string} key 瑕佽幏鍙栫殑鏍峰紡鍚� * @remark * * 涓轰簡绮剧畝浠g爜锛屾湰妯″潡榛樿涓嶅浠讳綍娴忚鍣ㄨ繑鍥炲€艰繘琛屽綊涓€鍖栧鐞嗭紙濡備娇鐢╣etStyle鏃讹紝涓嶅悓娴忚鍣ㄤ笅鍙兘杩斿洖rgb棰滆壊鎴杊ex棰滆壊锛夛紝涔熶笉浼氫慨澶嶆祻瑙堝櫒鐨刡ug鍜屽樊寮傛€э紙濡傝缃甀E鐨刦loat灞炴€у彨styleFloat锛宖irefox鍒欐槸cssFloat锛夈€�<br /> * baidu.dom._styleFixer鍜宐aidu.dom._styleFilter鍙互涓烘湰妯″潡鎻愪緵鏀寔銆�<br /> * 鍏朵腑_styleFilter鑳藉棰滆壊鍜宲x杩涜褰掍竴鍖栧鐞嗭紝_styleFixer鑳藉display锛宖loat锛宱pacity锛宼extOverflow鐨勬祻瑙堝櫒鍏煎鎬ug杩涜澶勭悊銆� * @shortcut getStyle * @meta standard * @see baidu.dom.setStyle,baidu.dom.setStyles, baidu.dom.getComputedStyle * * @returns {string} 鐩爣鍏冪礌鐨勬牱寮忓€� */ baidu.dom.getStyle = function (element, key) { var dom = baidu.dom; element = dom.g(element); key = baidu.string.toCamelCase(key); //computed style, then cascaded style, then explicitly set style. var value = element.style[key] || (element.currentStyle ? element.currentStyle[key] : "") || dom.getComputedStyle(element, key); // 鍦ㄥ彇涓嶅埌鍊肩殑鏃跺€欙紝鐢╢ixer杩涜淇 if (!value) { var fixer = dom._styleFixer[key]; if(fixer){ value = fixer.get ? fixer.get(element) : baidu.dom.getStyle(element, fixer); } } /* 妫€鏌ョ粨鏋滆繃婊ゅ櫒 */ if (fixer = dom._styleFilter) { value = fixer.filter(key, value, 'get'); } return value; }; // 澹版槑蹇嵎鏂规硶 baidu.getStyle = baidu.dom.getStyle; if (/opera\/(\d+\.\d)/i.test(navigator.userAgent)) { /** * 鍒ゆ柇鏄惁涓簅pera娴忚鍣� * @property opera opera鐗堟湰鍙� * @grammar baidu.browser.opera * @meta standard * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome */ baidu.browser.opera = + RegExp['\x241']; } /** * 鍒ゆ柇鏄惁涓簑ebkit鍐呮牳 * @property isWebkit * @grammar baidu.browser.isWebkit * @meta standard * @see baidu.browser.isGecko */ baidu.browser.isWebkit = /webkit/i.test(navigator.userAgent); /** * 鍒ゆ柇鏄惁涓篻ecko鍐呮牳 * @property isGecko * @grammar baidu.browser.isGecko * @meta standard * @see baidu.browser.isWebkit */ baidu.browser.isGecko = /gecko/i.test(navigator.userAgent) && !/like gecko/i.test(navigator.userAgent); /** * 鍒ゆ柇鏄惁涓ユ牸鏍囧噯鐨勬覆鏌撴ā寮� * @property isStrict * @grammar baidu.browser.isStrict * @meta standard */ baidu.browser.isStrict = document.compatMode == "CSS1Compat"; /** * 鑾峰彇鐩爣鍏冪礌鐩稿浜庢暣涓枃妗e乏涓婅鐨勪綅缃� * @name baidu.dom.getPosition * @function * @grammar baidu.dom.getPosition(element) * @param {HTMLElement|string} element 鐩爣鍏冪礌鎴栫洰鏍囧厓绱犵殑id * @meta standard * * @returns {Object} 鐩爣鍏冪礌鐨勪綅缃紝閿€间负top鍜宭eft鐨凮bject銆� */ baidu.dom.getPosition = function (element) { element = baidu.dom.g(element); var doc = baidu.dom.getDocument(element), browser = baidu.browser, getStyle = baidu.dom.getStyle, // Gecko 1.9鐗堟湰浠ヤ笅鐢╣etBoxObjectFor璁$畻浣嶇疆 // 浣嗘槸鏌愪簺鎯呭喌涓嬫槸鏈塨ug鐨� // 瀵逛簬杩欎簺鏈塨ug鐨勬儏鍐� // 浣跨敤閫掑綊鏌ユ壘鐨勬柟寮� BUGGY_GECKO_BOX_OBJECT = browser.isGecko > 0 && doc.getBoxObjectFor && getStyle(element, 'position') == 'absolute' && (element.style.top === '' || element.style.left === ''), pos = {"left":0,"top":0}, viewport = (browser.ie && !browser.isStrict) ? doc.body : doc.documentElement, parent, box; if(element == viewport){ return pos; } if(element.getBoundingClientRect){ // IE and Gecko 1.9+ //褰揌TML鎴栬€匓ODY鏈塨order width鏃�, 鍘熺敓鐨刧etBoundingClientRect杩斿洖鍊兼槸涓嶇鍚堥鏈熺殑 //鑰冭檻鍒伴€氬父鎯呭喌涓� HTML鍜孊ODY鐨刡order鍙細璁炬垚0px,鎵€浠ュ拷鐣ヨ闂. box = element.getBoundingClientRect(); pos.left = Math.floor(box.left) + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft); pos.top = Math.floor(box.top) + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop); // IE浼氱粰HTML鍏冪礌娣诲姞涓€涓猙order锛岄粯璁ゆ槸medium锛�2px锛� // 浣嗘槸鍦↖E 6 7 鐨勬€紓妯″紡涓嬶紝鍙互琚玥tml { border: 0; } 杩欐潯css瑙勫垯瑕嗙洊 // 鍦↖E7鐨勬爣鍑嗘ā寮忎笅锛宐order姘歌繙鏄�2px锛岃繖涓€奸€氳繃clientLeft 鍜� clientTop鍙栧緱 // 浣嗘槸銆傘€傘€傚湪IE 6 7鐨勬€紓妯″紡锛屽鏋滅敤鎴蜂娇鐢╟ss瑕嗙洊浜嗛粯璁ょ殑medium // clientTop鍜宑lientLeft涓嶄細鏇存柊 pos.left -= doc.documentElement.clientLeft; pos.top -= doc.documentElement.clientTop; var htmlDom = doc.body, // 鍦ㄨ繖閲岋紝涓嶄娇鐢╡lement.style.borderLeftWidth锛屽彧鏈塩omputedStyle鏄彲淇$殑 htmlBorderLeftWidth = parseInt(getStyle(htmlDom, 'borderLeftWidth')), htmlBorderTopWidth = parseInt(getStyle(htmlDom, 'borderTopWidth')); if(browser.ie && !browser.isStrict){ pos.left -= isNaN(htmlBorderLeftWidth) ? 2 : htmlBorderLeftWidth; pos.top -= isNaN(htmlBorderTopWidth) ? 2 : htmlBorderTopWidth; } } else { // safari/opera/firefox parent = element; do { pos.left += parent.offsetLeft; pos.top += parent.offsetTop; // safari閲岄潰锛屽鏋滈亶鍘嗗埌浜嗕竴涓猣ixed鐨勫厓绱狅紝鍚庨潰鐨刼ffset閮戒笉鍑嗕簡 if (browser.isWebkit > 0 && getStyle(parent, 'position') == 'fixed') { pos.left += doc.body.scrollLeft; pos.top += doc.body.scrollTop; break; } parent = parent.offsetParent; } while (parent && parent != element); // 瀵筨ody offsetTop鐨勪慨姝� if(browser.opera > 0 || (browser.isWebkit > 0 && getStyle(element, 'position') == 'absolute')){ pos.top -= doc.body.offsetTop; } // 璁$畻闄や簡body鐨剆croll parent = element.offsetParent; while (parent && parent != doc.body) { pos.left -= parent.scrollLeft; // see https://bugs.opera.com/show_bug.cgi?id=249965 if (!browser.opera || parent.tagName != 'TR') { pos.top -= parent.scrollTop; } parent = parent.offsetParent; } } return pos; }; /** * @ignore * @namespace baidu.event 灞忚斀娴忚鍣ㄥ樊寮傛€х殑浜嬩欢灏佽銆� * @property target 浜嬩欢鐨勮Е鍙戝厓绱� * @property pageX 榧犳爣浜嬩欢鐨勯紶鏍噚鍧愭爣 * @property pageY 榧犳爣浜嬩欢鐨勯紶鏍噛鍧愭爣 * @property keyCode 閿洏浜嬩欢鐨勯敭鍊� */ baidu.event = baidu.event || {}; /** * 浜嬩欢鐩戝惉鍣ㄧ殑瀛樺偍琛� * @private * @meta standard */ baidu.event._listeners = baidu.event._listeners || []; /** * 涓虹洰鏍囧厓绱犳坊鍔犱簨浠剁洃鍚櫒 * @name baidu.event.on * @function * @grammar baidu.event.on(element, type, listener) * @param {HTMLElement|string|window} element 鐩爣鍏冪礌鎴栫洰鏍囧厓绱爄d * @param {string} type 浜嬩欢绫诲瀷 * @param {Function} listener 闇€瑕佹坊鍔犵殑鐩戝惉鍣� * @remark * 1. 涓嶆敮鎸佽法娴忚鍣ㄧ殑榧犳爣婊氳疆浜嬩欢鐩戝惉鍣ㄦ坊鍔�<br> 2. 鏀规柟娉曚笉涓虹洃鍚櫒鐏屽叆浜嬩欢瀵硅薄锛屼互闃叉璺╥frame浜嬩欢鎸傝浇鐨勪簨浠跺璞¤幏鍙栧け璐� * @shortcut on * @meta standard * @see baidu.event.un * * @returns {HTMLElement|window} 鐩爣鍏冪礌 */ baidu.event.on = function (element, type, listener) { type = type.replace(/^on/i, ''); element = baidu.dom._g(element); var realListener = function (ev) { // 1. 杩欓噷涓嶆敮鎸丒ventArgument, 鍘熷洜鏄法frame鐨勪簨浠舵寕杞� // 2. element鏄负浜嗕慨姝his listener.call(element, ev); }, lis = baidu.event._listeners, filter = baidu.event._eventFilter, afterFilter, realType = type; type = type.toLowerCase(); // filter杩囨护 if(filter && filter[type]){ afterFilter = filter[type](element, type, realListener); realType = afterFilter.type; realListener = afterFilter.listener; } // 浜嬩欢鐩戝惉鍣ㄦ寕杞� if (element.addEventListener) { element.addEventListener(realType, realListener, false); } else if (element.attachEvent) { element.attachEvent('on' + realType, realListener); } // 灏嗙洃鍚櫒瀛樺偍鍒版暟缁勪腑 lis[lis.length] = [element, type, listener, realListener, realType]; return element; }; // 澹版槑蹇嵎鏂规硶 baidu.on = baidu.event.on; /** * 杩斿洖涓€涓綋鍓嶉〉闈㈢殑鍞竴鏍囪瘑瀛楃涓层€� * @name baidu.lang.guid * @function * @grammar baidu.lang.guid() * @version 1.1.1 * @meta standard * * @returns {String} 褰撳墠椤甸潰鐨勫敮涓€鏍囪瘑瀛楃涓� */ (function(){ //涓嶇洿鎺ヤ娇鐢╳indow锛屽彲浠ユ彁楂�3鍊嶅乏鍙虫€ц兘 var guid = context[baidu.guid]; baidu.lang.guid = function() { return "TANGRAM__" + (guid._counter ++).toString(36); }; guid._counter = guid._counter || 1; })(); /** * 鎵€鏈夌被鐨勫疄渚嬬殑瀹瑰櫒 * key涓烘瘡涓疄渚嬬殑guid * @meta standard */ context[baidu.guid]._instances = context[baidu.guid]._instances || {}; /** * 鍒ゆ柇鐩爣鍙傛暟鏄惁涓篺unction鎴朏unction瀹炰緥 * @name baidu.lang.isFunction * @function * @grammar baidu.lang.isFunction(source) * @param {Any} source 鐩爣鍙傛暟 * @version 1.2 * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate * @meta standard * @returns {boolean} 绫诲瀷鍒ゆ柇缁撴灉 */ baidu.lang.isFunction = function (source) { // chrome涓�,'function' == typeof /a/ 涓簍rue. return '[object Function]' == Object.prototype.toString.call(source); }; /** * * @ignore * @class Tangram缁ф壙鏈哄埗鎻愪緵鐨勪竴涓熀绫伙紝鐢ㄦ埛鍙互閫氳繃缁ф壙baidu.lang.Class鏉ヨ幏鍙栧畠鐨勫睘鎬у強鏂规硶銆� * @name baidu.lang.Class * @grammar baidu.lang.Class(guid) * @param {string} guid 瀵硅薄鐨勫敮涓€鏍囪瘑 * @meta standard * @remark baidu.lang.Class鍜屽畠鐨勫瓙绫荤殑瀹炰緥鍧囧寘鍚竴涓叏灞€鍞竴鐨勬爣璇唃uid銆俫uid鏄湪鏋勯€犲嚱鏁颁腑鐢熸垚鐨勶紝鍥犳锛岀户鎵胯嚜baidu.lang.Class鐨勭被搴旇鐩存帴鎴栬€呴棿鎺ヨ皟鐢ㄥ畠鐨勬瀯閫犲嚱鏁般€�<br>baidu.lang.Class鐨勬瀯閫犲嚱鏁颁腑浜х敓guid鐨勬柟寮忓彲浠ヤ繚璇乬uid鐨勫敮涓€鎬э紝鍙婃瘡涓疄渚嬮兘鏈変竴涓叏灞€鍞竴鐨刧uid銆� * @meta standard * @see baidu.lang.inherits,baidu.lang.Event */ baidu.lang.Class = function(guid) { this.guid = guid || baidu.lang.guid(); context[baidu.guid]._instances[this.guid] = this; }; context[baidu.guid]._instances = context[baidu.guid]._instances || {}; /** * 閲婃斁瀵硅薄鎵€鎸佹湁鐨勮祫婧愶紝涓昏鏄嚜瀹氫箟浜嬩欢銆� * @name dispose * @grammar obj.dispose() */ baidu.lang.Class.prototype.dispose = function(){ delete context[baidu.guid]._instances[this.guid]; for(var property in this){ if (!baidu.lang.isFunction(this[property])) { delete this[property]; } } this.disposed = true; }; /** * 閲嶈浇浜嗛粯璁ょ殑toString鏂规硶锛屼娇寰楄繑鍥炰俊鎭洿鍔犲噯纭竴浜涖€� * @return {string} 瀵硅薄鐨凷tring琛ㄧず褰㈠紡 */ baidu.lang.Class.prototype.toString = function(){ return "[object " + (this._className || "Object" ) + "]"; }; /** * @ignore * @class 鑷畾涔夌殑浜嬩欢瀵硅薄銆� * @name baidu.lang.Event * @grammar baidu.lang.Event(type[, target]) * @param {string} type 浜嬩欢绫诲瀷鍚嶇О銆備负浜嗘柟渚垮尯鍒嗕簨浠跺拰涓€涓櫘閫氱殑鏂规硶锛屼簨浠剁被鍨嬪悕绉板繀椤讳互"on"(灏忓啓)寮€澶淬€� * @param {Object} [target]瑙﹀彂浜嬩欢鐨勫璞� * @meta standard * @remark 寮曞叆璇ユā鍧楋紝浼氳嚜鍔ㄤ负Class寮曞叆3涓簨浠舵墿灞曟柟娉曪細addEventListener銆乺emoveEventListener鍜宒ispatchEvent銆� * @meta standard * @see baidu.lang.Class */ baidu.lang.Event = function (type, target) { this.type = type; this.returnValue = true; this.target = target || null; this.currentTarget = null; }; /** * 娉ㄥ唽瀵硅薄鐨勪簨浠剁洃鍚櫒銆傚紩鍏aidu.lang.Event鍚庯紝Class鐨勫瓙绫诲疄渚嬫墠浼氳幏寰楄鏂规硶銆� * @grammar obj.addEventListener(type, handler[, key]) * @param {string} type 鑷畾涔変簨浠剁殑鍚嶇О * @param {Function} handler 鑷畾涔変簨浠惰瑙﹀彂鏃跺簲璇ヨ皟鐢ㄧ殑鍥炶皟鍑芥暟 * @param {string} [key] 涓轰簨浠剁洃鍚嚱鏁版寚瀹氱殑鍚嶇О锛屽彲鍦ㄧЩ闄ゆ椂浣跨敤銆傚鏋滀笉鎻愪緵锛屾柟娉曚細榛樿涓哄畠鐢熸垚涓€涓叏灞€鍞竴鐨刱ey銆� * @remark 浜嬩欢绫诲瀷鍖哄垎澶у皬鍐欍€傚鏋滆嚜瀹氫箟浜嬩欢鍚嶇О涓嶆槸浠ュ皬鍐�"on"寮€澶达紝璇ユ柟娉曚細缁欏畠鍔犱笂"on"鍐嶈繘琛屽垽鏂紝鍗�"click"鍜�"onclick"浼氳璁や负鏄悓涓€绉嶄簨浠躲€� */ baidu.lang.Class.prototype.addEventListener = function (type, handler, key) { if (!baidu.lang.isFunction(handler)) { return; } !this.__listeners && (this.__listeners = {}); var t = this.__listeners, id; if (typeof key == "string" && key) { if (/[^\w\-]/.test(key)) { throw("nonstandard key:" + key); } else { handler.hashCode = key; id = key; } } type.indexOf("on") != 0 && (type = "on" + type); typeof t[type] != "object" && (t[type] = {}); id = id || baidu.lang.guid(); handler.hashCode = id; t[type][id] = handler; }; /** * 绉婚櫎瀵硅薄鐨勪簨浠剁洃鍚櫒銆傚紩鍏aidu.lang.Event鍚庯紝Class鐨勫瓙绫诲疄渚嬫墠浼氳幏寰楄鏂规硶銆� * @grammar obj.removeEventListener(type, handler) * @param {string} type 浜嬩欢绫诲瀷 * @param {Function|string} handler 瑕佺Щ闄ょ殑浜嬩欢鐩戝惉鍑芥暟鎴栬€呯洃鍚嚱鏁扮殑key * @remark 濡傛灉绗簩涓弬鏁癶andler娌℃湁琚粦瀹氬埌瀵瑰簲鐨勮嚜瀹氫箟浜嬩欢涓紝浠€涔堜篃涓嶅仛銆� */ baidu.lang.Class.prototype.removeEventListener = function (type, handler) { if (typeof handler != "undefined") { if ( (baidu.lang.isFunction(handler) && ! (handler = handler.hashCode)) || (! baidu.lang.isString(handler)) ){ return; } } !this.__listeners && (this.__listeners = {}); type.indexOf("on") != 0 && (type = "on" + type); var t = this.__listeners; if (!t[type]) { return; } if (typeof handler != "undefined") { t[type][handler] && delete t[type][handler]; } else { for(var guid in t[type]){ delete t[type][guid]; } } }; /** * 娲惧彂鑷畾涔変簨浠讹紝浣垮緱缁戝畾鍒拌嚜瀹氫箟浜嬩欢涓婇潰鐨勫嚱鏁伴兘浼氳鎵ц銆傚紩鍏aidu.lang.Event鍚庯紝Class鐨勫瓙绫诲疄渚嬫墠浼氳幏寰楄鏂规硶銆� * @grammar obj.dispatchEvent(event, options) * @param {baidu.lang.Event|String} event Event瀵硅薄锛屾垨浜嬩欢鍚嶇О(1.1.1璧锋敮鎸�) * @param {Object} options 鎵╁睍鍙傛暟,鎵€鍚睘鎬ч敭鍊间細鎵╁睍鍒癊vent瀵硅薄涓�(1.2璧锋敮鎸�) * @remark 澶勭悊浼氳皟鐢ㄩ€氳繃addEventListenr缁戝畾鐨勮嚜瀹氫箟浜嬩欢鍥炶皟鍑芥暟涔嬪锛岃繕浼氳皟鐢ㄧ洿鎺ョ粦瀹氬埌瀵硅薄涓婇潰鐨勮嚜瀹氫箟浜嬩欢銆備緥濡傦細<br> myobj.onMyEvent = function(){}<br> myobj.addEventListener("onMyEvent", function(){}); */ baidu.lang.Class.prototype.dispatchEvent = function (event, options) { if (baidu.lang.isString(event)) { event = new baidu.lang.Event(event); } !this.__listeners && (this.__listeners = {}); // 20100603 娣诲姞鏈柟娉曠殑绗簩涓弬鏁帮紝灏� options extend鍒癳vent涓幓浼犻€� options = options || {}; for (var i in options) { event[i] = options[i]; } var i, t = this.__listeners, p = event.type; event.target = event.target || this; event.currentTarget = this; p.indexOf("on") != 0 && (p = "on" + p); baidu.lang.isFunction(this[p]) && this[p].apply(this, arguments); if (typeof t[p] == "object") { for (i in t[p]) { t[p][i].apply(this, arguments); } } return event.returnValue; }; baidu.lang.inherits = function (subClass, superClass, className) { var key, proto, selfProps = subClass.prototype, clazz = new Function(); clazz.prototype = superClass.prototype; proto = subClass.prototype = new clazz(); for (key in selfProps) { proto[key] = selfProps[key]; } subClass.prototype.constructor = subClass; subClass.superClass = superClass.prototype; // 绫诲悕鏍囪瘑锛屽吋瀹笴lass鐨則oString锛屽熀鏈病鐢� if ("string" == typeof className) { proto._className = className; } }; // 澹版槑蹇嵎鏂规硶 baidu.inherits = baidu.lang.inherits; /** * 鍥剧墖鐨勮矾寰� * @private * @type {String} */ var _IMAGE_PATH = 'http://api.map.baidu.com/library/TextIconOverlay/1.2/src/images/m'; /** * 鍥剧墖鐨勫悗缂€鍚� * @private * @type {String} */ var _IMAGE_EXTENSION = 'png'; /** *@exports TextIconOverlay as BMapLib.TextIconOverlay */ /** * TextIconOverlay * @class 姝ょ被琛ㄧず鍦板浘涓婄殑涓€涓鐩栫墿锛岃瑕嗙洊鐗╃敱鏂囧瓧鍜屽浘鏍囩粍鎴愶紝浠嶰verlay缁ф壙銆傛枃瀛楅€氬父鏄暟瀛楋紙0-9锛夋垨瀛楁瘝锛圓-Z 锛夛紝鑰屾枃瀛椾笌鍥炬爣涔嬮棿鏈変竴瀹氱殑鏄犲皠鍏崇郴銆� *璇ヨ鐩栫墿閫傜敤浜庝互涓嬬被浼肩殑鍦烘櫙锛氶渶瑕佸湪鍦板浘涓婃坊鍔犱竴绯诲垪瑕嗙洊鐗╋紝杩欎簺瑕嗙洊鐗╀箣闂寸敤涓嶅悓鐨勫浘鏍囧拰鏂囧瓧鏉ュ尯鍒嗭紝鏂囧瓧鍙兘琛ㄧず浜嗚瑕嗙洊鐗╃殑鏌愪竴灞炴€у€硷紝鏍规嵁璇ユ枃瀛楀拰涓€瀹氱殑鏄犲皠鍏崇郴锛岃嚜鍔ㄥ尮閰嶇浉搴旈鑹插拰澶у皬鐨勫浘鏍囥€� * *@constructor *@param {Point} position 琛ㄧず涓€涓粡绾害鍧愭爣浣嶇疆銆� *@param {String} text 琛ㄧず璇ヨ鐩栫墿鏄剧ず鐨勬枃瀛椾俊鎭€� *@param {Json Object} options 鍙€夊弬鏁帮紝鍙€夐」鍖呮嫭锛�<br /> *"<b>styles</b>":{Array<IconStyle>} 涓€缁勫浘鏍囬鏍笺€傚崟涓浘琛ㄩ鏍煎寘鎷互涓嬪嚑涓睘鎬э細<br /> * url {String} 鍥剧墖鐨剈rl鍦板潃銆�(蹇呴€�)<br /> * size {Size} 鍥剧墖鐨勫ぇ灏忋€傦紙蹇呴€夛級<br /> * anchor {Size} 鍥炬爣瀹氫綅鍦ㄥ湴鍥句笂鐨勪綅缃浉瀵逛簬鍥炬爣宸︿笂瑙掔殑鍋忕Щ鍊硷紝榛樿鍋忕Щ鍊间负鍥炬爣鐨勪腑蹇冧綅缃€傦紙鍙€夛級<br /> * offset {Size} 鍥剧墖鐩稿浜庡彲瑙嗗尯鍩熺殑鍋忕Щ鍊硷紝姝ゅ姛鑳界殑浣滅敤绛夊悓浜嶤SS涓殑background-position灞炴€с€傦紙鍙€夛級<br /> * textSize {Number} 鏂囧瓧鐨勫ぇ灏忋€傦紙鍙€夛紝榛樿10锛�<br /> * textColor {String} 鏂囧瓧鐨勯鑹层€傦紙鍙€夛紝榛樿black锛�<br /> */ var TextIconOverlay = function(position, text, options){ try { BMap; } catch (e) { throw Error('Baidu Map JS API is not ready yet!'); } T.lang.inherits(TextIconOverlay, BMap.Overlay, "TextIconOverlay"); this._position = position; this._text = text; this._options = options || {}; this._styles = this._options['styles'] || []; (!this._styles.length) && this._setupDefaultStyles(); }; TextIconOverlay.prototype._setupDefaultStyles = function(){ var sizes = [53, 56, 66, 78, 90]; for(var i = 0, size; size = sizes[i]; i++){ this._styles.push({ url:_IMAGE_PATH + i + '.' + _IMAGE_EXTENSION, size: new BMap.Size(size, size) }); }//for寰幆鐨勭畝娲佸啓娉� }; /** *缁ф壙Overlay鐨刬ntialize鏂规硶锛岃嚜瀹氫箟瑕嗙洊鐗╂椂蹇呴』銆� *@param {Map} map BMap.Map鐨勫疄渚嬪寲瀵硅薄銆� *@return {HTMLElement} 杩斿洖瑕嗙洊鐗╁搴旂殑HTML鍏冪礌銆� */ TextIconOverlay.prototype.initialize = function(map){ this._map = map; this._domElement = document.createElement('div'); this._updateCss(); this._updateText(); this._updatePosition(); this._bind(); this._map.getPanes().markerMouseTarget.appendChild(this._domElement); return this._domElement; }; /** *缁ф壙Overlay鐨刣raw鏂规硶锛岃嚜瀹氫箟瑕嗙洊鐗╂椂蹇呴』銆� *@return 鏃犺繑鍥炲€笺€� */ TextIconOverlay.prototype.draw = function(){ this._map && this._updatePosition(); }; /** *鑾峰彇璇ヨ鐩栫墿涓婄殑鏂囧瓧銆� *@return {String} 璇ヨ鐩栫墿涓婄殑鏂囧瓧銆� */ TextIconOverlay.prototype.getText = function(){ return this._text; }; /** *璁剧疆璇ヨ鐩栫墿涓婄殑鏂囧瓧銆� *@param {String} text 瑕佽缃殑鏂囧瓧锛岄€氬父鏄瓧姣岮-Z鎴栨暟瀛�0-9銆� *@return 鏃犺繑鍥炲€笺€� */ TextIconOverlay.prototype.setText = function(text){ if(text && (!this._text || (this._text.toString() != text.toString()))){ this._text = text; this._updateText(); this._updateCss(); this._updatePosition(); } }; /** *鑾峰彇璇ヨ鐩栫墿鐨勪綅缃€� *@return {Point} 璇ヨ鐩栫墿鐨勭粡绾害鍧愭爣銆� */ TextIconOverlay.prototype.getPosition = function () { return this._position; }; /** *璁剧疆璇ヨ鐩栫墿鐨勪綅缃€� *@param {Point} position 瑕佽缃殑缁忕含搴﹀潗鏍囥€� *@return 鏃犺繑鍥炲€笺€� */ TextIconOverlay.prototype.setPosition = function (position) { if(position && (!this._position || !this._position.equals(position))){ this._position = position; this._updatePosition(); } }; /** *鐢辨枃瀛椾俊鎭幏鍙栭鏍兼暟缁勭殑瀵瑰簲绱㈠紩鍊笺€� *鍐呴儴榛樿鐨勫搴斿嚱鏁颁负鏂囧瓧杞崲涓烘暟瀛楅櫎浠�10鐨勭粨鏋滐紝姣斿鏂囧瓧8杩斿洖绱㈠紩0锛屾枃瀛�25杩斿洖绱㈠紩2. *濡傛灉闇€瑕佽嚜瀹氫箟鏄犲皠鍏崇郴锛岃瑕嗙洊璇ュ嚱鏁般€� *@param {String} text 鏂囧瓧銆� *@param {Array<IconStyle>} styles 涓€缁勫浘鏍囬鏍笺€� *@return {Number} 瀵瑰簲鐨勭储寮曞€笺€� */ TextIconOverlay.prototype.getStyleByText = function(text, styles){ var count = parseInt(text); var index = parseInt(count / 10); index = Math.max(0, index); index = Math.min(index, styles.length - 1); return styles[index]; }; /** *鏇存柊鐩稿簲鐨凜SS銆� *@return 鏃犺繑鍥炲€笺€� */ TextIconOverlay.prototype._updateCss = function(){ if (!this._domElement) { return } var style = this.getStyleByText(this._text, this._styles); this._domElement.style.cssText = this._buildCssText(style); }; /** *鏇存柊瑕嗙洊鐗╃殑鏄剧ず鏂囧瓧銆� *@return 鏃犺繑鍥炲€笺€� */ TextIconOverlay.prototype._updateText = function(){ if (this._domElement) { this._domElement.innerHTML = this._text; } }; /** *璋冩暣瑕嗙洊鐗╁湪鍦板浘涓婄殑浣嶇疆鏇存柊瑕嗙洊鐗╃殑鏄剧ず鏂囧瓧銆� *@return 鏃犺繑鍥炲€笺€� */ TextIconOverlay.prototype._updatePosition = function(){ if (this._domElement && this._position) { var style = this._domElement.style; var pixelPosition= this._map.pointToOverlayPixel(this._position); pixelPosition.x -= Math.ceil(parseInt(style.width) / 2); pixelPosition.y -= Math.ceil(parseInt(style.height) / 2); style.left = pixelPosition.x + "px"; style.top = pixelPosition.y + "px"; } }; /** * 涓鸿瑕嗙洊鐗╃殑HTML鍏冪礌鏋勫缓CSS * @param {IconStyle} 涓€涓浘鏍囩殑椋庢牸銆� * @return {String} 鏋勫缓瀹屾垚鐨凜SSTEXT銆� */ TextIconOverlay.prototype._buildCssText = function(style) { //鏍规嵁style鏉ョ‘瀹氫竴浜涢粯璁ゅ€� var url = style['url']; var size = style['size']; var anchor = style['anchor']; var offset = style['offset']; var textColor = style['textColor'] || 'black'; var textSize = style['textSize'] || 10; var csstext = []; if (T.browser["ie"] < 7) { csstext.push('filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(' + 'sizingMethod=scale,src="' + url + '");'); } else { csstext.push('background-image:url(' + url + ');'); var backgroundPosition = '0 0'; (offset instanceof BMap.Size) && (backgroundPosition = offset.width + 'px' + ' ' + offset.height + 'px'); csstext.push('background-position:' + backgroundPosition + ';'); } if (size instanceof BMap.Size){ if (anchor instanceof BMap.Size) { if (anchor.height > 0 && anchor.height < size.height) { csstext.push('height:' + (size.height - anchor.height) + 'px; padding-top:' + anchor.height + 'px;'); } if(anchor.width > 0 && anchor.width < size.width){ csstext.push('width:' + (size.width - anchor.width) + 'px; padding-left:' + anchor.width + 'px;'); } } else { csstext.push('height:' + size.height + 'px; line-height:' + size.height + 'px;'); csstext.push('width:' + size.width + 'px; text-align:center;'); } } csstext.push('cursor:pointer; color:' + textColor + '; position:absolute; font-size:' + textSize + 'px; font-family:Arial,sans-serif; font-weight:bold'); return csstext.join(''); }; /** * 褰撻紶鏍囩偣鍑昏瑕嗙洊鐗╂椂浼氳Е鍙戣浜嬩欢 * @name TextIconOverlay#click * @event * @param {Event Object} e 鍥炶皟鍑芥暟浼氳繑鍥瀍vent鍙傛暟锛屽寘鎷互涓嬭繑鍥炲€硷細 * <br />"<b>type</b> : {String} 浜嬩欢绫诲瀷 * <br />"<b>target</b>锛歿BMapLib.TextIconOverlay} 浜嬩欢鐩爣 * */ /** * 褰撻紶鏍囪繘鍏ヨ瑕嗙洊鐗╁尯鍩熸椂浼氳Е鍙戣浜嬩欢 * @name TextIconOverlay#mouseover * @event * @param {Event Object} e 鍥炶皟鍑芥暟浼氳繑鍥瀍vent鍙傛暟锛屽寘鎷互涓嬭繑鍥炲€硷細 * <br />"<b>type</b> : {String} 浜嬩欢绫诲瀷 * <br />"<b>target</b>锛歿BMapLib.TextIconOverlay} 浜嬩欢鐩爣 * <br />"<b>point</b> : {BMap.Point} 鏈€鏂版坊鍔犱笂鐨勮妭鐐笲Map.Point瀵硅薄 * <br />"<b>pixel</b>锛歿BMap.pixel} 鏈€鏂版坊鍔犱笂鐨勮妭鐐笲Map.Pixel瀵硅薄 * * @example <b>鍙傝€冪ず渚嬶細</b><br /> * myTextIconOverlay.addEventListener("mouseover", function(e) { alert(e.point); }); */ /** * 褰撻紶鏍囩寮€璇ヨ鐩栫墿鍖哄煙鏃朵細瑙﹀彂璇ヤ簨浠� * @name TextIconOverlay#mouseout * @event * @param {Event Object} e 鍥炶皟鍑芥暟浼氳繑鍥瀍vent鍙傛暟锛屽寘鎷互涓嬭繑鍥炲€硷細 * <br />"<b>type</b> : {String} 浜嬩欢绫诲瀷 * <br />"<b>target</b>锛歿BMapLib.TextIconOverlay} 浜嬩欢鐩爣 * <br />"<b>point</b> : {BMap.Point} 鏈€鏂版坊鍔犱笂鐨勮妭鐐笲Map.Point瀵硅薄 * <br />"<b>pixel</b>锛歿BMap.pixel} 鏈€鏂版坊鍔犱笂鐨勮妭鐐笲Map.Pixel瀵硅薄 * * @example <b>鍙傝€冪ず渚嬶細</b><br /> * myTextIconOverlay.addEventListener("mouseout", function(e) { alert(e.point); }); */ /** * 涓鸿瑕嗙洊鐗╃粦瀹氫竴绯诲垪浜嬩欢 * 褰撳墠鏀寔click mouseover mouseout * @return 鏃犺繑鍥炲€笺€� */ TextIconOverlay.prototype._bind = function(){ if (!this._domElement){ return; } var me = this; var map = this._map; var BaseEvent = T.lang.Event; function eventExtend(e, be){ var elem = e.srcElement || e.target; var x = e.clientX || e.pageX; var y = e.clientY || e.pageY; if (e && be && x && y && elem){ var offset = T.dom.getPosition(map.getContainer()); be.pixel = new BMap.Pixel(x - offset.left, y - offset.top); be.point = map.pixelToPoint(be.pixel); } return be; }//缁欎簨浠跺弬鏁板鍔爌ixel鍜宲oint涓や釜鍊� T.event.on(this._domElement,"mouseover", function(e){ me.dispatchEvent(eventExtend(e, new BaseEvent("onmouseover"))); }); T.event.on(this._domElement,"mouseout", function(e){ me.dispatchEvent(eventExtend(e, new BaseEvent("onmouseout"))); }); T.event.on(this._domElement,"click", function(e){ me.dispatchEvent(eventExtend(e, new BaseEvent("onclick"))); }); }; return TextIconOverlay; }); }); var TextIconOverlay = (index$1 && typeof index$1 === 'object' && 'default' in index$1 ? index$1['default'] : index$1); /** * 鑾峰彇涓€涓墿灞曠殑瑙嗗浘鑼冨洿锛屾妸涓婁笅宸﹀彸閮芥墿澶т竴鏍风殑鍍忕礌鍊笺€� * @param {Map} map BMap.Map鐨勫疄渚嬪寲瀵硅薄 * @param {BMap.Bounds} bounds BMap.Bounds鐨勫疄渚嬪寲瀵硅薄 * @param {Number} gridSize 瑕佹墿澶х殑鍍忕礌鍊� * * @return {BMap.Bounds} 杩斿洖鎵╁ぇ鍚庣殑瑙嗗浘鑼冨洿銆� */ var getExtendedBounds = function(map, bounds, gridSize){ bounds = cutBoundsInRange(bounds); var pixelNE = map.pointToPixel(bounds.getNorthEast()); var pixelSW = map.pointToPixel(bounds.getSouthWest()); pixelNE.x += gridSize; pixelNE.y -= gridSize; pixelSW.x -= gridSize; pixelSW.y += gridSize; var newNE = map.pixelToPoint(pixelNE); var newSW = map.pixelToPoint(pixelSW); return new BMap.Bounds(newSW, newNE); }; /** * 鎸夌収鐧惧害鍦板浘鏀寔鐨勪笘鐣岃寖鍥村bounds杩涜杈圭晫澶勭悊 * @param {BMap.Bounds} bounds BMap.Bounds鐨勫疄渚嬪寲瀵硅薄 * * @return {BMap.Bounds} 杩斿洖涓嶈秺鐣岀殑瑙嗗浘鑼冨洿 */ var cutBoundsInRange = function (bounds) { var maxX = getRange(bounds.getNorthEast().lng, -180, 180); var minX = getRange(bounds.getSouthWest().lng, -180, 180); var maxY = getRange(bounds.getNorthEast().lat, -74, 74); var minY = getRange(bounds.getSouthWest().lat, -74, 74); return new BMap.Bounds(new BMap.Point(minX, minY), new BMap.Point(maxX, maxY)); }; /** * 瀵瑰崟涓€艰繘琛岃竟鐣屽鐞嗐€� * @param {Number} i 瑕佸鐞嗙殑鏁板€� * @param {Number} min 涓嬭竟鐣屽€� * @param {Number} max 涓婅竟鐣屽€� * * @return {Number} 杩斿洖涓嶈秺鐣岀殑鏁板€� */ var getRange = function (i, mix, max) { mix && (i = Math.max(i, mix)); max && (i = Math.min(i, max)); return i; }; /** * 鍒ゆ柇缁欏畾鐨勫璞℃槸鍚︿负鏁扮粍 * @param {Object} source 瑕佹祴璇曠殑瀵硅薄 * * @return {Boolean} 濡傛灉鏄暟缁勮繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse */ var isArray = function (source) { return '[object Array]' === Object.prototype.toString.call(source); }; /** * 杩斿洖item鍦╯ource涓殑绱㈠紩浣嶇疆 * @param {Object} item 瑕佹祴璇曠殑瀵硅薄 * @param {Array} source 鏁扮粍 * * @return {Number} 濡傛灉鍦ㄦ暟缁勫唴锛岃繑鍥炵储寮曪紝鍚﹀垯杩斿洖-1 */ var indexOf = function(item, source){ var index = -1; if(isArray(source)){ if (source.indexOf) { index = source.indexOf(item); } else { for (var i = 0, m; m = source[i]; i++) { if (m === item) { index = i; break; } } } } return index; }; /** *@exports MarkerClusterer as BMapLib.MarkerClusterer */ /** * MarkerClusterer * @class 鐢ㄦ潵瑙e喅鍔犺浇澶ч噺鐐硅绱犲埌鍦板浘涓婁骇鐢熻鐩栫幇璞$殑闂锛屽苟鎻愰珮鎬ц兘 * @constructor * @param {Map} map 鍦板浘鐨勪竴涓疄渚嬨€� * @param {Json Object} options 鍙€夊弬鏁帮紝鍙€夐」鍖呮嫭锛�<br /> * markers {Array<Marker>} 瑕佽仛鍚堢殑鏍囪鏁扮粍<br /> * girdSize {Number} 鑱氬悎璁$畻鏃剁綉鏍肩殑鍍忕礌澶у皬锛岄粯璁�60<br /> * maxZoom {Number} 鏈€澶х殑鑱氬悎绾у埆锛屽ぇ浜庤绾у埆灏变笉杩涜鐩稿簲鐨勮仛鍚�<br /> * minClusterSize {Number} 鏈€灏忕殑鑱氬悎鏁伴噺锛屽皬浜庤鏁伴噺鐨勪笉鑳芥垚涓轰竴涓仛鍚堬紝榛樿涓�2<br /> * isAverangeCenter {Boolean} 鑱氬悎鐐圭殑钀借剼浣嶇疆鏄惁鏄墍鏈夎仛鍚堝湪鍐呯偣鐨勫钩鍧囧€硷紝榛樿涓哄惁锛岃惤鑴氬湪鑱氬悎鍐呯殑绗竴涓偣<br /> * styles {Array<IconStyle>} 鑷畾涔夎仛鍚堝悗鐨勫浘鏍囬鏍硷紝璇峰弬鑰僒extIconOverlay绫�<br /> */ var MarkerClusterer = function(map, options){ try { BMap; } catch (e) { throw Error('Baidu Map JS API is not ready yet!'); } if (!map){ return; } this._map = map; this._markers = []; this._clusters = []; var opts = options || {}; this._gridSize = opts["gridSize"] || 60; this._maxZoom = opts["maxZoom"] || 18; this._minClusterSize = opts["minClusterSize"] || 2; this._isAverageCenter = false; if (opts['isAverageCenter'] != undefined) { this._isAverageCenter = opts['isAverageCenter']; } this._styles = opts["styles"] || []; var that = this; this._map.addEventListener("zoomend",function(){ that._redraw(); }); this._map.addEventListener("moveend",function(){ that._redraw(); }); var mkrs = opts["markers"]; isArray(mkrs) && this.addMarkers(mkrs); }; /** * 娣诲姞瑕佽仛鍚堢殑鏍囪鏁扮粍銆� * @param {Array<Marker>} markers 瑕佽仛鍚堢殑鏍囪鏁扮粍 * * @return 鏃犺繑鍥炲€笺€� */ MarkerClusterer.prototype.addMarkers = function(markers){ if (!markers.length) { return } for(var i = 0, len = markers.length; i <len ; i++){ this._pushMarkerTo(markers[i]); } this._createClusters(); }; /** * 鎶婁竴涓爣璁版坊鍔犲埌瑕佽仛鍚堢殑鏍囪鏁扮粍涓� * @param {BMap.Marker} marker 瑕佹坊鍔犵殑鏍囪 * * @return 鏃犺繑鍥炲€笺€� */ MarkerClusterer.prototype._pushMarkerTo = function(marker){ var index = indexOf(marker, this._markers); if(index === -1){ marker.isInCluster = false; this._markers.push(marker);//Marker鎷栨斁鍚巈nableDragging涓嶅仛鍙樺寲锛屽拷鐣� } }; /** * 娣诲姞涓€涓仛鍚堢殑鏍囪銆� * @param {BMap.Marker} marker 瑕佽仛鍚堢殑鍗曚釜鏍囪銆� * @return 鏃犺繑鍥炲€笺€� */ MarkerClusterer.prototype.addMarker = function(marker) { this._pushMarkerTo(marker); this._createClusters(); }; /** * 鏍规嵁鎵€缁欏畾鐨勬爣璁帮紝鍒涘缓鑱氬悎鐐� * @return 鏃犺繑鍥炲€� */ MarkerClusterer.prototype._createClusters = function(){ var mapBounds = this._map.getBounds(); if (!mapBounds.getCenter()) { return } var extendedBounds = getExtendedBounds(this._map, mapBounds, this._gridSize); for(var i = 0, marker; marker = this._markers[i]; i++){ if(!marker.isInCluster && extendedBounds.containsPoint(marker.getPosition()) ){ this._addToClosestCluster(marker); } } }; /** * 鏍规嵁鏍囪鐨勪綅缃紝鎶婂畠娣诲姞鍒版渶杩戠殑鑱氬悎涓� * @param {BMap.Marker} marker 瑕佽繘琛岃仛鍚堢殑鍗曚釜鏍囪 * * @return 鏃犺繑鍥炲€笺€� */ MarkerClusterer.prototype._addToClosestCluster = function (marker){ var distance = 4000000; var clusterToAddTo = null; var position = marker.getPosition(); for(var i = 0, cluster; cluster = this._clusters[i]; i++){ var center = cluster.getCenter(); if(center){ var d = this._map.getDistance(center, marker.getPosition()); if(d < distance){ distance = d; clusterToAddTo = cluster; } } } if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)){ clusterToAddTo.addMarker(marker); } else { var cluster = new Cluster(this); cluster.addMarker(marker); this._clusters.push(cluster); } }; /** * 娓呴櫎涓婁竴娆$殑鑱氬悎鐨勭粨鏋� * @return 鏃犺繑鍥炲€笺€� */ MarkerClusterer.prototype._clearLastClusters = function(){ for(var i = 0, cluster; cluster = this._clusters[i]; i++){ cluster.remove(); } this._clusters = [];//缃┖Cluster鏁扮粍 this._removeMarkersFromCluster();//鎶奙arker鐨刢luster鏍囪璁句负false }; /** * 娓呴櫎鏌愪釜鑱氬悎涓殑鎵€鏈夋爣璁� * @return 鏃犺繑鍥炲€� */ MarkerClusterer.prototype._removeMarkersFromCluster = function(){ for(var i = 0, marker; marker = this._markers[i]; i++){ marker.isInCluster = false; } }; /** * 鎶婃墍鏈夌殑鏍囪浠庡湴鍥句笂娓呴櫎 * @return 鏃犺繑鍥炲€� */ MarkerClusterer.prototype._removeMarkersFromMap = function(){ for(var i = 0, marker; marker = this._markers[i]; i++){ marker.isInCluster = false; var label = marker.getLabel(); this._map.removeOverlay(marker); marker.setLabel(label); } }; /** * 鍒犻櫎鍗曚釜鏍囪 * @param {BMap.Marker} marker 闇€瑕佽鍒犻櫎鐨刴arker * * @return {Boolean} 鍒犻櫎鎴愬姛杩斿洖true锛屽惁鍒欒繑鍥瀎alse */ MarkerClusterer.prototype._removeMarker = function(marker) { var index = indexOf(marker, this._markers); if (index === -1) { return false; } this._map.removeOverlay(marker); this._markers.splice(index, 1); return true; }; /** * 鍒犻櫎鍗曚釜鏍囪 * @param {BMap.Marker} marker 闇€瑕佽鍒犻櫎鐨刴arker * * @return {Boolean} 鍒犻櫎鎴愬姛杩斿洖true锛屽惁鍒欒繑鍥瀎alse */ MarkerClusterer.prototype.removeMarker = function(marker) { var success = this._removeMarker(marker); if (success) { this._clearLastClusters(); this._createClusters(); } return success; }; /** * 鍒犻櫎涓€缁勬爣璁� * @param {Array<BMap.Marker>} markers 闇€瑕佽鍒犻櫎鐨刴arker鏁扮粍 * * @return {Boolean} 鍒犻櫎鎴愬姛杩斿洖true锛屽惁鍒欒繑鍥瀎alse */ MarkerClusterer.prototype.removeMarkers = function(markers) { var success = false; for (var i = 0; i < markers.length; i++) { var r = this._removeMarker(markers[i]); success = success || r; } if (success) { this._clearLastClusters(); this._createClusters(); } return success; }; /** * 浠庡湴鍥句笂褰诲簳娓呴櫎鎵€鏈夌殑鏍囪 * @return 鏃犺繑鍥炲€� */ MarkerClusterer.prototype.clearMarkers = function() { this._clearLastClusters(); this._removeMarkersFromMap(); this._markers = []; }; /** * 閲嶆柊鐢熸垚锛屾瘮濡傛敼鍙樹簡灞炴€х瓑 * @return 鏃犺繑鍥炲€� */ MarkerClusterer.prototype._redraw = function () { this._clearLastClusters(); this._createClusters(); }; /** * 鑾峰彇缃戞牸澶у皬 * @return {Number} 缃戞牸澶у皬 */ MarkerClusterer.prototype.getGridSize = function() { return this._gridSize; }; /** * 璁剧疆缃戞牸澶у皬 * @param {Number} size 缃戞牸澶у皬 * @return 鏃犺繑鍥炲€� */ MarkerClusterer.prototype.setGridSize = function(size) { this._gridSize = size; this._redraw(); }; /** * 鑾峰彇鑱氬悎鐨勬渶澶х缉鏀剧骇鍒€� * @return {Number} 鑱氬悎鐨勬渶澶х缉鏀剧骇鍒€� */ MarkerClusterer.prototype.getMaxZoom = function() { return this._maxZoom; }; /** * 璁剧疆鑱氬悎鐨勬渶澶х缉鏀剧骇鍒� * @param {Number} maxZoom 鑱氬悎鐨勬渶澶х缉鏀剧骇鍒� * @return 鏃犺繑鍥炲€� */ MarkerClusterer.prototype.setMaxZoom = function(maxZoom) { this._maxZoom = maxZoom; this._redraw(); }; /** * 鑾峰彇鑱氬悎鐨勬牱寮忛鏍奸泦鍚� * @return {Array<IconStyle>} 鑱氬悎鐨勬牱寮忛鏍奸泦鍚� */ MarkerClusterer.prototype.getStyles = function() { return this._styles; }; /** * 璁剧疆鑱氬悎鐨勬牱寮忛鏍奸泦鍚� * @param {Array<IconStyle>} styles 鏍峰紡椋庢牸鏁扮粍 * @return 鏃犺繑鍥炲€� */ MarkerClusterer.prototype.setStyles = function(styles) { this._styles = styles; this._redraw(); }; /** * 鑾峰彇鍗曚釜鑱氬悎鐨勬渶灏忔暟閲忋€� * @return {Number} 鍗曚釜鑱氬悎鐨勬渶灏忔暟閲忋€� */ MarkerClusterer.prototype.getMinClusterSize = function() { return this._minClusterSize; }; /** * 璁剧疆鍗曚釜鑱氬悎鐨勬渶灏忔暟閲忋€� * @param {Number} size 鍗曚釜鑱氬悎鐨勬渶灏忔暟閲忋€� * @return 鏃犺繑鍥炲€笺€� */ MarkerClusterer.prototype.setMinClusterSize = function(size) { this._minClusterSize = size; this._redraw(); }; /** * 鑾峰彇鍗曚釜鑱氬悎鐨勮惤鑴氱偣鏄惁鏄仛鍚堝唴鎵€鏈夋爣璁扮殑骞冲潎涓績銆� * @return {Boolean} true鎴杅alse銆� */ MarkerClusterer.prototype.isAverageCenter = function() { return this._isAverageCenter; }; /** * 鑾峰彇鑱氬悎鐨凪ap瀹炰緥銆� * @return {Map} Map鐨勭ず渚嬨€� */ MarkerClusterer.prototype.getMap = function() { return this._map; }; /** * 鑾峰彇鎵€鏈夌殑鏍囪鏁扮粍銆� * @return {Array<Marker>} 鏍囪鏁扮粍銆� */ MarkerClusterer.prototype.getMarkers = function() { return this._markers; }; /** * 鑾峰彇鑱氬悎鐨勬€绘暟閲忋€� * @return {Number} 鑱氬悎鐨勬€绘暟閲忋€� */ MarkerClusterer.prototype.getClustersCount = function() { var count = 0; for(var i = 0, cluster; cluster = this._clusters[i]; i++){ cluster.isReal() && count++; } return count; }; /** * @ignore * Cluster * @class 琛ㄧず涓€涓仛鍚堝璞★紝璇ヨ仛鍚堬紝鍖呭惈鏈塏涓爣璁帮紝杩橬涓爣璁扮粍鎴愮殑鑼冨洿锛屽苟鏈変簣浠ユ樉绀哄湪Map涓婄殑TextIconOverlay绛夈€� * @constructor * @param {MarkerClusterer} markerClusterer 涓€涓爣璁拌仛鍚堝櫒绀轰緥銆� */ function Cluster(markerClusterer){ this._markerClusterer = markerClusterer; this._map = markerClusterer.getMap(); this._minClusterSize = markerClusterer.getMinClusterSize(); this._isAverageCenter = markerClusterer.isAverageCenter(); this._center = null;//钀借剼浣嶇疆 this._markers = [];//杩欎釜Cluster涓墍鍖呭惈鐨刴arkers this._gridBounds = null;//浠ヤ腑蹇冪偣涓哄噯锛屽悜鍥涜竟鎵╁ぇgridSize涓儚绱犵殑鑼冨洿锛屼篃鍗崇綉鏍艰寖鍥� this._isReal = false; //鐪熺殑鏄釜鑱氬悎 this._clusterMarker = new TextIconOverlay(this._center, this._markers.length, {"styles":this._markerClusterer.getStyles()}); //this._map.addOverlay(this._clusterMarker); } /** * 鍚戣鑱氬悎娣诲姞涓€涓爣璁般€� * @param {Marker} marker 瑕佹坊鍔犵殑鏍囪銆� * @return 鏃犺繑鍥炲€笺€� */ Cluster.prototype.addMarker = function(marker){ if(this.isMarkerInCluster(marker)){ return false; }//涔熷彲鐢╩arker.isInCluster鍒ゆ柇,澶栭潰鍒ゆ柇OK锛岃繖閲屽熀鏈笉浼氬懡涓� if (!this._center){ this._center = marker.getPosition(); this.updateGridBounds();// } else { if(this._isAverageCenter){ var l = this._markers.length + 1; var lat = (this._center.lat * (l - 1) + marker.getPosition().lat) / l; var lng = (this._center.lng * (l - 1) + marker.getPosition().lng) / l; this._center = new BMap.Point(lng, lat); this.updateGridBounds(); }//璁$畻鏂扮殑Center } marker.isInCluster = true; this._markers.push(marker); var len = this._markers.length; if(len < this._minClusterSize ){ this._map.addOverlay(marker); //this.updateClusterMarker(); return true; } else if (len === this._minClusterSize) { for (var i = 0; i < len; i++) { var label = this._markers[i].getLabel(); this._markers[i].getMap() && this._map.removeOverlay(this._markers[i]); this._markers[i].setLabel(label); } } this._map.addOverlay(this._clusterMarker); this._isReal = true; this.updateClusterMarker(); return true; }; /** * 鍒ゆ柇涓€涓爣璁版槸鍚﹀湪璇ヨ仛鍚堜腑銆� * @param {Marker} marker 瑕佸垽鏂殑鏍囪銆� * @return {Boolean} true鎴杅alse銆� */ Cluster.prototype.isMarkerInCluster= function(marker){ if (this._markers.indexOf) { return this._markers.indexOf(marker) != -1; } else { for (var i = 0, m; m = this._markers[i]; i++) { if (m === marker) { return true; } } } return false; }; /** * 鍒ゆ柇涓€涓爣璁版槸鍚﹀湪璇ヨ仛鍚堢綉鏍艰寖鍥翠腑銆� * @param {Marker} marker 瑕佸垽鏂殑鏍囪銆� * @return {Boolean} true鎴杅alse銆� */ Cluster.prototype.isMarkerInClusterBounds = function(marker) { return this._gridBounds.containsPoint(marker.getPosition()); }; Cluster.prototype.isReal = function(marker) { return this._isReal; }; /** * 鏇存柊璇ヨ仛鍚堢殑缃戞牸鑼冨洿銆� * @return 鏃犺繑鍥炲€笺€� */ Cluster.prototype.updateGridBounds = function() { var bounds = new BMap.Bounds(this._center, this._center); this._gridBounds = getExtendedBounds(this._map, bounds, this._markerClusterer.getGridSize()); }; /** * 鏇存柊璇ヨ仛鍚堢殑鏄剧ず鏍峰紡锛屼篃鍗砊extIconOverlay銆� * @return 鏃犺繑鍥炲€笺€� */ Cluster.prototype.updateClusterMarker = function () { if (this._map.getZoom() > this._markerClusterer.getMaxZoom()) { this._clusterMarker && this._map.removeOverlay(this._clusterMarker); for (var i = 0, marker; marker = this._markers[i]; i++) { this._map.addOverlay(marker); } return; } if (this._markers.length < this._minClusterSize) { this._clusterMarker.hide(); return; } this._clusterMarker.setPosition(this._center); this._clusterMarker.setText(this._markers.length); this._clusterMarker.addEventListener && !this._clusterMarker._hasClickEvent && this._clusterMarker.addEventListener("click", function(event){ this._clusterMarker._hasClickEvent = true; this._markers && this._map.setViewport(this.getBounds()); }.bind(this)); }; /** * 鍒犻櫎璇ヨ仛鍚堛€� * @return 鏃犺繑鍥炲€笺€� */ Cluster.prototype.remove = function(){ for (var i = 0, m; m = this._markers[i]; i++) { var label = this._markers[i].getLabel(); this._markers[i].getMap() && this._map.removeOverlay(this._markers[i]); this._markers[i].setLabel(label); }//娓呴櫎鏁g殑鏍囪鐐� this._map.removeOverlay(this._clusterMarker); this._markers.length = 0; delete this._markers; }; /** * 鑾峰彇璇ヨ仛鍚堟墍鍖呭惈鐨勬墍鏈夋爣璁扮殑鏈€灏忓鎺ョ煩褰㈢殑鑼冨洿銆� * @return {BMap.Bounds} 璁$畻鍑虹殑鑼冨洿銆� */ Cluster.prototype.getBounds = function() { var bounds = new BMap.Bounds(this._center,this._center); for (var i = 0, marker; marker = this._markers[i]; i++) { bounds.extend(marker.getPosition()); } return bounds; }; /** * 鑾峰彇璇ヨ仛鍚堢殑钀借剼鐐广€� * @return {BMap.Point} 璇ヨ仛鍚堢殑钀借剼鐐广€� */ Cluster.prototype.getCenter = function() { return this._center; }; return MarkerClusterer; })));