zoukankan      html  css  js  c++  java
  • 百度地图实现测量面积和测量距离功能

    最近在公司的项目中,需要用到百度地图的测距和测面积功能,但是在网上只找到了测量距离的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

  • 相关阅读:
    书写高效的CSS
    _blank开新窗口不符合标准?
    IE6支持PNG透明(alpha通道)的4种方法
    jQuery插件支持天干地支阴历阳历万年历节假日红字显示记事等功能的日历插件(1)
    讓你的windowsXP支持四桌面,類似Ubuntu的效果
    MySql语句常见操作创建数据库,选择数据库,创建表,数据库中文乱码;
    解决<pre>标签里的文本换行(兼容IE, FF和Opera等)
    使用jquyer擴展方法定義屬於自己的氣泡提示
    jQuery插件通用input或textarea靜態ajax修改功能插件
    SEO的经验
  • 原文地址:https://www.cnblogs.com/hexuerui/p/12835165.html
Copyright © 2011-2022 走看看