百度地图多点有向连接

百度地图有向链接

为了满足用户从一个点到另一个点有一个明确的指向,并且删除一个点时,跟此相关联的线也相应去掉,具体图如下:

右键删除点相关联的路线,效果如下:

思路

1、初始化地图
2、添加覆盖物
3、地图上添加多个点
4、多个点之间的连线
5、添加方向
6、测试

html页面代码如下

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="css/baiduMap.css">
 <script type="text/javascript" src="mapJs/jquery.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.2&ak=????"></script>

<script type="text/javascript" src="mapJs/MarkerTool.js"></script>
 <script type="text/javascript" src="mapJs/InfoBox.js"></script>
 <script type="text/javascript" src="mapJs/map1.js"></script>

<title>百度地图-综合</title>
</head>
<body>
<a href="index.html" className="title" >b百度地图</a>
<div className="container" id="container"></div>
</body>
</html>

Js代码如下:

$(function() {
    //地图初始化
    var map = new BMap.Map("container");
    var point = new BMap.Point(121.29, 31.14);

    map.centerAndZoom(point, 15);

    //信息窗口样式
    var opts = {
        width: 150, //信息窗口宽度
        height: 80, //信息窗口高度
        title: "" //信息窗口标题
    };

    //创建标注----------------------
    //创建标注工具实例 MarkerTool
    //var mkTool = new BMapLib.MarkerTool(map,{autoClose: true, followText: "添加标注"});

    //给地图 添加事件
    map.addEventListener("click", addMapMarkers);
    //地图 右键单击取消添加
    map.addEventListener("rightclick", function(e) {
        // map.removeEventListener("click",addMapMarkers);
        //mkTool.close();
    });

    var points = []; //记得标注点
    var n = 0; //标注数量记录
    var pointTwo = []; //记录已创建的标注的经纬度
    var rememberPoints = []; //记录是哪两个点之间 创建了折线
    var polylineDel = []; //用于控制删除折线的数组
    // var square = [];//记录自定义覆盖物
    var xxx = [];

    function newMarker() {

    }
    //事件函数 map
    function addMapMarkers(e) {
        if (e && e.stopPropagation) {
            e.stopPropagation();
        } else {
            window.event.cancelBubble = false;
        }
        console.log("经度:" + e.point.lng + ",维度 " + e.point.lat);

        var polyline;
        var polyNum;

        var marker, mySquare;
        var mk = drawMarker(e); //创建标注
        marker = mk.marker;
        mySquare = mk.mySquare;
        //点击锚点 获取经纬度
        marker.addEventListener("click", function(e) {
            e.domEvent.stopPropagation();

            console.log("经度:" + e.point.lng + ",维度 " + e.point.lat);

            var title = this.getTitle(); //获取当前标题
            var point1 = this.getLabel().point; //获取到当前经纬度
            var pointCon = this.getLabel().content; //获取是那个点
            pointTwo.push(point1);
            rememberPoints.push(pointCon);
            pointTwo.length > 2 ? pointTwo.shift() : null; //删除第一个元素 永远保留两个数
            rememberPoints.length > 2 ? rememberPoints.shift() : null;

            // mySquare.toggle();//显示 隐藏切换

            //两个点之间 连线
            if (pointTwo.length >= 2 && rememberPoints[0] != rememberPoints[1]) {
                drawLine(pointTwo[0], pointTwo[1], rememberPoints);
            }

        });
        //右键 删除
        marker.addEventListener("rightclick", function(e) {
            e.domEvent.stopPropagation();
            window.event.preventDefault();

            if (e && e.stopPropagation) {
                e.stopPropagation();
            } else {
                window.event.cancelBubble = true;
            }

            var delPoint = this.getLabel().content;
            var pn = delPoint.substring(1, 10); //获取创建的下标
            for (var i = 0; i < polylineDel.length; i++) {
                if (delPoint == polylineDel[i].points[0] || delPoint == polylineDel[i].points[1]) {
                    map.removeOverlay(polylineDel[i].polyline);
                    map.removeOverlay(polylineDel[i].addArrow);
                }
            }

            this.map.removeOverlay(marker);
            map.removeOverlay(xxx[pn].mySquare); //移除弹窗框

        });
        n++;
    }
    //创建标注 覆盖物
    function drawMarker(e) {
        var mk = {};
        //创建标注
        var marker = new BMap.Marker(new BMap.Point(e.point.lng, e.point.lat), { title: "t" + n });
        var label = new BMap.Label("p" + n, { offset: new BMap.Size(20, -10) });
        //设置label 样式
        label.setStyle({
            display: "none"
        });
        // 添加自定义覆盖物
        var mySquare = new SquareOverlay(new BMap.Point(e.point.lng, e.point.lat), 100, this.map);

        map.addOverlay(mySquare);
        mySquare.hide();

        // marker.enableDragging();//开启拖拽
        points.push(marker); //创建的标注 放入数组
        map.addOverlay(points[n]);
        marker.setLabel(label);

        mk.marker = marker;
        mk.label = label;
        mk.mySquare = mySquare;
        xxx.push(mk);

        return mk;
    }
    /*标注之间的连线
    *返回 polyline
    rememberPoints  记录连线之间的 两个点
    */
    function drawLine(pointA, pointB, twoPoints) {
        var obj = {};
        var isAdd = true;
        var polyline;

        for (var i = 0; i < polylineDel.length; i++) {
            if ((twoPoints[0] == polylineDel[i].points[0] && twoPoints[1] == polylineDel[i].points[1]) || (twoPoints[1] == polylineDel[i].points[0] && twoPoints[0] == polylineDel[i].points[1])) {
                isAdd = false;
                alert("不能重复连接");
            }
        }
        if (isAdd) {
            polyline = new BMap.Polyline([
                new BMap.Point(pointA.lng, pointA.lat),
                new BMap.Point(pointB.lng, pointB.lat)
            ], { strokeColor: "red", strokeWeight: 2, strokeOpacity: 0.5 });
            map.addOverlay(polyline);

            obj.points = twoPoints;
            obj.polyline = polyline;
            //箭头指向
            obj.addArrow = addArrow(polyline, 10, Math.PI / 7);

            polylineDel.push(obj);
        }

        pointTwo = new Array();
        rememberPoints = new Array();

        return;
    }

    // 复杂的自定义覆盖物
    // 定义自定义覆盖物的构造函数
    function SquareOverlay(center, length, thisMap) {
        this._center = center;
        this._length = length;
        this._thismap = thisMap;
    }
    // 继承API的BMap.Overlay
    SquareOverlay.prototype = new BMap.Overlay();

    // 实现初始化方法
    SquareOverlay.prototype.initialize = function(map) {

            // 保存map对象实例
            this._map = map;
            // 创建div元素,作为自定义覆盖物的容器
            var div = document.createElement("div");

            var divLine = this.divLine = document.createElement("div"); //创建连线
            var divDel = this.divDel = document.createElement("div");
            divLine.style.height = divDel.style.height = "30px";
            divLine.style.lineHeight = divDel.style.lineHeight = "30px";

            divLine.appendChild(document.createTextNode("连线"));
            divDel.appendChild(document.createTextNode("删除"));

            div.appendChild(divLine); //添加到div中
            div.appendChild(divDel); //添加到div中

            div.style.position = "absolute";
            // 可以根据参数设置元素外观
            // div.style.display = "none";
            div.style.width = this._length + "px";
            div.style.height = this._length + "px";
            div.style.background = "white";

            // 将div添加到覆盖物容器中
            map.getPanes().markerPane.appendChild(div);
            // 保存div实例
            this._div = div;
            var that = this;
            //连线事件
            divLine.onclick = function(e) {
                // e.domEvent.stopPropagation();
                window.event.preventDefault();

                if (e && e.stopPropagation) {
                    e.stopPropagation();
                } else {
                    window.event.cancelBubble = true;
                }
                that._div.style.display = "none";
                // map.addOverlay(mySquare);
                console.log(that._center);
            }

            divDel.onclick = function(e) {
                // e.domEvent.stopPropagation();
                window.event.preventDefault();

                if (e && e.stopPropagation) {
                    e.stopPropagation();
                } else {
                    window.event.cancelBubble = true;
                }
                // that._thismap.removeOverlay(square[0]);

                // alert("删除");
            }

            // 需要将div元素作为方法的返回值,当调用该覆盖物的show、
            // hide方法,或者对覆盖物进行移除时,API都将操作此元素。
            return div;
        }
        // 实现绘制方法
    SquareOverlay.prototype.draw = function() {
            // 根据地理坐标转换为像素坐标,并设置给容器
            var position = this._map.pointToOverlayPixel(this._center);
            this._div.style.left = 60 + position.x - this._length / 2 + "px";
            this._div.style.top = position.y - this._length / 2 + "px";
        }
        // 实现显示方法
    SquareOverlay.prototype.show = function() {
            if (this._div) {
                this._div.style.display = "";
            }
        }
        // 实现隐藏方法
    SquareOverlay.prototype.hide = function() {
            if (this._div) {
                this._div.style.display = "none";
            }
        }
        // 添加自定义方法
    SquareOverlay.prototype.toggle = function() {
        if (this._div) {
            if (this._div.style.display == "") {
                this.hide();
            } else {
                this.show();
            }
        }
    }

    //----------------
    //箭头方法引用博文地址 http://blog.csdn.net/baidulbs/article/details/8571961
    function addArrow(polyline, length, angleValue) { //绘制箭头的函数
        var linePoint = polyline.getPath(); //线的坐标串
        var arrowCount = linePoint.length;
        for (var i = 1; i < arrowCount; i++) { //在拐点处绘制箭头
            var pixelStart = map.pointToPixel(linePoint[i - 1]);
            var pixelEnd = map.pointToPixel(linePoint[i]);
            var angle = angleValue; //箭头和主线的夹角
            var r = length; // r/Math.sin(angle)代表箭头长度
            var delta = 0; //主线斜率,垂直时无斜率
            var param = 0; //代码简洁考虑
            var pixelTemX, pixelTemY; //临时点坐标
            var pixelX, pixelY, pixelX1, pixelY1; //箭头两个点
            if (pixelEnd.x - pixelStart.x == 0) { //斜率不存在是时
                pixelTemX = pixelEnd.x;
                if (pixelEnd.y > pixelStart.y) {
                    pixelTemY = pixelEnd.y - r;
                } else {
                    pixelTemY = pixelEnd.y + r;
                }
                //已知直角三角形两个点坐标及其中一个角,求另外一个点坐标算法
                pixelX = pixelTemX - r * Math.tan(angle);
                pixelX1 = pixelTemX + r * Math.tan(angle);
                pixelY = pixelY1 = pixelTemY;
            } else //斜率存在时
            {
                delta = (pixelEnd.y - pixelStart.y) / (pixelEnd.x - pixelStart.x);
                param = Math.sqrt(delta * delta + 1);

                if ((pixelEnd.x - pixelStart.x) < 0) //第二、三象限
                {
                    pixelTemX = pixelEnd.x + r / param;
                    pixelTemY = pixelEnd.y + delta * r / param;
                } else //第一、四象限
                {
                    pixelTemX = pixelEnd.x - r / param;
                    pixelTemY = pixelEnd.y - delta * r / param;
                }
                //已知直角三角形两个点坐标及其中一个角,求另外一个点坐标算法
                pixelX = pixelTemX + Math.tan(angle) * r * delta / param;
                pixelY = pixelTemY - Math.tan(angle) * r / param;

                pixelX1 = pixelTemX - Math.tan(angle) * r * delta / param;
                pixelY1 = pixelTemY + Math.tan(angle) * r / param;
            }

            var pointArrow = map.pixelToPoint(new BMap.Pixel(pixelX, pixelY));
            var pointArrow1 = map.pixelToPoint(new BMap.Pixel(pixelX1, pixelY1));
            var Arrow = new BMap.Polyline([
                pointArrow,
                linePoint[i],
                pointArrow1
            ], {
                strokeColor: "red",
                strokeWeight: 3,
                strokeOpacity: 0.5
            });

            map.addOverlay(Arrow);

            return Arrow;
        }
    }

});

js代码下载地址:http://download.csdn.net/my

时间: 2024-10-14 13:55:03

百度地图多点有向连接的相关文章

百度地图多点路径加载以及调整页面js

1 $(document).ready(function () { 2 /*用正则表达式获取url传递的地址参数,split后获得地址数组*/ 3 bmap = new BMap.Map('mapcontainer'); 4 var point = new BMap.Point(116.404, 39.915);//地图中心点 5 bmap.centerAndZoom(point, 15);//调整缩放以及设立中心点 6 bmap.enableScrollWheelZoom(); 7 var l

百度地图多点+画连接线+数字标注

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html ><head> <title>(按钮)</title></head><body > <div> <fieldset

百度地图gps信息纠正

如题,用手机百度获取到的gps相关坐标信息与真实坐标信息有一定的偏差存在,至于为啥偏差,暂且深究. 下面事我搜索到的将误差减小到最小化的方法,仅供参考. baidu经纬度坐标与google经纬度坐标都是经过转换的.使用下面那个url可以将原始坐标或者谷歌的坐标转换成baidu的坐标http://api.map.baidu.com/ag/coord/convert?from=2&to=4&x=114.324821&y=22.605812,将得到的base64字符,还原就是真实的经纬度

百度地图之多点步行路径连线问题

最近项目需要结合用到百度地图,需求是在地图实现多个点步行连线问题;因为百度有提供两点之间的步行路径图,以及沿线的坐标点信息;初步设想是首先把各个点的步行路径画出来,然后得到这条线路的坐标信息集合,然后通过百度地图的另外一个做直线接口重新把完整线路绘画出来; 如果你对百度地图的API知识不是很了解,可以查看http://developer.51cto.com/art/201110/298662.htm,里面有比较详细的介绍; 百度地图API开发者地址:http://developer.baidu.

百度地图API 添加自定义标注 多点标注

原文:百度地图API 添加自定义标注 多点标注 分四个文件 location.php map.css 图片 数据库 数据库配置自己改下 ------------------------------------------------------------  华丽的分割线   ----------------------------------------------------- location.php 主文件 <link rel="stylesheet" type=&quo

百度地图API显示多个标注点,解决提示信息问题以及给标注增加地图旁的文字连接提示的另一种解决办法

原文:百度地图API显示多个标注点,解决提示信息问题以及给标注增加地图旁的文字连接提示的另一种解决办法 公司的网站改版要求在一个页面显示百度地图.上面要同时显示很多标注点,标注点当然要有提示信息嘛,提示信息也当然要不一样嘛,因为给标注绑定的鼠标事件当你移动鼠标上去的其实循环值已经是最后值了,所以无论你怎么做,所有的标注点都是同一个提示,就是最后的那个提示.我就打开百度找方案嘛.一找之下,搜了几十页就一个解决方案,大家都是你拷贝我的我拷贝你的.做个闭包.把循环的值锁定在里面.代码照着做,也的确可以

html5 的百度地图连接

在一些网站上,我们经常会看到一些地址会有一个图标的形式展现,当你点击的时候就会加载一个你点击区域的地图出来,很神奇的一个功能,在之前是没有这样功能的,都是直接写上地址,你要去的话自己找去吧,现在有了这个人性化的工具之后,我们要找什么地点就明确很多了,在上面可以看到周围的具体环境啊,什么的,交通啊什么的都可以查到,那么,思考一下,要实现这个功能好像十分的困难吧,居然把一个地图给精确定位,太不可思议了. 十分方便的是,我们的html5就能够轻松的帮助我们搞定这个事情,下面我就介绍一下怎么实现地图的呈

baidumap 百度地图,实现多点之间的带方向路线图。

通过lastVisitAt判断时间先后. 通过三角函数验证角度 再由baidumap 会制线段 绘制三角箭头 比较难看…… 测试个人 因为框架引用baidu 有各种问题失败,为最快实现,以此页作一个独立的iframe 通过window.localStorage 实现数据传递. 父页代码 window.localStorage.jsondata=JSON.stringify(json.data); var iframe=$("#iframebaidumap"); iframe.attr(

[百度地图API] 将多个点按照驾车路线连接并可以编辑路线

首先感谢酸奶姐(酸奶小妹),我从她的博客上学到很多.这篇文章是站在酸菜姐的肩膀上想出来的......笑...... 这几天在老大的要求下学习了百度的API,自己摸索着一个多星期,终于大概的了解了,然后又拜读了许多大神的博客,终于写出了比较能满足老大需求的代码. 开头的CSS,我也是看百度的DEMO写的,本人菜鸟,css待学习. <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head&g