BDMarkerTool.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. /**
  2. * @fileoverview 百度地图的添加标注工具类,对外开放。
  3. * 允许用户在地图上点击后添加一个点标注,允许用户设定标注的图标样式。
  4. * 主入口类是<a href="symbols/BMapLib.MarkerTool.html">MarkerTool</a>,
  5. * 基于Baidu Map API 1.2。
  6. *
  7. * @author Baidu Map Api Group
  8. * @version 1.2
  9. */
  10. /**
  11. * @namespace BMap的所有library类均放在BMapLib命名空间下
  12. */
  13. var BMapLib = window.BMapLib = BMapLib || {};
  14. if(typeof BMapLib._toolInUse == "undefined"){
  15. BMapLib._toolInUse = false; //该工具是否在使用,避免多个鼠标工具一起使用的情况
  16. //如:用户打开了添加标注工具,就不能再打开测距工具。
  17. }
  18. (function() {
  19. /**
  20. * baidu tangram 代码部分,tangram代码提供了一些基础的操作,如:类的继承、
  21. * 事件的派发、事件的绑定等,而且兼容各种浏览器,在tangram基础上构建MarkerTool
  22. * 比较快捷。
  23. */
  24. var baidu = baidu || {guid : "$BAIDU$"};
  25. (function() {
  26. // 一些页面级别唯一的属性,需要挂载在window[baidu.guid]上
  27. window[baidu.guid] = {};
  28. /**
  29. * 将源对象的所有属性拷贝到目标对象中
  30. * @name baidu.extend
  31. * @function
  32. * @grammar baidu.extend(target, source)
  33. * @param {Object} target 目标对象
  34. * @param {Object} source 源对象
  35. * @returns {Object} 目标对象
  36. */
  37. baidu.extend = function (target, source) {
  38. for (var p in source) {
  39. if (source.hasOwnProperty(p)) {
  40. target[p] = source[p];
  41. }
  42. }
  43. return target;
  44. };
  45. /**
  46. * @ignore
  47. * @namespace
  48. * @baidu.lang 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。
  49. * @property guid 对象的唯一标识
  50. */
  51. baidu.lang = baidu.lang || {};
  52. /**
  53. * 返回一个当前页面的唯一标识字符串。
  54. * @function
  55. * @grammar baidu.lang.guid()
  56. * @returns {String} 当前页面的唯一标识字符串
  57. */
  58. baidu.lang.guid = function() {
  59. return "TANGRAM__" + (window[baidu.guid]._counter ++).toString(36);
  60. };
  61. window[baidu.guid]._counter = window[baidu.guid]._counter || 1;
  62. /**
  63. * 所有类的实例的容器
  64. * key为每个实例的guid
  65. */
  66. window[baidu.guid]._instances = window[baidu.guid]._instances || {};
  67. /**
  68. * Tangram继承机制提供的一个基类,用户可以通过继承baidu.lang.Class来获取它的属性及方法。
  69. * @function
  70. * @name baidu.lang.Class
  71. * @grammar baidu.lang.Class(guid)
  72. * @param {string} guid 对象的唯一标识
  73. * @meta standard
  74. * @remark baidu.lang.Class和它的子类的实例均包含一个全局唯一的标识guid。
  75. * guid是在构造函数中生成的,因此,继承自baidu.lang.Class的类应该直接或者间接调用它的构造函数。<br>
  76. * baidu.lang.Class的构造函数中产生guid的方式可以保证guid的唯一性,及每个实例都有一个全局唯一的guid。
  77. */
  78. baidu.lang.Class = function(guid) {
  79. this.guid = guid || baidu.lang.guid();
  80. window[baidu.guid]._instances[this.guid] = this;
  81. };
  82. /**
  83. * 判断目标参数是否string类型或String对象
  84. * @name baidu.lang.isString
  85. * @function
  86. * @grammar baidu.lang.isString(source)
  87. * @param {Any} source 目标参数
  88. * @shortcut isString
  89. * @meta standard
  90. *
  91. * @returns {boolean} 类型判断结果
  92. */
  93. baidu.lang.isString = function (source) {
  94. return '[object String]' == Object.prototype.toString.call(source);
  95. };
  96. /**
  97. * 判断目标参数是否为function或Function实例
  98. * @name baidu.lang.isFunction
  99. * @function
  100. * @grammar baidu.lang.isFunction(source)
  101. * @param {Any} source 目标参数
  102. * @returns {boolean} 类型判断结果
  103. */
  104. baidu.lang.isFunction = function (source) {
  105. return '[object Function]' == Object.prototype.toString.call(source);
  106. };
  107. /**
  108. * 重载了默认的toString方法,使得返回信息更加准确一些。
  109. * @return {string} 对象的String表示形式
  110. */
  111. baidu.lang.Class.prototype.toString = function(){
  112. return "[object " + (this._className || "Object" ) + "]";
  113. };
  114. /**
  115. * 释放对象所持有的资源,主要是自定义事件。
  116. * @name dispose
  117. * @grammar obj.dispose()
  118. */
  119. baidu.lang.Class.prototype.dispose = function(){
  120. delete window[baidu.guid]._instances[this.guid];
  121. for(var property in this){
  122. if (!baidu.lang.isFunction(this[property])) {
  123. delete this[property];
  124. }
  125. }
  126. this.disposed = true;
  127. };
  128. /**
  129. * 自定义的事件对象。
  130. * @function
  131. * @name baidu.lang.Event
  132. * @grammar baidu.lang.Event(type[, target])
  133. * @param {string} type 事件类型名称。为了方便区分事件和一个普通的方法,事件类型名称必须以"on"(小写)开头。
  134. * @param {Object} [target]触发事件的对象
  135. * @meta standard
  136. * @remark 引入该模块,会自动为Class引入3个事件扩展方法:addEventListener、removeEventListener和dispatchEvent。
  137. * @see baidu.lang.Class
  138. */
  139. baidu.lang.Event = function (type, target) {
  140. this.type = type;
  141. this.returnValue = true;
  142. this.target = target || null;
  143. this.currentTarget = null;
  144. };
  145. /**
  146. * 注册对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。
  147. * @grammar obj.addEventListener(type, handler[, key])
  148. * @param {string} type 自定义事件的名称
  149. * @param {Function} handler 自定义事件被触发时应该调用的回调函数
  150. * @param {string} [key] 为事件监听函数指定的名称,可在移除时使用。如果不提供,方法会默认为它生成一个全局唯一的key。
  151. * @remark 事件类型区分大小写。如果自定义事件名称不是以小写"on"开头,该方法会给它加上"on"再进行判断,即"click"和"onclick"会被认为是同一种事件。
  152. */
  153. baidu.lang.Class.prototype.addEventListener = function (type, handler, key) {
  154. if (!baidu.lang.isFunction(handler)) {
  155. return;
  156. }
  157. !this.__listeners && (this.__listeners = {});
  158. var t = this.__listeners, id;
  159. if (typeof key == "string" && key) {
  160. if (/[^\w\-]/.test(key)) {
  161. throw("nonstandard key:" + key);
  162. } else {
  163. handler.hashCode = key;
  164. id = key;
  165. }
  166. }
  167. type.indexOf("on") != 0 && (type = "on" + type);
  168. typeof t[type] != "object" && (t[type] = {});
  169. id = id || baidu.lang.guid();
  170. handler.hashCode = id;
  171. t[type][id] = handler;
  172. };
  173. /**
  174. * 移除对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。
  175. * @grammar obj.removeEventListener(type, handler)
  176. * @param {string} type 事件类型
  177. * @param {Function|string} handler 要移除的事件监听函数或者监听函数的key
  178. * @remark 如果第二个参数handler没有被绑定到对应的自定义事件中,什么也不做。
  179. */
  180. baidu.lang.Class.prototype.removeEventListener = function (type, handler) {
  181. if (baidu.lang.isFunction(handler)) {
  182. handler = handler.hashCode;
  183. } else if (!baidu.lang.isString(handler)) {
  184. return;
  185. }
  186. !this.__listeners && (this.__listeners = {});
  187. type.indexOf("on") != 0 && (type = "on" + type);
  188. var t = this.__listeners;
  189. if (!t[type]) {
  190. return;
  191. }
  192. t[type][handler] && delete t[type][handler];
  193. };
  194. /**
  195. * 派发自定义事件,使得绑定到自定义事件上面的函数都会被执行。引入baidu.lang.Event后,Class的子类实例才会获得该方法。
  196. * @grammar obj.dispatchEvent(event, options)
  197. * @param {baidu.lang.Event|String} event Event对象,或事件名称(1.1.1起支持)
  198. * @param {Object} options 扩展参数,所含属性键值会扩展到Event对象上(1.2起支持)
  199. * @remark 处理会调用通过addEventListenr绑定的自定义事件回调函数之外,还会调用直接绑定到对象上面的自定义事件。
  200. * 例如:<br>
  201. * myobj.onMyEvent = function(){}<br>
  202. * myobj.addEventListener("onMyEvent", function(){});
  203. */
  204. baidu.lang.Class.prototype.dispatchEvent = function (event, options) {
  205. if (baidu.lang.isString(event)) {
  206. event = new baidu.lang.Event(event);
  207. }
  208. !this.__listeners && (this.__listeners = {});
  209. options = options || {};
  210. for (var i in options) {
  211. event[i] = options[i];
  212. }
  213. var i, t = this.__listeners, p = event.type;
  214. event.target = event.target || this;
  215. event.currentTarget = this;
  216. p.indexOf("on") != 0 && (p = "on" + p);
  217. baidu.lang.isFunction(this[p]) && this[p].apply(this, arguments);
  218. if (typeof t[p] == "object") {
  219. for (i in t[p]) {
  220. t[p][i].apply(this, arguments);
  221. }
  222. }
  223. return event.returnValue;
  224. };
  225. /**
  226. * 为类型构造器建立继承关系
  227. * @name baidu.lang.inherits
  228. * @function
  229. * @grammar baidu.lang.inherits(subClass, superClass[, className])
  230. * @param {Function} subClass 子类构造器
  231. * @param {Function} superClass 父类构造器
  232. * @param {string} className 类名标识
  233. * @remark 使subClass继承superClass的prototype,
  234. * 因此subClass的实例能够使用superClass的prototype中定义的所有属性和方法。<br>
  235. * 这个函数实际上是建立了subClass和superClass的原型链集成,并对subClass进行了constructor修正。<br>
  236. * <strong>注意:如果要继承构造函数,需要在subClass里面call一下,具体见下面的demo例子</strong>
  237. * @shortcut inherits
  238. * @meta standard
  239. * @see baidu.lang.Class
  240. */
  241. baidu.lang.inherits = function (subClass, superClass, className) {
  242. var key, proto,
  243. selfProps = subClass.prototype,
  244. clazz = new Function();
  245. clazz.prototype = superClass.prototype;
  246. proto = subClass.prototype = new clazz();
  247. for (key in selfProps) {
  248. proto[key] = selfProps[key];
  249. }
  250. subClass.prototype.constructor = subClass;
  251. subClass.superClass = superClass.prototype;
  252. if ("string" == typeof className) {
  253. proto._className = className;
  254. }
  255. };
  256. })();
  257. /**
  258. * MarkerTool代码部分, 此类继承基类baidu.lang.Class,便于派发自定义事件,如:markend事件派发
  259. * @exports MarkerTool as BMapLib.MarkerTool
  260. */
  261. var MarkerTool =
  262. /**
  263. * MarkerTool类的构造函数
  264. * @class 地图上添加标注类,实现点击地图添加点标注<b>入口</b>。
  265. * 实例化该类后,即可调用该类提供的<a href="symbols/BMapLib.MarkerTool.html#open">open</a>
  266. * 方法开启添加点标注状态。
  267. *
  268. * @constructor
  269. * @param {Map} map Baidu map的实例对象
  270. * @param {Json Object} opts 可选的输入参数,非必填项。可输入选项包括:
  271. * <br />"<b>icon</b>" : {Icon} 标注使用到的图标,标注时候鼠标跟随样式也通过此属性设置
  272. * <br />"<b>followText</b>" : {String} 跟随鼠标移动的说明文字,默认为空
  273. * <br />"<b>autoClose</b>" : {Boolean} 是否在每次添加完Marker后自动关闭工具
  274. *
  275. * @example <b>参考示例:</b><br />
  276. * var map = new BMap.Map("container");<br />map.centerAndZoom(new BMap.Point(116.404, 39.915), 15);<br />var mkrTool = new BMapLib.MarkerTool(map, {followText: "添加一个点"});
  277. */
  278. BMapLib.MarkerTool = function(map, opts){
  279. baidu.lang.Class.call(this);//继承基类baidu.lang.Class的构造函数
  280. this._map = map;
  281. this._opts = {
  282. icon: MarkerTool.SYS_ICONS[8], //默认选择红色雨滴样式
  283. followText: "点击地图添加工作场所", //鼠标跟随文字提示
  284. autoClose: true //是否添加完毕标注就关闭此工具
  285. };
  286. baidu.extend(this._opts, opts);//用户设定参数覆盖默认设定参数
  287. this._isOpen = false; // 表示控件项当前的状态
  288. this._opts.followText = this._checkStr(this._opts.followText); //检查字串合法性
  289. this._followMarker = null; //鼠标跟随Marker
  290. this._followLabel = null; //鼠标跟随文本提示
  291. };
  292. baidu.lang.inherits(MarkerTool, baidu.lang.Class , "MarkerTool");//继承基类baidu.lang.Class所有prototype属性挂接的方法
  293. /**
  294. * 开启工具
  295. * @return {Boolean} true表示开启成功,false表示开启失败
  296. */
  297. MarkerTool.prototype.open = function(){
  298. if(!this._map){
  299. return false;
  300. }
  301. if (this._isOpen == true){
  302. return true;
  303. }
  304. if (BMapLib._toolInUse){
  305. return false;
  306. }
  307. BMapLib._toolInUse = true; //当前鼠标状态正在使用中,如果存在多个鼠标工具,
  308. //可以使用此变量限制地图上只能存在一种鼠标操作状态
  309. this._isOpen = true;
  310. // 绑定mousemove 和 click 事件
  311. if (!this._binded){
  312. this._bind();
  313. this._binded = true;
  314. }
  315. //初始化跟随Marker
  316. if (!this._followMarker) {
  317. this._followMarker = new BMap.Marker(this._map.getCenter(), {offset: new BMap.Size(-10, -10)}); //偏移-10像素,解决cursor问题
  318. this._map.addOverlay(this._followMarker);
  319. this._followMarker.setZIndex(1000); // 设置跟随Marker的z轴高度
  320. this._followMarker.hide();
  321. }
  322. //初始化跟随Label
  323. if (!this._followLabel){
  324. this._followLabel = new BMap.Label(this._opts.followText, {offset: new BMap.Size(20, 0)});
  325. }
  326. this._preCursor = this._map.getDefaultCursor(); //记录当前的鼠标cursor
  327. this._map.setDefaultCursor("url(" + MarkerTool.CUR_IMG + "), default");//设置鼠标样式
  328. return true;
  329. };
  330. /**
  331. * 关闭工具
  332. * @return 无返回值
  333. */
  334. MarkerTool.prototype.close = function(){
  335. if (!this._isOpen){
  336. return;
  337. }
  338. //取消绑定事件
  339. this._map.removeEventListener("mousemove", this._mouseMoveHandler);
  340. this._map.removeEventListener("click", this._clickHandler);
  341. this._followMarker.hide();//隐藏跟随marker
  342. this._map.setDefaultCursor(this._preCursor);//设置鼠标样式
  343. BMapLib._toolInUse = false;
  344. this._isOpen = false;
  345. this._binded = false;
  346. };
  347. /**
  348. * 设置标注的图标及鼠标跟随样式
  349. * @param {Icon} icon 标注样式及鼠标跟随样式,为了方便用户设置Icon,系统提供了
  350. * 24种默认的图标,分别是:BMapLib.MarkerTool.SYS_ICON[0] -- BMapLib.MarkerTool.SYS_ICON[23]
  351. */
  352. MarkerTool.prototype.setIcon = function(icon){
  353. if (!icon || !(icon instanceof BMap.Icon)){
  354. return;
  355. }
  356. this._opts.icon = icon;
  357. };
  358. /**
  359. * 获取标注图标及鼠标跟随样式
  360. * @return {Icon} 当前标注及鼠标跟随样式
  361. */
  362. MarkerTool.prototype.getIcon = function(){
  363. return this._opts.icon;
  364. };
  365. /**
  366. * 检查字串的合法性,剔除xss漏洞输入字符
  367. * @return {String} 合法字符
  368. */
  369. MarkerTool.prototype._checkStr = function(str){
  370. if (!str){
  371. return "";
  372. }
  373. return str.replace(/</g, "&lt;").replace(/>/g, "&gt;");
  374. };
  375. /**
  376. * 绑定地图的mousemove 和 click 事件
  377. * @return 无返回值
  378. */
  379. MarkerTool.prototype._bind = function(){
  380. var me = this;
  381. if (!me._isOpen){//判断工具是否打开
  382. return;
  383. }
  384. //绑定mousemove事件
  385. me._mouseMoveHandler = function(evt){
  386. var pt = evt.point;
  387. me._followMarker.setIcon(me._opts.icon); //每次都检查最新的Icon
  388. me._followMarker.setPosition(pt);
  389. me._followMarker.setLabel(me._followLabel);
  390. me._followMarker.show();
  391. };
  392. me._map.addEventListener("mousemove", me._mouseMoveHandler);
  393. //绑定click事件
  394. me._clickHandler = function(evt){
  395. var evtPix = evt.pixel;
  396. var iconPix = new BMap.Pixel(evtPix.x - 10, evtPix.y - 10); //补偿_followMarker的-10像素问题,解决cursor问题
  397. var pt = me._map.pixelToPoint(iconPix);
  398. var mkr = new BMap.Marker(pt, {
  399. icon: me._opts.icon,
  400. enableDragging : true
  401. });
  402. me._map.addOverlay(mkr);
  403. /**
  404. * 添加标注过程中,每次点击地图添加完标注时,派发事件的接口
  405. * @name MarkerTool#onmarkend
  406. * @event
  407. * @param {Event Object} e 回调函数会返回event参数,包括以下返回值:
  408. * <br />"<b>type</b> : {String} 事件类型
  409. * <br />"<b>target</b>:{MarkerTool} 当前MarkerTool对象
  410. * <br />"<b>marker</b>:{Marker} 当前添加的Marker标注
  411. *
  412. * @example <b>参考示例:</b><br />
  413. * mkrTool.addEventListener("markend", function(e) { alert(e.type); });
  414. */
  415. var event = new baidu.lang.Event("onmarkend");
  416. event.marker = mkr;
  417. me.dispatchEvent(event);
  418. if(me._opts.autoClose){ //自动关闭工具
  419. me.close();
  420. }
  421. };
  422. me._map.addEventListener("click", me._clickHandler);
  423. };
  424. MarkerTool.CUR_IMG = "../x_component_Attendance/$AddressExplorer/default/icon/transparent.cur"; //鼠标透明样式,发布时候修改为绝对路径
  425. MarkerTool.ICON_IMG = "../x_component_Attendance/$AddressExplorer/default/icon/us_mk_icon.png"; //图标样式,发布时候修改为绝对路径
  426. MarkerTool.SYS_ICONS = [//MarkerTool 提供的系统样式,便于用户选择使用
  427. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(21, 21), {anchor: new BMap.Size(6, 21), imageOffset: new BMap.Size(0, 0)}),
  428. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(21, 21), {anchor: new BMap.Size(6, 21), imageOffset: new BMap.Size(-23, 0)}),
  429. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(21, 21), {anchor: new BMap.Size(6, 21), imageOffset: new BMap.Size(-46, 0)}),
  430. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(21, 21), {anchor: new BMap.Size(6, 21), imageOffset: new BMap.Size(-69, 0)}),
  431. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(21, 21), {anchor: new BMap.Size(6, 21), imageOffset: new BMap.Size(-92, 0)}),
  432. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(21, 21), {anchor: new BMap.Size(6, 21), imageOffset: new BMap.Size(-115, 0)}),
  433. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(23, 25), {anchor: new BMap.Size(9, 25), imageOffset: new BMap.Size(0, -21)}),
  434. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(23, 25), {anchor: new BMap.Size(9, 25), imageOffset: new BMap.Size(-23, -21)}),
  435. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(23, 25), {anchor: new BMap.Size(9, 25), imageOffset: new BMap.Size(-46, -21)}),
  436. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(23, 25), {anchor: new BMap.Size(9, 25), imageOffset: new BMap.Size(-69, -21)}),
  437. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(23, 25), {anchor: new BMap.Size(9, 25), imageOffset: new BMap.Size(-92, -21)}),
  438. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(23, 25), {anchor: new BMap.Size(9, 25), imageOffset: new BMap.Size(-115, -21)}),
  439. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(21, 21), {anchor: new BMap.Size(1, 21), imageOffset: new BMap.Size(0, -46)}),
  440. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(21, 21), {anchor: new BMap.Size(1, 21), imageOffset: new BMap.Size(-23, -46)}),
  441. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(21, 21), {anchor: new BMap.Size(1, 21), imageOffset: new BMap.Size(-46, -46)}),
  442. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(21, 21), {anchor: new BMap.Size(1, 21), imageOffset: new BMap.Size(-69, -46)}),
  443. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(21, 21), {anchor: new BMap.Size(1, 21), imageOffset: new BMap.Size(-92, -46)}),
  444. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(21, 21), {anchor: new BMap.Size(1, 21), imageOffset: new BMap.Size(-115, -46)}),
  445. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(25, 25), {anchor: new BMap.Size(12, 25), imageOffset: new BMap.Size(0, -67)}),
  446. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(25, 25), {anchor: new BMap.Size(12, 25), imageOffset: new BMap.Size(-25, -67)}),
  447. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(24, 25), {anchor: new BMap.Size(12, 25), imageOffset: new BMap.Size(-50, -67)}),
  448. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(25, 25), {anchor: new BMap.Size(12, 25), imageOffset: new BMap.Size(-75, -67)}),
  449. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(25, 25), {anchor: new BMap.Size(12, 25), imageOffset: new BMap.Size(-100, -67)}),
  450. new BMap.Icon(MarkerTool.ICON_IMG, new BMap.Size(19, 25), {anchor: new BMap.Size(9, 25), imageOffset: new BMap.Size(-125, -67)})
  451. ];
  452. })();//闭包结束