170427 百度地图JSAPI

1625-5 王子昂 总结《2017年4月26日》 【连续第207天总结】

A. 百度地图API和JavaScript 100%

B. 我也不知道怎么就写起了JS……明明没有学过TAT

为了减少与QT的通讯来降低复杂度,在JS的API中尽量完成所有调用

经过一下午的练习和晚上的需求确认,完成了以下功能:

地图空白处右键新增航点

在轨迹上右键可以新增额外航点

拖拽航点

刚开始按照弧线(我也不知道为什么一眼就看上了弧线,明明直线才对)API完成了右键新增端点、拖拽自动连线

想想没法得到端点坐标值来发送,没有意义嘛

于是重头构建,使用折线+标记数组(作为端点)构成航线轨迹,每次修改清除前一次痕迹,然后重新将所有标记依次连接

但是这样的折线是一整根,无法单独操作。在确认到有中间新增端点的需求以后,无奈推倒重来。

使用每两个标记之间搭建一根折线的方式构成。整个程序由抽象的points,实例标记markers、实例折线lines三个数组搭建而成,在新增点的时候由鼠标坐标生成point,然后转换为marker,再与前一个marker相连画出line。

中间新增端点的逻辑则为记录坐标生成point,由指定轨迹得到索引n,然后将n以后的所有对象后移一位,腾出空间放置新点point。然后同理,由point-marker-line的顺序生成。注意:修改后虽然之后的点位置不变,但顺序全部不同,因此必须clear所有Overlays(放置物)重新画出。否则在移动的时候会由于索引不同而产生重影或缺点。

得到记录坐标的方法则由Polyline的事件mousedown得到。另外为了增加可视性,由Polyline的两个事件mouseover和mouseout,再加上setstrokeColor()方法改变颜色,使得鼠标能否点击到折线更加清晰(虽然还是很麻烦就是了)

右键删除航点跟中间新增航点的函数基本相同,甚至更加简单。将三个数组前移,然后将被删除的点的后端轨迹重新计算生成。然后清除、全盘重绘即可。

在添加右键菜单的时候出了点岔子:不知道为什么,marker的右键菜单总是只有第一个marker能正常显示,其他的全部无法调用。百度后发现,是闭包函数的相关问题。我理解为右键菜单被生成后指定为第一个marker的,之后生成的添加的右键菜单也仍然是第一个marker的,因此无法正常弹出。解决方法为使用bind+函数绑定方法。

代码为:

var removeMarker = function(e,ee,marker){
   n=markers.indexOf(marker);
   del_point(n);
               				}
...
marker=new BMap.Marker(points[points.length-1]);
var markerMenu=new BMap.ContextMenu(); //覆盖物右键
markerMenu.addItem(new BMap.MenuItem('删除',removeMarker.bind(marker)));
marker.addContextMenu(markerMenu);
注意bind方法是在Item以内的,这个地方参数给错了就无法正常生成菜单,我在这卡了好久_(:з」∠)_看错一个括号

全部做完还是挺有成就感的。然而同时也有挺大的挫败感,由于没有JavaScript的编译器,只能直接通过浏览器来显示页面。因此当出现错误的时候,错误指令将会直接跳过,没有任何错误信息。调试只能通过alert()来看哪里异常。这导致了很多无谓的时间浪费,例如少了分号、函数名写错等等。

反正终于做完啦=。=剩下的都交给加勉小伙伴来接收了哦也

附上代码:

<!DOCTYPE html>
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
   <style type="text/css">
   body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
   </style>
   <script src="./qwebchannel.js"></script>
   <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
   <script  src="http://api.map.baidu.com/api?v=2.0&ak=Kh8PB0QGGdXldxYqKObHDtbfEf8eF9SG"></script>
   <script  src="http://api.map.baidu.com/library/CurveLine/1.5/src/CurveLine.min.js"></script>
   <title>地图展示</title>
</head>
<body>
   <div id="allmap"></div>
<script >
   // 百度地图API功能
   var map = new BMap.Map("allmap");    // 创建Map实例
   map.centerAndZoom(new BMap.Point(119.433, 32.193), 11);  // 初始化地图,设置中心点坐标和地图级别
   map.addControl(new BMap.MapTypeControl());   //添加地图类型控件
   map.setCurrentCity("镇江");          // 设置地图显示的城市 此项是必须设置的
   map.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放

   var points=[];
   var markers=[];
   var lines=[];


   var line = new BMap.Polyline(points, {strokeColor:"blue", strokeWeight:3, strokeOpacity:0.5}); //创建线对象

   //map.addOverlay(line); //添加到地图中
   //line.enableEditing(); //开启编辑功能


   //创建右键菜单

   var mapMenu=new BMap.ContextMenu();    //地图右键
   map.addEventListener("mousedown",function(e){
   if(event.button==2)
      {
         x=e.point.lng;
         y=e.point.lat;

      }

   });
   mapMenu.addItem(new BMap.MenuItem('添加航点',function(e){
      newPosition=new BMap.Point(x,y);
      points.push(newPosition);
      new_point();
      //refresh();


   }));


   map.addContextMenu(mapMenu);

   var removeMarker = function(e,ee,marker){
      n=markers.indexOf(marker);
      del_point(n);

                  }
   function new_point()
   {
      marker=new BMap.Marker(points[points.length-1]);
      var markerMenu=new BMap.ContextMenu(); //覆盖物右键


      markerMenu.addItem(new BMap.MenuItem('删除',removeMarker.bind(marker)));
      marker.addContextMenu(markerMenu);       //右键菜单绑定

      marker.addEventListener("dragend", function(e){
         n=markers.indexOf(e.target);
         if(n==0)
         {
            points[n]=new BMap.Point(e.point.lng,e.point.lat);
            map.removeOverlay(lines[1]);
            draw_line(0);
            map.addOverlay(lines[1]);
         }
         else
         {
            points[n]=new BMap.Point(e.point.lng,e.point.lat);
            map.removeOverlay(lines[n]);
            draw_line(n-1);
            map.addOverlay(lines[n]);
            if(n!=lines.length-1)//第二条线
            {
               map.removeOverlay(lines[n+1]);
               draw_line(n);
               map.addOverlay(lines[n+1]);
            }
         }
                                          })
         marker.enableDragging();
         line=new BMap.Polyline([points[points.length-2],points[points.length-1]],{strokeColor:"blue", strokeWeight:5, strokeOpacity:0.8});//新线
         line.addEventListener("mouseover",function(e){e.target.setStrokeColor("red");})
         line.addEventListener("mouseout",function(e){e.target.setStrokeColor("blue");})
         line.addEventListener("mousedown",function(e){
            if(event.button==2){
               //新建中间航点
               n=lines.indexOf(e.target);
               point=new BMap.Point(e.point.lng,e.point.lat);
               change_point(n,point);


            }
                                             })
         markers.push(marker);
         lines.push(line);
         lines[0]=new BMap.Polyline([0,0],{strokeOpacity:0});
         map.addOverlay(marker);
         map.addOverlay(line);
   }

   function change_point(n,point)
   {
            map.clearOverlays();
            lines.push(lines[lines.length-1]);
            markers.push(markers[markers.length-1]);
            points.push(points[points.length-1]);
            for(var i=lines.length-1;i>n;i--)
            {
               lines[i]=lines[i-1];
               markers[i]=markers[i-1];
               points[i]=points[i-1];
            }
            points[n]=point;
            marker=new BMap.Marker(point);
            //marker.addContextMenu(markerMenu);
            markers[n]=marker;
            marker.addEventListener("dragend", function(e){
               n=markers.indexOf(e.target);
               points[n]=new BMap.Point(e.point.lng,e.point.lat);
               map.removeOverlay(lines[n]);
               draw_line(n-1);
               map.addOverlay(lines[n]);
               if(n!=lines.length-1)//第二条线
               {
                  map.removeOverlay(lines[n+1]);
                  draw_line(n);
                  map.addOverlay(lines[n+1]);
               }
                                             })
            marker.enableDragging();
            draw_line(n-1);
            draw_line(n);
            for(var i=1;i<lines.length;i++)
            {
               map.addOverlay(markers[i]);
                map.addOverlay(lines[i]);
            }
            map.addOverlay(markers[0]);


   }

   function del_point(n)
   {
      map.clearOverlays();
      for(var i=n;i<lines.length-1;i++)
      {
         if(i!=0)lines[i]=lines[i+1];
         markers[i]=markers[i+1];
         points[i]=points[i+1]
      }
      lines.length--;
      markers.length--;
      points.length--;
      draw_line(n-1);
      for(var i=1;i<lines.length;i++)
      {
         map.addOverlay(markers[i]);
         map.addOverlay(lines[i]);
      }
      map.addOverlay(markers[0]);

   }

   function draw_line(n)
   {
      lines[n+1]=new BMap.Polyline([points[n],points[n+1]],{strokeColor:"blue", strokeWeight:5, strokeOpacity:0.8});
      lines[n+1].addEventListener("mouseover",function(e){e.target.setStrokeColor("red");})
      lines[n+1].addEventListener("mouseout",function(e){e.target.setStrokeColor("blue");})
      lines[n+1].addEventListener("mousedown",function(e){
         if(event.button==2){
            //新建中间航点
               n=lines.indexOf(e.target);
               point=new BMap.Point(e.point.lng,e.point.lat);
               change_point(n,point);
         }
      })

   }
//消息函数
function send(n,x,y)//n为修改点的个数,若为新增点则在n前加0。x和y分别为该点的当前坐标
{
   sendMessage(n,x,y);
}
function recv(x,y)//新增点的x和y的坐标
{
   newPosition=new BMap.Point(x,y);
   points.push(newPosition);
   new_point();
}
function change_order(n,b)//n为修改点的索引,b为0时提前(上升),b为1时推后(下降),b为-1时删除该点
{
   if(b==1)
   {  //下降
      if(n!=markers.length-1)
      {
         line=lines[n];
         marker=markers[n];
         point=points[n];
         lines[n]=lines[n+1];
         markers[n]=markers[n+1];
         points[n]=points[n+1];
         lines[n+1]=line;
         markers[n+1]=marker;
         points[n+1]=point;
      }
   }
   elseif(b==0)
   {  //上升
      if(n!=0)
      {
         line=lines[n];
         marker=markers[n];
         point=points[n];
         if(n!=1)lines[n]=lines[n-1];
         markers[n]=markers[n-1];
         points[n]=points[n-1];
         if(n!=1)lines[n-1]=line;
         markers[n-1]=marker;
         points[n-1]=point;

      }

   }
   else
   {
      del_point(n);
   }
}

    window.onload = function() {


            //new QWebChannel(qt.webChannelTransport, function(channel) {;
                // make dialog object accessible globally
             //content = channel.objects.content;                    //把对象赋值到JS中
             //content.receiveText("s");                                     //c++中调用类中的函数一样
          //                                           }
          alert("sss");


                           }



</script>
</body>
</html>

C. 明日计划

汇编语言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值