如何利用百度地图JSAPI画带箭头的线?

百度地图JSAPI提供两种绘制多折线的方式,一种是已知多折线经纬度座标串通过AddOverlay接口进行添加;另一种是通过在地图上鼠标单击进行绘制(鼠标绘制工具条库)。目前这两种方式只能绘制多折线,并不能同时绘制线的箭头,以下介绍如何在线的拐点同时绘制箭头,以供参考。最终效果如下:

1360050608_5526.png

    1. 绘制箭头方法:

1360050921_2292.png

    上图中,线段AB是通过JSAPI画线方式添加的,只要绘制出CBD就可以实现箭头效果。为了灵活绘制箭头,需要用户自定义箭头的长度(r)和角度(angle)。

    实现步骤如下:

     变量定义:pixelStart: 线的一端屏幕座标,pixelEnd:线的箭头端屏幕座标;r:选取多长距离绘制箭头(单位像素,并不是CB对应的箭头的长度,而是红色线段对应的距离);angle:箭头线(CB或者DB)与AB的夹角。

     1) 首先要将AB两点的经纬度座标转换成屏幕座标。
     2) 然后根据AB两点屏幕座标以及r长度,计算绿色小绿点的屏幕座标pixelTem。

     3) 然后根据B点、小绿点的屏幕座标及angle角度,计算出C,D两点的屏幕座标。

     4) 利用map的座标转换方法,将C,D两点的屏幕座标转成经纬度表示的座标。

     5) 利用画线方法,绘制CBD多折线。

      备注:思路很简单,主要是计算小绿点、C,D的屏幕座标麻烦。楼主计算这些点的公式均来自与初中数学公式,就不再赘述直接上代码了。

 

     完整代码如下:

  1. <!DOCTYPE html>

  2. <html>

  3. <head>

  4. <metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/>

  5. <styletype="text/css">

  6. body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;}  

  7. #l-map{height:100%;width:78%;float:left;border-right:2px solid #bcbcbc;}  

  8. #r-result{height:100%;width:20%;float:left;}  

  9. </style>

  10. <scripttype="text/javascript"src="http://api.map.baidu.com/api?v=1.4"></script>

  11. <title>折线</title>

  12. </head>

  13. <body>

  14. <divid="allmap"></div>

  15. </body>

  16. </html>

  17. <scripttype="text/javascript">

  18. var map = new BMap.Map("allmap");  

  19. var point = new BMap.Point(116.404, 39.915);  

  20. map.centerAndZoom(point, 15);  

  21. map.addControl(new BMap.NavigationControl());  

  22. map.enableScrollWheelZoom();  

  23. var polyline = new BMap.Polyline([  

  24.   //new BMap.Point(116.399, 39.910),  

  25.   new BMap.Point(116.405, 39.920),  

  26.   new BMap.Point(116.425,39.91936),  

  27.   new BMap.Point(116.415,39.93936),  

  28. // new BMap.Point(116.415,39.92936),  

  29. ], {strokeColor:"blue", strokeWeight:3, strokeOpacity:0.5});  

  30. map.addOverlay(polyline);  

  31. addArrow(polyline,10,Math.PI/7);  

  32. function addArrow(polyline,length,angleValue){ //绘制箭头的函数  

  33. var linePoint=polyline.getPath();//线的座标串  

  34. var arrowCount=linePoint.length;  

  35. for(var i =1;i<arrowCount;i++){ //在拐点处绘制箭头  

  36. var pixelStart=map.pointToPixel(linePoint[i-1]);  

  37. var pixelEnd=map.pointToPixel(linePoint[i]);  

  38. var angle=angleValue;//箭头和主线的夹角  

  39. var r=length; // r/Math.sin(angle)代表箭头长度  

  40. var delta=0; //主线斜率,垂直时无斜率  

  41. var param=0; //代码简洁考虑  

  42. var pixelTemX,pixelTemY;//临时点座标  

  43. var pixelX,pixelY,pixelX1,pixelY1;//箭头两个点  

  44. if(pixelEnd.x-pixelStart.x==0){ //斜率不存在是时  

  45. pixelTemX=pixelEnd.x;  

  46.     if(pixelEnd.y>pixelStart.y)  

  47.     {  

  48. pixelTemY=pixelEnd.y-r;  

  49.     }  

  50.     else  

  51.     {  

  52. pixelTemY=pixelEnd.y+r;  

  53.     }     

  54.     //已知直角三角形两个点座标及其中一个角,求另外一个点座标算法  

  55. pixelX=pixelTemX-r*Math.tan(angle);   

  56. pixelX1=pixelTemX+r*Math.tan(angle);  

  57. pixelY=pixelY1=pixelTemY;  

  58. }  

  59. else  //斜率存在时  

  60. {  

  61. delta=(pixelEnd.y-pixelStart.y)/(pixelEnd.x-pixelStart.x);  

  62. param=Math.sqrt(delta*delta+1);  

  63.     if((pixelEnd.x-pixelStart.x)<0) //第二、三象限  

  64.     {  

  65. pixelTemX=pixelEnd.x+ r/param;  

  66. pixelTemY=pixelEnd.y+delta*r/param;  

  67.     }  

  68.     else//第一、四象限  

  69.     {  

  70. pixelTemX=pixelEnd.x- r/param;  

  71. pixelTemY=pixelEnd.y-delta*r/param;  

  72.     }  

  73.     //已知直角三角形两个点座标及其中一个角,求另外一个点座标算法  

  74. pixelX=pixelTemX+ Math.tan(angle)*r*delta/param;  

  75. pixelY=pixelTemY-Math.tan(angle)*r/param;  

  76. pixelX1=pixelTemX- Math.tan(angle)*r*delta/param;  

  77. pixelY1=pixelTemY+Math.tan(angle)*r/param;  

  78. }  

  79. var pointArrow=map.pixelToPoint(new BMap.Pixel(pixelX,pixelY));  

  80. var pointArrow1=map.pixelToPoint(new BMap.Pixel(pixelX1,pixelY1));  

  81. var Arrow = new BMap.Polyline([  

  82.     pointArrow,  

  83.  linePoint[i],  

  84.     pointArrow1  

  85. ], {strokeColor:"blue", strokeWeight:3, strokeOpacity:0.5});  

  86. map.addOverlay(Arrow);  

  87. }  

  88. }  

  89. </script>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章