侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

js实现百度地图同时显示多个路书效果

前端  /  管理员 发布于 7年前   274

本文介绍了js实现百度地图同时显示多个路书效果,主要是以自行车的还车地点作为实例,具体代码如下:

启动路书:

<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=自己的ak"></script><script type="text/javascript" src="https:/article/js/lushu.js"></script><!--路书 -->

var BMapLib = window.BMapLib = BMapLib || {};(function() {  var b, a = b = a || {    version : "1.5.0"  };  a.guid = "$BAIDU$";  (function() {    window[a.guid] = window[a.guid] || {};    a.dom = a.dom || {};    a.dom.g = function(e) {      if ("string" == typeof e || e instanceof String) {        return document.getElementById(e)      } else {        if (e && e.nodeName && (e.nodeType == 1 || e.nodeType == 9)) {          return e        }      }      return null    };    a.g = a.G = a.dom.g;    a.lang = a.lang || {};    a.lang.isString = function(e) {      return "[object String]" == Object.prototype.toString.call(e)    };    a.isString = a.lang.isString;    a.dom._g = function(e) {      if (a.lang.isString(e)) {        return document.getElementById(e)      }      return e    };    a._g = a.dom._g;    a.dom.getDocument = function(e) {      e = a.dom.g(e);      return e.nodeType == 9 ? e : e.ownerDocument || e.document    };    a.browser = a.browser || {};    a.browser.ie = a.ie = /msie (\d+\.\d+)/i.test(navigator.userAgent) ? (document.documentMode || +RegExp["\x241"])        : undefined;    a.dom.getComputedStyle = function(f, e) {      f = a.dom._g(f);      var h = a.dom.getDocument(f), g;      if (h.defaultView && h.defaultView.getComputedStyle) {        g = h.defaultView.getComputedStyle(f, null);        if (g) {          return g[e] || g.getPropertyValue(e)        }      }      return ""    };    a.dom._styleFixer = a.dom._styleFixer || {};    a.dom._styleFilter = a.dom._styleFilter || [];    a.dom._styleFilter.filter = function(f, j, k) {      for (var e = 0, h = a.dom._styleFilter, g; g = h[e]; e++) {        if (g = g[k]) {          j = g(f, j)        }      }      return j    };    a.string = a.string || {};    a.string.toCamelCase = function(e) {      if (e.indexOf("-") < 0 && e.indexOf("_") < 0) {        return e      }      return e.replace(/[-_][^-_]/g, function(f) {        return f.charAt(1).toUpperCase()      })    };    a.dom.getStyle = function(g, f) {      var i = a.dom;      g = i.g(g);      f = a.string.toCamelCase(f);      var h = g.style[f] || (g.currentStyle ? g.currentStyle[f] : "")          || i.getComputedStyle(g, f);      if (!h) {        var e = i._styleFixer[f];        if (e) {          h = e.get ? e.get(g) : a.dom.getStyle(g, e)        }      }      if (e = i._styleFilter) {        h = e.filter(f, h, "get")      }      return h    };    a.getStyle = a.dom.getStyle;    a.dom._NAME_ATTRS = (function() {      var e = {        cellpadding : "cellPadding",        cellspacing : "cellSpacing",        colspan : "colSpan",        rowspan : "rowSpan",        valign : "vAlign",        usemap : "useMap",        frameborder : "frameBorder"      };      if (a.browser.ie < 8) {        e["for"] = "htmlFor";        e["class"] = "className"      } else {        e.htmlFor = "for";        e.className = "class"      }      return e    })();    a.dom.setAttr = function(f, e, g) {      f = a.dom.g(f);      if ("style" == e) {        f.style.cssText = g      } else {        e = a.dom._NAME_ATTRS[e] || e;        f.setAttribute(e, g)      }      return f    };    a.setAttr = a.dom.setAttr;    a.dom.setAttrs = function(g, e) {      g = a.dom.g(g);      for ( var f in e) {        a.dom.setAttr(g, f, e[f])      }      return g    };    a.setAttrs = a.dom.setAttrs;    a.dom.create = function(g, e) {      var h = document.createElement(g), f = e || {};      return a.dom.setAttrs(h, f)    };    a.object = a.object || {};    a.extend = a.object.extend = function(g, e) {      for ( var f in e) {        if (e.hasOwnProperty(f)) {          g[f] = e[f]        }      }      return g    }  })();  var c = BMapLib.LuShu = function(g, f, e) {    if (!f || f.length < 1) {      return    }    this._map = g;    this._path = f;    this.i = 0;    this._setTimeoutQuene = [];    this._projection = this._map.getMapType().getProjection();    this._opts = {      icon : null,      speed : 4000,      defaultContent : ""    };    this._setOptions(e);    this._rotation = 0;    if (!this._opts.icon instanceof BMap.Icon) {      this._opts.icon = defaultIcon    }  };  c.prototype._setOptions = function(e) {    if (!e) {      return    }    for ( var f in e) {      if (e.hasOwnProperty(f)) {        this._opts[f] = e[f]      }    }  };  c.prototype.start = function() {    var f = this, e = f._path.length;    if (f.i && f.i < e - 1) {      if (!f._fromPause) {        return      } else {        if (!f._fromStop) {          f._moveNext(++f.i)        }      }    } else {      f._addMarker();      f._timeoutFlag = setTimeout(function() {        f._addInfoWin();        if (f._opts.defaultContent == "") {          f.hideInfoWindow()        }        f._moveNext(f.i)      }, 400)    }    this._fromPause = false;    this._fromStop = false  }, c.prototype.stop = function() {    this.i = 0;    this._fromStop = true;    clearInterval(this._intervalFlag);    this._clearTimeout();    for (var g = 0, f = this._opts.landmarkPois, e = f.length; g < e; g++) {      f[g].bShow = false    }  };  c.prototype.pause = function() {    clearInterval(this._intervalFlag);    this._fromPause = true;    this._clearTimeout()  };  c.prototype.hideInfoWindow = function() {    this._overlay._div.style.visibility = "hidden"  };  c.prototype.showInfoWindow = function() {    this._overlay._div.style.visibility = "visible"  };  a.object      .extend(          c.prototype,          {_addMarker : function(f) {  if (this._marker) {    this.stop();    this._map.removeOverlay(this._marker);    clearTimeout(this._timeoutFlag)  }  this._overlay      && this._map.removeOverlay(this._overlay);  var e = new BMap.Marker(this._path[0]);  this._opts.icon && e.setIcon(this._opts.icon);  this._map.addOverlay(e);  e.setAnimation(BMAP_ANIMATION_DROP);  this._marker = e},_addInfoWin : function() {  var f = this;  var e = new d(f._marker.getPosition(),      f._opts.defaultContent);  e.setRelatedClass(this);  this._overlay = e;  this._map.addOverlay(e)},_getMercator : function(e) {  return this._map.getMapType().getProjection()      .lngLatToPoint(e)},_getDistance : function(f, e) {  return Math.sqrt(Math.pow(f.x - e.x, 2)      + Math.pow(f.y - e.y, 2))},_move : function(n, j, m) {  var i = this, h = 0, e = 10, f = this._opts.speed      / (1000 / e), l = this._projection      .lngLatToPoint(n), k = this._projection      .lngLatToPoint(j), g = Math.round(i      ._getDistance(l, k)      / f);  if (g < 1) {    i._moveNext(++i.i);    return  }  i._intervalFlag = setInterval(      function() {        if (h >= g) {          clearInterval(i._intervalFlag);          if (i.i > i._path.length) {return          }          i._moveNext(++i.i)        } else {          h++;          var o = m(l.x, k.x, h, g), r = m(  l.y, k.y, h, g), q = i._projection  .pointToLngLat(new BMap.Pixel(      o, r));          if (h == 1) {var p = null;if (i.i - 1 >= 0) {  p = i._path[i.i - 1]}if (i._opts.enableRotation == true) {  i.setRotation(p, n, j)}if (i._opts.autoView) {  if (!i._map.getBounds()      .containsPoint(q)) {    i._map.setCenter(q)  }}          }          i._marker.setPosition(q);          i._setInfoWin(q)        }      }, e)},setRotation : function(l, f, m) {  var j = this;  var e = 0;  f = j._map.pointToPixel(f);  m = j._map.pointToPixel(m);  if (m.x != f.x) {    var k = (m.y - f.y) / (m.x - f.x), g = Math        .atan(k);    e = g * 360 / (2 * Math.PI);    if (m.x < f.x) {      e = -e + 90 + 90    } else {      e = -e    }    j._marker.setRotation(-e)  } else {    var h = m.y - f.y;    var i = 0;    if (h > 0) {      i = -1    } else {      i = 1    }    j._marker.setRotation(-i * 90)  }  return},linePixellength : function(f, e) {  return Math.sqrt(Math.abs(f.x - e.x)      * Math.abs(f.x - e.x) + Math.abs(f.y - e.y)      * Math.abs(f.y - e.y))},pointToPoint : function(f, e) {  return Math.abs(f.x - e.x) * Math.abs(f.x - e.x)      + Math.abs(f.y - e.y) * Math.abs(f.y - e.y)},_moveNext : function(e) {  var f = this;  if (e < this._path.length - 1) {    f._move(f._path[e], f._path[e + 1],        f._tween.linear)  }},_setInfoWin : function(g) {  var f = this;  if (!f._overlay) {    return  }  f._overlay.setPosition(g, f._marker.getIcon().size);  var e = f._troughPointIndex(g);  if (e != -1) {    clearInterval(f._intervalFlag);    f._overlay        .setHtml(f._opts.landmarkPois[e].html);    f._overlay.setPosition(g,        f._marker.getIcon().size);    f._pauseForView(e)  } else {    f._overlay.setHtml(f._opts.defaultContent)  }},_pauseForView : function(e) {  var g = this;  var f = setTimeout(function() {    g._moveNext(++g.i)  }, g._opts.landmarkPois[e].pauseTime * 1000);  g._setTimeoutQuene.push(f)},_clearTimeout : function() {  for ( var e in this._setTimeoutQuene) {    clearTimeout(this._setTimeoutQuene[e])  }  this._setTimeoutQuene.length = 0},_tween : {  linear : function(f, j, h, i) {    var e = f, l = j - f, g = h, k = i;    return l * g / k + e  }},_troughPointIndex : function(f) {  var h = this._opts.landmarkPois, j;  for (var g = 0, e = h.length; g < e; g++) {    if (!h[g].bShow) {      j = this._map.getDistance(new BMap.Point(          h[g].lng, h[g].lat), f);      if (j < 10) {        h[g].bShow = true;        return g      }    }  }  return -1}          });  function d(e, f) {    this._point = e;    this._html = f  }  d.prototype = new BMap.Overlay();  d.prototype.initialize = function(e) {    var f = this._div = a.dom        .create("div",{  style : "border:solid 1px #ccc;width:auto;min-width:50px;text-align:center;position:absolute;background:#fff;color:#000;font-size:12px;border-radius: 10px;padding:5px;white-space: nowrap;"});    f.innerHTML = this._html;    e.getPanes().floatPane.appendChild(f);    this._map = e;    return f  };  d.prototype.draw = function() {    this.setPosition(this.lushuMain._marker.getPosition(),        this.lushuMain._marker.getIcon().size)  };  a.object.extend(d.prototype, {    setPosition : function(h, i) {      var f = this._map.pointToOverlayPixel(h), e = a.dom.getStyle(          this._div, "width"), g = a.dom          .getStyle(this._div, "height");      overlayW = parseInt(this._div.clientWidth || e, 10),          overlayH = parseInt(this._div.clientHeight || g, 10);      this._div.style.left = f.x - overlayW / 2 + "px";      this._div.style.bottom = -(f.y - i.height) + "px"    },    setHtml : function(e) {      this._div.innerHTML = e    },    setRelatedClass : function(e) {      this.lushuMain = e    }  })})();

function showallrecord(starttime,endtime){//显示多条开始结束时间之间的自行车路书  var bikeId=null;  $.getJSON("./GetBickIdServlet",function(json){    bikeId = json;//所有自行车编号  });  var json={      "StartTime":starttime,//开始时间      "EndTime":endtime//结束时间  };  //创建二维数组,例如pointArray[i]中i自行车编号,pointArray[i][j]为编号为i的自行车的所有借还站点信息  $.getJSON("./GetAllRecordServlet",{json:JSON.stringify(json)},function(json){    var j = 0;    var stationlonlist=new Array();    var stationlatlist=new Array();    var pointArray=new Array();    var bikeIdlist = new Array();    for(var i = 0; i < bikeId.length; i++){      stationlonlist[i] = new Array();      stationlatlist[i] = new Array();      pointArray[i] = new Array();      bikeIdlist[i] = bikeId[i].BikeId;    }    var tt = json.length < 200?json.length:200;//如果查询出来的自行车借还站点记录多于200条,则显示200条。(待完善)    for (var row = 0; row < pointArray.length; row++) {      while (j < tt) {        var k = j;        var p = 0;        var stationlon = parseFloat(json[j].Stationlon);// String类型转换成float类型        stationlonlist[row][p]=stationlon;// 将stationlon放到stationlonlist里        var stationlat = parseFloat(json[j].Stationlat);        stationlatlist[row][p]=stationlat;// 将stationlat放到stationlatlist里        pointArray[row][p] = new BMap.Point(stationlon,stationlat);        while (bikeIdlist[row] == json[k + 1].BikeId) {          k++;          p++;          stationlon= parseFloat(json[k].Stationlon);// String类型转换成float类型          stationlonlist[row][p]=stationlon;// 将stationlon放到stationlonlist里          stationlat= parseFloat(json[k].Stationlat);          stationlatlist[row][p] =stationlat;// 将stationlat放到stationlatlist里          pointArray[row][p] = new BMap.Point(stationlon, stationlat);        }        addMarkertest(pointArray,row);//添加标记点        j = k + 1;        break;      }      var bikespeedtest = speedtest(pointArray,row);//每辆自行车路书的速度      polylinetest(pointArray,row,stationlonlist,stationlatlist);//每辆自行车借还站点间画折线      lushutest(pointArray,bikespeedtest,row,stationlonlist,stationlatlist);//每辆自行车借还站点的路书路径    }    map.setViewport(pointArray);  });}

function speedtest(pointArray,row){//根据自行车的借还时间差来显示不同的路书速度(待完善)  var distance = 0;//直行车走过的路径长度  for(var i = 0; i < pointArray[row].length-1; i++){    distance += (map.getDistance(pointArray[row][i],pointArray[row][i+1]));//自行车借还站点的路径长度  }  return distance/20;//速度=路径长度/时间(此处时间固定,可改为根据数据库读取的时间)}//function polylinetest(pointArray,row,stationlonlist,stationlatlist){  var points = new Array();  for(var i = 0; i < pointArray[row].length; i++){    points[i] = new BMap.Point(parseFloat(stationlonlist[row][i]), parseFloat(stationlatlist[row][i]));  }  //增加点与点之间的连线  var polyline = new BMap.Polyline(points, {    strokeColor : getColor(),    strokeWeight : 2,    strokeOpacity : 0.5  }); // 创建折线  map.addOverlay(polyline); // 绘制折线}//function lushutest(pointArray,bikespeedtest,row,stationlonlist,stationlatlist){  var points = new Array();  for(var i = 0; i < pointArray[row].length; i++){    points[i] = new BMap.Point(parseFloat(stationlonlist[row][i]), parseFloat(stationlatlist[row][i]));  }  var lushu = new BMapLib.LuShu(map, points, {    defaultContent : "",    autoView : true, // 是否开启自动视野调整,如果开启那么路书在运动过程中会根据视野自动调整    icon : new BMap.Icon('photo/bike.png', new BMap.Size(22, 22), {      anchor : new BMap.Size(10, 25)    }),    // enableRotation: true, //是否设置marker随着道路的走向进行旋转    speed : bikespeedtest,  });    lushu.start();}//生成折线的随机颜色function sj16(){  var sjshu=Math.round(Math.random()*10*2);  do  {    sjshu=Math.round(Math.random()*10*2);  }while (sjshu>=14);  return sjshu;}function getColor(){  var hex = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];  var yanse="";  for(i=0; i<6; i++){    yanse+=hex[sj16()];  }  return "#"+yanse}

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    动态jsp页面转PDF输出到页面的实现方法
    下一条:
    jsp利用POI生成Excel并在页面中导出的示例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客