百度地图实现测量面积和测量距离功能

最近在公司的项目中,需要用到百度地图的测距和测面积功能,但是在网上只找到了测量距离的api,即BMapLib.DistanceTool。

但是测面积在网上没有找到很好的资料,百度提供的DrawingManager虽然也可以实现测面积,但是感觉太lol了,然后继续找资料,发现有人跟我遇到同样的问题,他的解决思路是对BMapLib.DistanceTool进行改造,但遗憾的是没有提供源码。

我也想过要改造BMapLib.DistanceTool,但是这个对我来说很有挑战性,毕竟js我差不多是小白,今天闲来无事,决定一试。下载了BMapLib.DistanceTool的源码看,大部分都看不懂,呵呵,不过我要做的工作就是在事件处理中加入自己的逻辑,寻着这个思路,经过几番折腾,终于搞定了,整体效果自己还比较满意。

好了,废话不多说,接下来进入重点,我把百度地图实现测量面积源码公布下(Java成长交流学习群:184998348),代码下载地址:https://download.csdn.net/download/hgq0916/10579481。分享给大家,若有大神路过,别见怪,哈哈。

首先来张效果图:

下面是源码:

1.measureAreaTool_baidu.html

 1 <!DOCTYPE html>    
 2 <html>    
 3 <head>    
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    
 5     <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />    
 6     <style type="text/css">    
 7     body, html{ 100%;height: 100%;margin:0;font-family:"微软雅黑";}    
 8     #allmap { 100%; height:500px; overflow: hidden;}    
 9     #result {100%;font-size:12px;}    
10     </style>
11      <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你的AK"></script>    
12     <script src="js/GeoUtils.js" type="text/javascript"></script>
13     <script type="text/javascript" src="js/AreaTool_min.js"></script>
14     <title>百度地图API功能演示</title>
15 </head>    
16 <body>
17     <div id="allmap" style="overflow:hidden;zoom:1;position:relative;">       
18         <div id="map" style="height:100%;-webkit-transition: all 0.5s ease-in-out;transition: all 0.5s ease-in-out;">    
19        </div>    
20     </div>
21     <div id="result">    
22         <input type="button"  value="面积测量" οnclick="measureArea(this)" /><br/>
23     </div>
24  
25 <script type="text/javascript">    
26     var map = new BMap.Map('map');
27     var poi = new BMap.Point(113.948913,22.530844);    
28     map.centerAndZoom(poi, 16);    
29     map.enableScrollWheelZoom();
30     //添加测量面积工具
31        var measureAreaTool = createMeasureAreaTool(map);
32     //面积测量
33     var measureArea = function(e){
34         measureAreaTool.open();
35     }
36 </script>
37 </body>    
38 </html>    

2.依赖的js

2.1  百度地图的核心js文件,这个用于显示百度地图的,不多说

2.2    AreaTool_min.js  这个就是我改造百度地图测距js后自己创建的测面积工具,完成对面积的测量

   1  // 百度地图API功能
   2 var BMapLib = window.BMapLib = BMapLib || {}; (function() {
   3     var c = c || {
   4         guid: "$BAIDU$"
   5     }; (function() {
   6         window[c.guid] = {};
   7         c.extend = function(g, e) {
   8             for (var f in e) {
   9                 if (e.hasOwnProperty(f)) {
  10                     g[f] = e[f]
  11                 }
  12             }
  13             return g
  14         };
  15         c.lang = c.lang || {};
  16         c.lang.guid = function() {
  17             return "TANGRAM__" + (window[c.guid]._counter++).toString(36)
  18         };
  19         window[c.guid]._counter = window[c.guid]._counter || 1;
  20         window[c.guid]._instances = window[c.guid]._instances || {};
  21         c.lang.Class = function(e) {
  22             this.guid = e || c.lang.guid();
  23             window[c.guid]._instances[this.guid] = this
  24         };
  25         window[c.guid]._instances = window[c.guid]._instances || {};
  26         c.lang.isString = function(e) {
  27             return "[object String]" == Object.prototype.toString.call(e)
  28         };
  29         c.lang.isFunction = function(e) {
  30             return "[object Function]" == Object.prototype.toString.call(e)
  31         };
  32         c.lang.Class.prototype.toString = function() {
  33             return "[object " + (this._className || "Object") + "]"
  34         };
  35         c.lang.Class.prototype.dispose = function() {
  36             delete window[c.guid]._instances[this.guid];
  37             for (var e in this) {
  38                 if (!c.lang.isFunction(this[e])) {
  39                     delete this[e]
  40                 }
  41             }
  42             this.disposed = true
  43         };
  44         c.lang.Event = function(e, f) {
  45             this.type = e;
  46             this.returnValue = true;
  47             this.target = f || null;
  48             this.currentTarget = null
  49         };
  50         c.lang.Class.prototype.addEventListener = function(h, g, f) {
  51             if (!c.lang.isFunction(g)) {
  52                 return
  53             } ! this.__listeners && (this.__listeners = {});
  54             var e = this.__listeners,
  55             i;
  56             if (typeof f == "string" && f) {
  57                 if (/[^w-]/.test(f)) {
  58                     throw ("nonstandard key:" + f)
  59                 } else {
  60                     g.hashCode = f;
  61                     i = f
  62                 }
  63             }
  64             h.indexOf("on") != 0 && (h = "on" + h);
  65             typeof e[h] != "object" && (e[h] = {});
  66             i = i || c.lang.guid();
  67             g.hashCode = i;
  68             e[h][i] = g
  69         };
  70         c.lang.Class.prototype.removeEventListener = function(g, f) {
  71             if (c.lang.isFunction(f)) {
  72                 f = f.hashCode
  73             } else {
  74                 if (!c.lang.isString(f)) {
  75                     return
  76                 }
  77             } ! this.__listeners && (this.__listeners = {});
  78             g.indexOf("on") != 0 && (g = "on" + g);
  79             var e = this.__listeners;
  80             if (!e[g]) {
  81                 return
  82             }
  83             e[g][f] && delete e[g][f]
  84         };
  85         c.lang.Class.prototype.dispatchEvent = function(h, e) {
  86             if (c.lang.isString(h)) {
  87                 h = new c.lang.Event(h)
  88             } ! this.__listeners && (this.__listeners = {});
  89             e = e || {};
  90             for (var g in e) {
  91                 h[g] = e[g]
  92             }
  93             var g, f = this.__listeners,
  94             j = h.type;
  95             h.target = h.target || this;
  96             h.currentTarget = this;
  97             j.indexOf("on") != 0 && (j = "on" + j);
  98             c.lang.isFunction(this[j]) && this[j].apply(this, arguments);
  99             if (typeof f[j] == "object") {
 100                 for (g in f[j]) {
 101                     f[j][g].apply(this, arguments)
 102                 }
 103             }
 104             return h.returnValue
 105         };
 106         c.lang.inherits = function(k, i, h) {
 107             var g, j, e = k.prototype,
 108             f = new Function();
 109             f.prototype = i.prototype;
 110             j = k.prototype = new f();
 111             for (g in e) {
 112                 j[g] = e[g]
 113             }
 114             k.prototype.constructor = k;
 115             k.superClass = i.prototype;
 116             if ("string" == typeof h) {
 117                 j._className = h
 118             }
 119         };
 120         c.dom = c.dom || {};
 121         c._g = c.dom._g = function(e) {
 122             if (c.lang.isString(e)) {
 123                 return document.getElementById(e)
 124             }
 125             return e
 126         };
 127         c.g = c.dom.g = function(e) {
 128             if ("string" == typeof e || e instanceof String) {
 129                 return document.getElementById(e)
 130             } else {
 131                 if (e && e.nodeName && (e.nodeType == 1 || e.nodeType == 9)) {
 132                     return e
 133                 }
 134             }
 135             return null
 136         };
 137         c.insertHTML = c.dom.insertHTML = function(h, e, g) {
 138             h = c.dom.g(h);
 139             var f, i;
 140             if (h.insertAdjacentHTML) {
 141                 h.insertAdjacentHTML(e, g)
 142             } else {
 143                 f = h.ownerDocument.createRange();
 144                 e = e.toUpperCase();
 145                 if (e == "AFTERBEGIN" || e == "BEFOREEND") {
 146                     f.selectNodeContents(h);
 147                     f.collapse(e == "AFTERBEGIN")
 148                 } else {
 149                     i = e == "BEFOREBEGIN";
 150                     f[i ? "setStartBefore": "setEndAfter"](h);
 151                     f.collapse(i)
 152                 }
 153                 f.insertNode(f.createContextualFragment(g))
 154             }
 155             return h
 156         };
 157         c.ac = c.dom.addClass = function(k, m) {
 158             k = c.dom.g(k);
 159             var f = m.split(/s+/),
 160             e = k.className,
 161             j = " " + e + " ",
 162             h = 0,
 163             g = f.length;
 164             for (; h < g; h++) {
 165                 if (j.indexOf(" " + f[h] + " ") < 0) {
 166                     e += (e ? " ": "") + f[h]
 167                 }
 168             }
 169             k.className = e;
 170             return k
 171         };
 172         c.event = c.event || {};
 173         c.event._listeners = c.event._listeners || [];
 174         c.on = c.event.on = function(f, i, k) {
 175             i = i.replace(/^on/i, "");
 176             f = c._g(f);
 177             var j = function(m) {
 178                 k.call(f, m)
 179             },
 180             e = c.event._listeners,
 181             h = c.event._eventFilter,
 182             l,
 183             g = i;
 184             i = i.toLowerCase();
 185             if (h && h[i]) {
 186                 l = h[i](f, i, j);
 187                 g = l.type;
 188                 j = l.listener
 189             }
 190             if (f.addEventListener) {
 191                 f.addEventListener(g, j, false)
 192             } else {
 193                 if (f.attachEvent) {
 194                     f.attachEvent("on" + g, j)
 195                 }
 196             }
 197             e[e.length] = [f, i, k, j, g];
 198             return f
 199         };
 200         c.un = c.event.un = function(g, j, f) {
 201             g = c._g(g);
 202             j = j.replace(/^on/i, "").toLowerCase();
 203             var m = c.event._listeners,
 204             h = m.length,
 205             i = !f,
 206             l, k, e;
 207             while (h--) {
 208                 l = m[h];
 209                 if (l[1] === j && l[0] === g && (i || l[2] === f)) {
 210                     k = l[4];
 211                     e = l[3];
 212                     if (g.removeEventListener) {
 213                         g.removeEventListener(k, e, false)
 214                     } else {
 215                         if (g.detachEvent) {
 216                             g.detachEvent("on" + k, e)
 217                         }
 218                     }
 219                     m.splice(h, 1)
 220                 }
 221             }
 222             return g
 223         };
 224         c.preventDefault = c.event.preventDefault = function(e) {
 225             if (e.preventDefault) {
 226                 e.preventDefault()
 227             } else {
 228                 e.returnValue = false
 229             }
 230         }
 231     })();
 232     //TODO
 233     var d = BMapLib.MeasureAreaTool = function(f, e) {
 234         if (!f) {
 235             return
 236         }
 237         this._map = f;
 238         e = e || {};
 239         this._opts = c.extend(c.extend(this._opts || {},
 240         {
 241             tips: "u6d4bu8ddd",
 242             followText: "u5355u51fbu786eu5b9au5730u70b9uff0cu53ccu51fbu7ed3u675f",
 243             unit: "metric",
 244             lineColor: "#ff6319",
 245             lineStroke: 2,
 246             opacity: 0.8,
 247             lineStyle: "solid",
 248             cursor: "http://api.map.baidu.com/images/ruler.cur",
 249             secIcon: null,
 250             closeIcon: null
 251         }), e);
 252         this._followTitle = null;
 253         this._points = [];
 254         this._paths = [];
 255         this._dots = [];
 256         this._segDistance = [];
 257         this._overlays = [];
 258         this._enableMassClear = true,
 259         this._units = {
 260             metric: {
 261                 name: "metric",
 262                 conv: 1,
 263                 incon: 1000,
 264                 u1: "u7c73",
 265                 u2: "u516cu91cc"
 266             },
 267             us: {
 268                 name: "us",
 269                 conv: 3.2808,
 270                 incon: 5279.856,
 271                 u1: "u82f1u5c3a",
 272                 u2: "u82f1u91cc"
 273             }
 274         };
 275         this._isOpen = false;
 276         this._startFollowText = "u5355u51fbu786eu5b9au8d77u70b9";
 277         this._movingTimerId = null;
 278         this._styles = {
 279             BMapLib_diso: "height:17px;5px;position:absolute;background:url(http://api.map.baidu.com/images/dis_box_01.gif) no-repeat left top",
 280             BMapLib_disi: "color:#7a7a7a;position:absolute;left:5px;padding:0 4px 1px 0;line-height:17px;background:url(http://api.map.baidu.com/images/dis_box_01.gif) no-repeat right top",
 281             BMapLib_disBoxDis: "color:#ff6319;font-weight:bold"
 282         };
 283         if (this._opts.lineStroke <= 0) {
 284             this._opts.lineStroke = 2
 285         }
 286         if (this._opts.opacity > 1) {
 287             this._opts.opacity = 1
 288         } else {
 289             if (this._opts.opacity < 0) {
 290                 this._opts.opacity = 0
 291             }
 292         }
 293         if (this._opts.lineStyle != "solid" && this._opts.lineStyle != "dashed") {
 294             this._opts.lineStyle = "solid"
 295         }
 296         if (!this._units[this._opts.unit]) {
 297             this._opts.unit = "metric"
 298         }
 299         this.text = "u6d4bu8ddd"
 300     };
 301     c.lang.inherits(d, c.lang.Class, "DistanceTool");
 302     d.prototype._bind = function() {
 303         this._setCursor(this._opts.cursor);
 304         var f = this;
 305         c.on(this._map.getContainer(), "mousemove",
 306         function(i) {
 307             if (!f._isOpen) {
 308                 return
 309             }
 310             if (!f._followTitle) {
 311                 return
 312             }
 313             i = window.event || i;
 314             var g = i.target || i.srcElement;
 315             if (g != a.getDom(f._map)) {
 316                 f._followTitle.hide();
 317                 return
 318             }
 319             if (!f._mapMoving) {
 320                 f._followTitle.show()
 321             }
 322             var h = a.getDrawPoint(i, true);
 323             f._followTitle.setPosition(h)
 324         });
 325         if (this._startFollowText) {
 326             var e = this._followTitle = new BMap.Label(this._startFollowText, {
 327                 offset: new BMap.Size(14, 16)
 328             });
 329             this._followTitle.setStyles({
 330                 color: "#333",
 331                 borderColor: "#ff0103"
 332             })
 333         }
 334     };
 335     d.prototype.open = function() {
 336         if (this._isOpen == true) {
 337             return true
 338         }
 339         if ( !! BMapLib._toolInUse) {
 340             return
 341         }
 342         this._isOpen = true;
 343         BMapLib._toolInUse = true;
 344         if (this._mapMoving) {
 345             delete this._mapMoving
 346         }
 347         var h = this;
 348         if (!this._binded) {
 349             this._binded = true;
 350             this._bind();
 351             this._map.addEventListener("moving",
 352             function() {
 353                 h._hideCurrent()
 354             })
 355         }
 356         if (this._followTitle) {
 357             this._map.addOverlay(this._followTitle);
 358             this._followTitle.hide()
 359         }
 360         var g = function(q) {
 361             //TODO
 362             var l = h._map;//获取map对象
 363             if (!h._isOpen) {//判断测距工具是否打开,关闭则返回
 364                 return
 365             }
 366             q = window.event || q;
 367             var n = a.getDrawPoint(q, true);//获取鼠标点击的点
 368             if (!h._isPointValid(n)) {//判断点是否有效
 369                 return
 370             }
 371             h._bind.initX = q.pageX || q.clientX || 0;//绑定当前的坐标
 372             h._bind.initY = q.pageY || q.clientY || 0;
 373             if (h._points.length > 0) {
 374                 var t = l.pointToPixel(h._points[h._points.length - 1]);//获取点数组最后一个元素,转换为Pixel点
 375                 var m = l.pointToPixel(n);//将当前的点转换为Pixel点
 376                 var p = Math.sqrt(Math.pow(t.x - m.x, 2) + Math.pow(t.y - m.y, 2));//求两个点的距离
 377                 if (p < 5) {//距离小于5则返回
 378                     return
 379                 }
 380             }
 381             h._bind.x = q.layerX || q.offsetX || 0;//保存当前坐标
 382             h._bind.y = q.layerY || q.offsetY || 0;
 383             h._points.push(n);//将当前坐标存入数组
 384             h._addSecPoint(n);//TODO
 385             if (h._paths.length == 0) {
 386                 h._formatTitle(1, h._opts.followText, h._getTotalDistance())
 387             }
 388             if (h._paths.length > 0) {
 389                 h._paths[h._paths.length - 1].show();
 390                 h._paths[h._paths.length - 1].setStrokeOpacity(h._opts.opacity)
 391             }
 392             var w = new BMap.Polyline([n, n], {
 393                 enableMassClear: h._enableMassClear
 394             });
 395             h._map.addOverlay(w);
 396             h._paths.push(w);
 397             h._overlays.push(w);
 398             w.setStrokeWeight(h._opts.lineStroke);
 399             w.setStrokeColor(h._opts.lineColor);
 400             w.setStrokeOpacity(h._opts.opacity / 2);
 401             w.setStrokeStyle(h._opts.lineStyle);
 402             if (h._mapMoving) {
 403                 w.hide()
 404             }
 405             if (h._points.length > 1) {
 406                 var o = h._paths[h._points.length - 2];
 407                 o.setPositionAt(1, n)
 408             }
 409             var r = "";
 410             var v;
 411             if (h._points.length > 1) {
 412                 var u = h._setSegDistance(h._points[h._points.length - 2], h._points[h._points.length - 1]);
 413                 var s = h._getTotalDistance();
 414                 r = h._formatDisStr(s);
 415                 v = new BMap.Label(r, {
 416                     offset: new BMap.Size(10, -5),
 417                     enableMassClear: h._enableMassClear
 418                 });
 419             } else {
 420                 r = "u8d77u70b9";
 421                 v = new BMap.Label(r, {
 422                     offset: new BMap.Size(-10, -25),
 423                     enableMassClear: h._enableMassClear
 424                 });
 425             }
 426             // var v = new BMap.Label(r, {
 427             //     offset: new BMap.Size(10, -5),
 428             //     enableMassClear: h._enableMassClear
 429             // });
 430             v.setStyles({
 431                 color: "#333",
 432                 borderColor: "#ff0103"
 433             });
 434             h._map.addOverlay(v);
 435             h._formatSegLabel(v, r);
 436             h._overlays.push(v);
 437             n.disLabel = v;
 438             v.setPosition(n);
 439             var k = new c.lang.Event("onaddpoint");
 440             k.point = n;
 441             k.pixel = h._map.pointToPixel(n);
 442             k.index = h._points.length - 1;
 443             k.distance = h._getTotalDistance().toFixed(0);
 444             h.dispatchEvent(k)
 445         };
 446         var f = function(p) {
 447             if (!h._isOpen) {
 448                 return
 449             }
 450             if (h._paths.length > 0) {
 451                 p = window.event || p;
 452                 var l = p.pageX || p.clientX || 0;
 453                 var k = p.pageY || p.clientY || 0;
 454                 if (typeof h._bind.initX == "undefined") {
 455                     h._bind.x = p.layerX || p.offsetX || 0;
 456                     h._bind.y = p.layerY || p.offsetY || 0;
 457                     h._bind.initX = l;
 458                     h._bind.initY = k
 459                 }
 460                 var r = h._bind.x + l - h._bind.initX;
 461                 var q = h._bind.y + k - h._bind.initY;
 462                 var z = h._paths[h._paths.length - 1];
 463                 var m = h._map.pixelToPoint(new BMap.Pixel(r, q));
 464                 z.setPositionAt(1, m);
 465                 if (!h._mapMoving) {
 466                     z.show()
 467                 }
 468                 var A = 0;
 469                 var u = 0;
 470                 if (r < 10) {
 471                     A = 8
 472                 } else {
 473                     if (r > h._map.getSize().width - 10) {
 474                         A = -8
 475                     }
 476                 }
 477                 if (q < 10) {
 478                     u = 8
 479                 } else {
 480                     if (q > h._map.getSize().height - 10) {
 481                         u = -8
 482                     }
 483                 }
 484                 if (A != 0 || u != 0) {
 485                     if (!f._movingTimerId) {
 486                         h._mapMoving = true;
 487                         h._map.panBy(A, u, {
 488                             noAnimation: true
 489                         });
 490                         h._movingTimerId = f._movingTimerId = setInterval(function() {
 491                             h._map.panBy(A, u, {
 492                                 noAnimation: true
 493                             })
 494                         },
 495                         30);
 496                         z.hide();
 497                         h._followTitle && h._followTitle.hide()
 498                     }
 499                 } else {
 500                     if (f._movingTimerId) {
 501                         clearInterval(f._movingTimerId);
 502                         delete f._movingTimerId;
 503                         delete h._movingTimerId;
 504                         var w = h._paths[h._paths.length - 1];
 505                         var v = h._map.pixelToPoint(new BMap.Pixel(r, q));
 506                         if (!w) {
 507                             return
 508                         }
 509                         w.setPositionAt(1, v);
 510                         w.show();
 511                         if (h._followTitle) {
 512                             h._followTitle.setPosition(v);
 513                             h._followTitle.show()
 514                         }
 515                         h._bind.i = 0;
 516                         h._bind.j = 0;
 517                         delete h._mapMoving
 518                     }
 519                 }
 520                 if (h._followTitle) {
 521                     var o = h._getTotalDistance();
 522                     var n = h._map.getDistance(h._points[h._points.length - 1], m);
 523                     h._updateInstDis(h._followTitle, o + n)
 524                 }
 525             } else {
 526                 if (h._followTitle) {
 527                     h._followTitle.show();
 528                     p = window.event || p;
 529                     var s = p.target || p.srcElement;
 530                     if (s != a.getDom()) {
 531                         h._followTitle.hide()
 532                     }
 533                 }
 534             }
 535         };
 536         var e = function(k) {
 537             if (!h._isOpen) {
 538                 return
 539             }
 540             c.un(a.getDom(h._map), "click", g);
 541             c.un(document, "mousemove", f);
 542             c.un(a.getDom(h._map), "dblclick", e);
 543             c.un(document, "keydown", j);
 544             c.un(a.getDom(h._map), "mouseup", i);
 545             setTimeout(function() {
 546                 //1
 547                 h.close()
 548             },
 549             50)
 550         };
 551         var j = function(k) {
 552             k = window.event || k;
 553             if (k.keyCode == 27) {
 554                 h._clearCurData();
 555                 setTimeout(function() {
 556                     //2
 557                     h.close()
 558                 },
 559                 50)
 560             }
 561         };
 562         var i = function(k) {
 563             k = window.event || k;
 564             var l = 0;
 565             if (/msie (d+.d)/i.test(navigator.userAgent)) {
 566                 l = document.documentMode || +RegExp["x241"]
 567             }
 568             if (l && k.button != 1 || k.button == 2) {
 569                 //3
 570                 h.close()
 571             }
 572         };
 573         h._initData();
 574         this._formatTitle();
 575         a.show(this._map);
 576         this._setCursor(this._opts.cursor);
 577         c.on(a.getDom(this._map), "click", g);
 578         c.on(document, "mousemove", f);
 579         c.on(a.getDom(this._map), "dblclick", e);
 580         c.on(document, "keydown", j);
 581         c.on(a.getDom(this._map), "mouseup", i);
 582         this.bindFunc = [{
 583             elem: a.getDom(this._map),
 584             type: "click",
 585             func: g
 586         },
 587         {
 588             elem: a.getDom(this._map),
 589             type: "dblclick",
 590             func: e
 591         },
 592         {
 593             elem: document,
 594             type: "mousemove",
 595             func: f
 596         },
 597         {
 598             elem: document,
 599             type: "keydown",
 600             func: j
 601         },
 602         {
 603             elem: a.getDom(this._map),
 604             type: "mouseup",
 605             func: i
 606         }];
 607         return true
 608     };
 609     d.prototype._dispatchLastEvent = function() {
 610         var e = new c.lang.Event("ondrawend");
 611         e.points = this._points ? this._points.slice(0) : [];
 612         e.overlays = this._paths ? this._paths.slice(0, this._paths.length - 1) : [];
 613         e.distance = this._getTotalDistance().toFixed(0);
 614         this.dispatchEvent(e)
 615     };
 616     d.prototype.close = function() {
 617         if (this._isOpen == false) {
 618             return
 619         }
 620         this._isOpen = false;
 621         BMapLib._toolInUse = false;
 622         if (this._mapMoving) {
 623             delete this._mapMoving
 624         }
 625         var g = this;
 626         g._dispatchLastEvent();
 627         if (g._points.length < 2) {
 628             g._clearCurData()
 629         } else {
 630             g._paths[g._paths.length - 1].remove();
 631             g._paths[g._paths.length - 1] = null;
 632             g._paths.length = g._paths.length - 1;
 633             var h = g._points[g._points.length - 1];
 634             if (h.disLabel) {
 635                 h.disLabel.remove()
 636             }
 637             g._processLastOp()
 638         }
 639         a.hide();
 640         for (var f = 0,
 641         e = this.bindFunc.length; f < e; f++) {
 642             c.un(this.bindFunc[f].elem, this.bindFunc[f].type, this.bindFunc[f].func)
 643         }
 644         if (g._movingTimerId) {
 645             clearInterval(g._movingTimerId);
 646             g._movingTimerId = null
 647         }
 648         if (this._followTitle) {
 649             this._followTitle.hide()
 650         }
 651     };
 652     d.prototype._clearCurData = function() {
 653         for (var f = 0,
 654         e = this._points.length; f < e; f++) {
 655             if (this._points[f].disLabel) {
 656                 this._points[f].disLabel.remove()
 657             }
 658         }
 659         for (var f = 0,
 660         e = this._paths.length; f < e; f++) {
 661             this._paths[f].remove()
 662         }
 663         for (var f = 0,
 664         e = this._dots.length; f < e; f++) {
 665             this._dots[f].remove()
 666         }
 667         this._initData()
 668     };
 669     d.prototype._initData = function() {
 670         this._points.length = 0;
 671         this._paths.length = 0;
 672         this._segDistance.length = 0;
 673         this._dots.length = 0
 674     };
 675     d.prototype._setSegDistance = function(g, f) {
 676         if (!g || !f) {
 677             return
 678         }
 679         var e = this._map.getDistance(g, f);
 680         this._segDistance.push(e);
 681         return e
 682     };
 683     d.prototype._getTotalDistance = function() {
 684         var g = 0;
 685         for (var f = 0,
 686         e = this._segDistance.length; f < e; f++) {
 687             g += this._segDistance[f]
 688         }
 689         return g
 690     };
 691     d.prototype._convertUnit = function(e, f) {
 692         f = f || "metric";
 693         if (this._units[f]) {
 694             return e * this._units[f].conv
 695         }
 696         return e
 697     };
 698     d.prototype._addSecPoint = function(g) {
 699         var f = this._opts.secIcon ? this._opts.secIcon: new BMap.Icon("http://api.map.baidu.com/images/mapctrls.png", new BMap.Size(11, 11), {
 700             imageOffset: new BMap.Size( - 26, -313)
 701         });
 702         var e = new BMap.Marker(g, {
 703             icon: f,
 704             clickable: false,
 705             baseZIndex: 3500000,
 706             zIndexFixed: true,
 707             enableMassClear: this._enableMassClear
 708         });
 709         this._map.addOverlay(e);
 710         this._dots.push(e)
 711     };
 712     d.prototype._formatDisStr = function(h) {
 713         var f = this._opts.unit;
 714         var g = this._units[f].u1;
 715         var e = this._convertUnit(h, f);
 716         if (e > this._units[f].incon) {
 717             e = e / this._units[f].incon;
 718             g = this._units[f].u2;
 719             e = e.toFixed(1)
 720         } else {
 721             e = e.toFixed(0)
 722         }
 723         return e + g
 724     };
 725     d.prototype._setCursor = function(f) {
 726         var e = /webkit/.test(navigator.userAgent.toLowerCase()) ? "url(" + this._opts.cursor + ") 3 6, crosshair": "url(" + this._opts.cursor + "), crosshair";
 727         a._setCursor(e)
 728     };
 729     d.prototype._getCursor = function() {
 730         return this._opts.cursor
 731     };
 732     d.prototype._formatSegLabel = function(e, f) {
 733         e.setStyle({
 734             border: "none",
 735             padding: "0"
 736         });
 737         e.setContent("<span style='" + this._styles.BMapLib_diso + "'><span style='" + this._styles.BMapLib_disi + "'>" + f + "</span></span>")
 738     };
 739     d.prototype._processLastOp = function() {
 740         var i = this;
 741         delete i._bind.x;
 742         delete i._bind.y;
 743         delete i._bind.initX;
 744         delete i._bind.initY;
 745         if (i._paths.length > i._points.length - 1) {
 746             var g = i._paths.length - 1;
 747             i._paths[g].remove();
 748             i._paths[g] = null;
 749             i._paths.length = g
 750         }
 751         var e = {};
 752         e.points = i._points.slice(0);
 753         e.paths = i._paths.slice(0);
 754         e.dots = i._dots.slice(0);
 755         e.segDis = i._segDistance.slice(0);
 756         var j = i._map.pointToPixel(e.points[e.points.length - 1]);
 757         var h = i._map.pointToPixel(e.points[e.points.length - 2]);
 758         var k = [0, 0];
 759         var f = [0, 0];
 760         if (j.y - h.y >= 0) {
 761             f = [ - 5, 11]
 762         } else {
 763             f = [ - 5, -35]
 764         }
 765         if (j.x - h.x >= 0) {
 766             k = [14, 0]
 767         } else {
 768             k = [ - 14, 0]
 769         }
 770         var n = e.points[e.points.length - 1];
 771         n.disLabel = new BMap.Label("", {
 772             offset: new BMap.Size( - 15, -40),
 773             enableMassClear: i._enableMassClear
 774         });
 775         n.disLabel.setStyles({
 776             color: "#333",
 777             borderColor: "#ff0103"
 778         });
 779         i._map.addOverlay(n.disLabel);
 780         n.disLabel.setOffset(new BMap.Size(f[0], f[1]));
 781         n.disLabel.setPosition(n);
 782         i._formatTitle(2, "", "", n.disLabel);
 783         var m = this._opts.closeIcon ? this._opts.closeIcon: new BMap.Icon("http://api.map.baidu.com/images/mapctrls.gif", new BMap.Size(12, 12), {
 784             imageOffset: new BMap.Size(0, -14)
 785         });
 786         e.closeBtn = new BMap.Marker(e.points[e.points.length - 1], {
 787             icon: m,
 788             offset: new BMap.Size(k[0], k[1]),
 789             baseZIndex: 3600000,
 790             enableMassClear: i._enableMassClear
 791         });
 792         //将多边形绑定到关闭按钮上
 793         var hh = this;
 794         e.closeBtn._polygon = hh.polygon;
 795         hh.polygon = undefined;
 796         hh._areaPoints = undefined;
 797         i._map.addOverlay(e.closeBtn);
 798         //绑定添加焦点事件
 799         e.closeBtn.setTitle("u6e05u9664u672cu6b21u6d4bu8ddd");
 800         e.closeBtn.addEventListener("click",
 801         function(r) {
 802             //TODO
 803             var polygon = r.target._polygon;
 804             if(polygon.label!=undefined){
 805                 hh._map.removeOverlay(polygon.label);
 806             }
 807             hh._map.removeOverlay(polygon);
 808             r.target._polygon =undefined;
 809  
 810             for (var p = 0,
 811             o = e.points.length; p < o; p++) {
 812                 e.points[p].disLabel.remove();
 813                 e.points[p].disLabel = null
 814             }
 815             for (var p = 0,
 816             o = e.paths.length; p < o; p++) {
 817                 e.paths[p].remove();
 818                 e.paths[p] = null
 819             }
 820             for (var p = 0,
 821             o = e.dots.length; p < o; p++) {
 822                 e.dots[p].remove();
 823                 e.dots[p] = null
 824             }
 825             e.closeBtn.remove();
 826             e.closeBtn = null;
 827             b(r);
 828             var q = new c.lang.Event("onremovepolyline");
 829             i.dispatchEvent(q)
 830             //todo
 831         });
 832         i._initData()
 833     };
 834     d.prototype._formatTitle = function(g, l, e, i) {
 835         var h = i || this._followTitle;
 836         if (!h) {
 837             return
 838         }
 839         h.setStyle({
 840             lineHeight: "16px",
 841             zIndex: "85",
 842             padding: "3px 5px"
 843         });
 844         var n = this._startFollowText || "";
 845         var k = [];
 846         if (g == 1) {
 847             h.setOffset(0, 25);
 848             var m = this._opts.unit;
 849             var j = this._units[m].u1;
 850             var f = this._convertUnit(e, m);
 851             if (f > this._units[m].incon) {
 852                 f = f / this._units[m].incon;
 853                 j = this._units[m].u2;
 854                 f = f.toFixed(1)
 855             } else {
 856                 f = f.toFixed(0)
 857             }
 858             k.push("<span>u603bu957fuff1a<span style='" + this._styles.BMapLib_disBoxDis + "'>" + f + "</span>" + j + "</span><br />");
 859             k.push("<span style='color:#7a7a7a'>" + l + "</span>")
 860         } else {
 861             if (g == 2) {
 862                 var m = this._opts.unit;
 863                 var j = this._units[m].u1;
 864                 var f = this._convertUnit(this._getTotalDistance(), m);
 865                 if (f > this._units[m].incon) {
 866                     f = f / this._units[m].incon;
 867                     j = this._units[m].u2;
 868                     f = f.toFixed(1)
 869                 } else {
 870                     f = f.toFixed(0)
 871                 }
 872                 k.push("u603bu957fuff1a<span style='" + this._styles.BMapLib_disBoxDis + "'>" + f + "</span>" + j)
 873             } else {
 874                 h.setOffset(0, 25);
 875                 k.push(n)
 876             }
 877         }
 878         h.setContent(k.join(""))
 879     };
 880     d.prototype._updateInstDis = function(g, e) {
 881         var f = this._opts.unit;
 882         var i = this._units[f].u1;
 883         if (e > this._units[f].incon) {
 884             e = e / this._units[f].incon;
 885             i = this._units[f].u2;
 886             e = e.toFixed(1)
 887         } else {
 888             e = e.toFixed(0)
 889         }
 890         if (g) {
 891             var h = [];
 892             h.push("<span>u603bu957fuff1a<span style='" + this._styles.BMapLib_disBoxDis + "'>" + e + "</span>" + i + "</span><br />");
 893             h.push("<span style='color:#7a7a7a'>" + this._opts.followText + "</span>");
 894             g.setContent(h.join(""))
 895         }
 896     };
 897     d.prototype._hideCurrent = function() {
 898         if (!this._isOpen) {
 899             return
 900         }
 901         if (this._paths.length > 0) {
 902             var e = this._paths[this._paths.length - 1];
 903             e.hide()
 904         }
 905         this._followTitle && this._followTitle.hide()
 906     };
 907     d.prototype._isPointValid = function(h) {
 908         if (!h) {
 909             return false
 910         }
 911         var f = this._map.getBounds();
 912         var e = f.getSouthWest(),
 913         g = f.getNorthEast();
 914         if (h.lng < e.lng || h.lng > g.lng || h.lat < e.lat || h.lat > g.lat) {
 915             return false
 916         }
 917         return true
 918     };
 919     var a = {
 920         _map: null,
 921         _html: "<div style='background:transparent url(http://api.map.baidu.com/images/blank.gif);position:absolute;left:0;top:0;100%;height:100%;z-index:1000' unselectable='on'></div>",
 922         _maskElement: null,
 923         _cursor: "default",
 924         _inUse: false,
 925         show: function(e) {
 926             if (!this._map) {
 927                 this._map = e
 928             }
 929             this._inUse = true;
 930             if (!this._maskElement) {
 931                 this._createMask(e)
 932             }
 933             this._maskElement.style.display = "block"
 934         },
 935         _createMask: function(g) {
 936             this._map = g;
 937             if (!this._map) {
 938                 return
 939             }
 940             c.insertHTML(this._map.getContainer(), "beforeEnd", this._html);
 941             var f = this._maskElement = this._map.getContainer().lastChild;
 942             var e = function(h) {
 943                 b(h);
 944                 return c.preventDefault(h)
 945             };
 946             c.on(f, "mouseup",
 947             function(h) {
 948                 if (h.button == 2) {
 949                     e(h)
 950                 }
 951             });
 952             c.on(f, "contextmenu", e);
 953             f.style.display = "none"
 954         },
 955         getDrawPoint: function(h, j) {
 956             h = window.event || h;
 957             var f = h.layerX || h.offsetX || 0;
 958             var i = h.layerY || h.offsetY || 0;
 959             var g = h.target || h.srcElement;
 960             if (g != a.getDom(this._map) && j == true) {
 961                 while (g && g != this._map.getContainer()) {
 962                     if (! (g.clientWidth == 0 && g.clientHeight == 0 && g.offsetParent && g.offsetParent.nodeName.toLowerCase() == "td")) {
 963                         f += g.offsetLeft;
 964                         i += g.offsetTop
 965                     }
 966                     g = g.offsetParent
 967                 }
 968             }
 969             if (g != a.getDom(this._map) && g != this._map.getContainer()) {
 970                 return
 971             }
 972             if (typeof f === "undefined" || typeof i === "undefined") {
 973                 return
 974             }
 975             if (isNaN(f) || isNaN(i)) {
 976                 return
 977             }
 978             return this._map.pixelToPoint(new BMap.Pixel(f, i))
 979         },
 980         hide: function() {
 981             if (!this._map) {
 982                 return
 983             }
 984             this._inUse = false;
 985             if (this._maskElement) {
 986                 this._maskElement.style.display = "none"
 987             }
 988         },
 989         getDom: function(e) {
 990             if (!this._maskElement) {
 991                 this._createMask(e)
 992             }
 993             return this._maskElement
 994         },
 995         _setCursor: function(e) {
 996             this._cursor = e || "default";
 997             if (this._maskElement) {
 998                 this._maskElement.style.cursor = this._cursor
 999             }
1000         }
1001     };
1002     function b(f) {
1003         var f = window.event || f;
1004         f.stopPropagation ? f.stopPropagation() : f.cancelBubble = true
1005     }
1006 })();
1007  
1008 var _polygonStyleOptions = {    
1009         strokeColor:"blue",    //边线颜色。    
1010         fillColor:"#FFCCFF",      //填充颜色。当参数为空时,圆形将没有填充效果。    
1011         strokeWeight: 0.00001,       //边线的宽度,以像素为单位。    
1012         strokeOpacity: 0,    //边线透明度,取值范围0 - 1。    
1013         fillOpacity: 0.3,      //填充的透明度,取值范围0 - 1。    
1014         strokeStyle: 'solid' //边线的样式,solid或dashed。    
1015 }   
1016 var _LabelOptions = {    
1017     color : "black",    
1018     fontSize : "16px",    
1019     fillColor:"red"      //填充颜色。当参数为空时,圆形将没有填充效果。    
1020 }   
1021  
1022 //自定义测量面积工具
1023 var createMeasureAreaTool =function(map){
1024     var myDis = new BMapLib.MeasureAreaTool(map);   //测距插件
1025  
1026     myDis.addEventListener("addpoint", function(e) {
1027         var _map = e.target._map;
1028         if(e.target._areaPoints == undefined){
1029             e.target._areaPoints = new Array();
1030         }
1031         e.target._areaPoints.push(e.point);
1032         if(e.target.polygon == undefined){
1033             var polygon = new BMap.Polygon(e.target._areaPoints,_polygonStyleOptions);
1034             myDis.polygon = polygon;
1035             _map.addOverlay(polygon);
1036         }else{
1037             var polygon = e.target.polygon;
1038             polygon.setPath(e.target._areaPoints);
1039             //计算多边形的面积
1040             var _area = 0;
1041             _area = BMapLib.GeoUtils.getPolygonArea(polygon);
1042             //保留两位小数
1043             _area = _area.toFixed(2);
1044             //获取多边形的中心
1045             var _paths = polygon.getPath();
1046             var point = getCenterPoint(_paths);
1047             //移除polygon之前的label
1048             if(polygon.label!=undefined){
1049                 var l = polygon.label;
1050                 _map.removeOverlay(l);
1051                 polygon.label = undefined;
1052             }
1053             //往多边形添加标注
1054             var label = new BMap.Label("区域面积:"+_area+"m3",_LabelOptions);
1055             polygon.label =label;
1056             label.setPosition(point);
1057             //往地图上添加标注
1058             _map.addOverlay(label);
1059         }
1060     }); 
1061     return myDis;
1062 }

2.3  GeoUtils.js  这个是计算面积的api,这个也是必须的。下载链接:http://api.map.baidu.com/library/GeoUtils/1.2/docs/symbols/BMapLib.GeoUtils.html

好了,现在可以测试效果了,浏览器打开measureAreaTool_baidu.html这个页面,点击面积测量就可以看到效果。

代码下载地址:https://download.csdn.net/download/hgq0916/10579481

————————————————
版权声明:本文为CSDN博主「奔腾的野马」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hgq0916/article/details/78991927

原文地址:https://www.cnblogs.com/hexuerui/p/12835165.html