使用百度地图实现圆形,矩形自动生成路线点

发布时间 2023-04-06 14:07:33作者: 初见如月
纯JS代码
<!DOCTYPE html>
<html>
    <head>
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=rT0CjX0WLsG2DA4PCQxXlPw5QZKZmDYZ">
        </script>
        <title>地图示例</title>
        <style type="text/css">
            html {
                height: 100%
            }

            body {
                height: 100%;
                margin: 0px;
                padding: 0px
            }

            #container {
                height: 100%
            }

            #allmap {
                width: 100%;
                height: 700px;
                overflow: hidden;
            }
        </style>

    </head>
    <body>
        <div id="allmap" style="overflow:hidden;zoom:1;position:relative;">
            <div id="container"
                style="height:100%;-webkit-transition: all 0.5s ease-in-out;transition: all 0.5s ease-in-out;">
            </div>
        </div>
        <div style="width: 100% ;height: 100px;margin-top: 30px;">
            请输入经度:<input id="longitude" value="" />
            请输入纬度:<input id="latitude" value="" />
            <button onclick="save()">确定</button>
        </div>
        <script type="text/javascript">

        </script>
        <script type="text/javascript">
            function save() {
                var newLon = document.getElementById("longitude").value;
                var newLat = document.getElementById("latitude").value;
                this.lon = newLon;
                this.lat = newLat;
                this.loadData(lon, lat);
            }
            var lon = "104.07629897213479"
            var lat = "30.55206000338563"
            var mapNumberUtil;
            this.loadData(lon, lat);

            function loadData(lon, lat) {

                mapNumberUtil = {
                    rad: function rad(d) {
                        return d * Math.PI / 180.0;
                    },
                    deg: function deg(d) {
                        return d * 180 / Math.PI
                    }
                };
                var map = new BMap.Map("container");
                // 创建地图实例  
                var point1 = new BMap.Point(lon, lat);
                // 创建点坐标  112.45035065711788 
                map.centerAndZoom(point1, 14);
                //初始化地图,设置中心点坐标和地图级别  
                map.enableScrollWheelZoom(true);
                map.addEventListener("click", function(e) {
                    //map.clearOverlays();
                    var point2 = new BMap.Point(e.point.lng, e.point.lat);
                    var marker1 = new BMap.Marker(point2);
                    map.addOverlay(marker1);

                    function startDownload(oContent, sSaveFileName, fBgnDownHandle, sTxtMimeExtName, bAddUtf8BOM,
                        bForceUseBlob, bNotShowNewNode, oHtmlDoc) {
                        if (arguments.length < 8) oHtmlDoc = document;
                        if (arguments.length < 7) bNotShowNewNode = true;
                        if (arguments.length < 6) bForceUseBlob = true;
                        if (arguments.length < 5) bAddUtf8BOM = true;
                        if (arguments.length < 4) sTxtMimeExtName = "txt";
                        if (arguments.length < 3) fBgnDownHandle = null;
                        var sHref = "";
                        var sBOM = bAddUtf8BOM ? "\ufeff" : "";
                        var sTxtMime = "text/" + sTxtMimeExtName;

                        if (typeof oContent == "object" && oContent instanceof Blob) {
                            sHref = URL.createObjectURL(oContent);
                        } else if (typeof oContent == "string" && oContent.match(/^(http|https|ftp):\/\//i)) {
                            sHref = oContent;
                        } else if (bForceUseBlob) {
                            var oBlob = new Blob([sBOM + oContent], {
                                type: sTxtMime + ",charset=UTF-8"
                            });
                            sHref = URL.createObjectURL(oBlob);
                        } else {
                            sHref = "data:" + sTxtMime + ';charset=utf-8,' + sBOM + encodeURIComponent(oContent);
                        }

                        var aLink = oHtmlDoc.createElement('a');
                        aLink.href = sHref;
                        aLink.download = "" + sSaveFileName;
                        if (bNotShowNewNode) {
                            aLink.style = "display: none;";
                        }
                        //经纬度下载方法,需要下载放开注释
                        //fireClickEvent(aLink);
                        if (fBgnDownHandle) fBgnDownHandle();
                    }

                    function fireClickEvent(oElem) {
                        var oEvent;
                        if (window.MouseEvent) {
                            oEvent = new MouseEvent('click');
                        } else {
                            oEvent = document.createEvent('MouseEvents');
                            oEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false,
                                false, 0,
                                null);
                        }
                        oElem.dispatchEvent(oEvent);
                    }
                    var driving = new BMap.DrivingRoute(map, {
                        renderOptions: {
                            map: map,
                            autoViewport: false
                        },
                        onSearchComplete: function(results) {
                            if (driving.getStatus() == BMAP_STATUS_SUCCESS) {
                                var pts = driving.getResults().getPlan(0).getRoute(0).getPath();
                                var sl = pts.length;
                                var result = [];
                                for (var i in pts) {
                                    result.push(pts[i].lng + "," + pts[i].lat + ",");
                                    var point = new BMap.Point(pts[i].lng, pts[i].lat);
                                    var marker = new BMap.Marker(point); // 创建标注   
                                    map.addOverlay(marker); // 将标注添加到地图中
                                }
                                console.log("point:" + "(" + sl + ")" + result.join(''));
                                startDownload("point:" + "(" + sl + ")" + result.join(''), "lnglat.txt");
                            }
                        }
                    });
                    driving.search(point2, point1);
                })
                var arr = [5, 20, 35, 50, 65, 80, 95, 110, 125, 140, 155, 170, 185, 200, 215, 230, 245, 260, 275, 290, 305, 320,
                    335, 350, 360, 375
                ];
                var temp_arr = arr.slice(0);
                // 取出的数值项,保存在此数组
                var return_arr = [];
                var dist = 2500;
                var squareDist = 5000;
                for (var i = 0; i < 5; i++) {
                    // 判断如果数组还有可以取出的元素,以防下标越界
                    if (temp_arr.length > 0) {
                        // 在数组中产生一个随机索引
                        var arrIndex = Math.floor(Math.random() * temp_arr.length);
                        // 将此随机索引的对应数组元素值复制出来
                        return_arr[i] = temp_arr[arrIndex];
                        // 然后删掉此索引的数组元素,这时候temp_arr变为新的数组
                        temp_arr.splice(arrIndex, 1)
                    } else {
                        // 数组中数据项取完后,退出循环,
                        break;
                    }
                }


                //随机生成圆形的点经纬度
                for (var i = 0; i < return_arr.length; i++) {
                    var lonandlat = getLonAndLat(lon, lat, return_arr[i], dist);

                    autoMap(lonandlat.lon, lonandlat.lat);
                }
                async function autoMap(lonLone, latLone) {
                    var point2 = new BMap.Point(lonLone, latLone);
                    var marker1 = new BMap.Marker(point2);
                    map.addOverlay(marker1);

                    function startDownload(oContent, sSaveFileName, fBgnDownHandle, sTxtMimeExtName, bAddUtf8BOM,
                        bForceUseBlob, bNotShowNewNode, oHtmlDoc) {
                        if (arguments.length < 8) oHtmlDoc = document;
                        if (arguments.length < 7) bNotShowNewNode = true;
                        if (arguments.length < 6) bForceUseBlob = true;
                        if (arguments.length < 5) bAddUtf8BOM = true;
                        if (arguments.length < 4) sTxtMimeExtName = "txt";
                        if (arguments.length < 3) fBgnDownHandle = null;
                        var sHref = "";
                        var sBOM = bAddUtf8BOM ? "\ufeff" : "";
                        var sTxtMime = "text/" + sTxtMimeExtName;
                        if (typeof oContent == "object" && oContent instanceof Blob) {
                            sHref = URL.createObjectURL(oContent);
                        } else if (typeof oContent == "string" && oContent.match(/^(http|https|ftp):\/\//i)) {
                            sHref = oContent;
                        } else if (bForceUseBlob) {
                            var oBlob = new Blob([sBOM + oContent], {
                                type: sTxtMime + ",charset=UTF-8"
                            });
                            sHref = URL.createObjectURL(oBlob);
                        } else {
                            sHref = "data:" + sTxtMime + ';charset=utf-8,' + sBOM + encodeURIComponent(oContent);
                        }
                        var aLink = oHtmlDoc.createElement('a');
                        aLink.href = sHref;
                        aLink.download = "" + sSaveFileName;
                        if (bNotShowNewNode) {
                            aLink.style = "display: none;";
                        }
                        //fireClickEvent(aLink);
                        if (fBgnDownHandle) fBgnDownHandle();
                    }

                    function fireClickEvent(oElem) {
                        var oEvent;
                        if (window.MouseEvent) {
                            oEvent = new MouseEvent('click');
                        } else {
                            oEvent = document.createEvent('MouseEvents');
                            oEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0,
                                null);
                        }
                        oElem.dispatchEvent(oEvent);
                    }
                    var driving = new BMap.DrivingRoute(map, {
                        renderOptions: {
                            map: map,
                            autoViewport: false
                        },
                        onSearchComplete: function(results) {
                            if (driving.getStatus() == BMAP_STATUS_SUCCESS) {
                                var pts = driving.getResults().getPlan(0).getRoute(0).getPath();
                                var sl = pts.length;
                                var result = [];
                                for (var i in pts) {
                                    result.push(pts[i].lng + "," + pts[i].lat + ",");
                                    var point = new BMap.Point(pts[i].lng, pts[i].lat);
                                    var marker = new BMap.Marker(point); // 创建标注   
                                    map.addOverlay(marker); // 将标注添加到地图中
                                }
                                console.log("point:" + "(" + sl + ")" + result.join(''));
                                startDownload("point:" + "(" + sl + ")" + result.join(''), "lnglat.txt");
                            }
                        }
                    });
                    driving.search(point2, point1);
                }
                var newlonandlat1 = getLonAndLat(lon, lat, 45, 5000);
                var newlonandlat2 = getLonAndLat(lon, lat, 135, 5000);
                var newlonandlat3 = getLonAndLat(lon, lat, 225, 5000);
                var newlonandlat4 = getLonAndLat(lon, lat, 315, 5000);


                var arr = [5, 20, 35, 50, 65, 80, 95, 110, 125, 140, 155, 170, 185, 200, 215, 230, 245, 260, 275, 290, 305, 320,
                    335, 350, 360, 375
                ];


                var str = newlonandlat2.lon + "," + newlonandlat2.lat + ";" + newlonandlat2.lon + "," + newlonandlat2.lat + ";" +
                    newlonandlat1.lon + "," + newlonandlat1.lat + ";" + newlonandlat1.lon + "," + newlonandlat1.lat + ";" +
                    newlonandlat4.lon + "," + newlonandlat4.lat + ";" + newlonandlat4.lon + "," + newlonandlat4.lat + ";" +
                    newlonandlat3.lon + "," + newlonandlat3.lat + ";" + newlonandlat3.lon + "," + newlonandlat3.lat

                console.log("顶顶顶顶顶顶顶顶顶顶")
                console.log(str)
                var pointArray = [];
                var ply = new BMap.Polygon(
                    str, {
                        strokeWeight: 2,
                        strokeColor: "blue"
                    }); //建立多边形覆盖物
                map.addOverlay(ply); //添加覆盖物
                pointArray = pointArray.concat(ply.getPath());
                map.setViewport(pointArray); //调整视野

                var oneLon = newlonandlat2.lon;
                var oneLat = newlonandlat2.lat;
                var twoLon = newlonandlat3.lon;
                var twoLat = newlonandlat3.lat;
                //oneLon:第一个点的经度;oneLat:第一个点的纬度;twoLon:第二个点的经度;twoLat:第二个点的纬度;
                var distance = 10;



                console.log("dd打")
                var lonAndlats = [];
                for (var i = 1; i <= 5; i++) {
                    lonAndlats.push(getLonAndLat(newlonandlat1.lon, newlonandlat1.lat, 270, i + "000"))
                    lonAndlats.push(getLonAndLat(newlonandlat2.lon, newlonandlat2.lat, 360, i + "000"))
                    lonAndlats.push(getLonAndLat(newlonandlat3.lon, newlonandlat3.lat, 90, i + "000"))
                    lonAndlats.push(getLonAndLat(newlonandlat4.lon, newlonandlat4.lat, 180, i + "000"))
                }

                var new_arr = [];
                for (var i = 0; i < 5; i++) {
                    // 判断如果数组还有可以取出的元素,以防下标越界
                    if (lonAndlats.length > 0) {
                        // 在数组中产生一个随机索引
                        var arrIndex = Math.floor(Math.random() * lonAndlats.length);
                        // 将此随机索引的对应数组元素值复制出来
                        new_arr[i] = lonAndlats[arrIndex];
                        // 然后删掉此索引的数组元素,这时候lonAndlats变为新的数组
                        lonAndlats.splice(arrIndex, 1)
                    } else {
                        // 数组中数据项取完后,退出循环,
                        break;
                    }
                }
                for (var i = 0; i < new_arr.length; i++) {
                    autoMap(new_arr[i].lon, new_arr[i].lat);
                }
                var circle = new BMap.Circle(new BMap.Point(lon, lat), 2500, {
                    strokeColor: 'blue', //颜色
                    strokeWeight: 2, //宽度
                    strokeOpacity: 0.5 //透明度
                });
                map.addOverlay(circle);
            }

            function getLonAndLat(lon, lat, brng, dist) {
                //大地坐标系资料WGS-84 极坐标长半径a=6378137 极坐标短半径b=6356752.3142 扁率f=1/298.2572236
                var a = 6378137;
                var b = 6356752.3142;
                var f = 1 / 298.257223563;
                var lon1 = lon * 1;
                var lat1 = lat * 1;
                var s = dist;
                var alpha1 = mapNumberUtil.rad(brng);
                var sinAlpha1 = Math.sin(alpha1);
                var cosAlpha1 = Math.cos(alpha1);
                var tanU1 = (1 - f) * Math.tan(mapNumberUtil.rad(lat1));
                var cosU1 = 1 / Math.sqrt((1 + tanU1 * tanU1)),
                    sinU1 = tanU1 * cosU1;
                var sigma1 = Math.atan2(tanU1, cosAlpha1);
                var sinAlpha = cosU1 * sinAlpha1;
                var cosSqAlpha = 1 - sinAlpha * sinAlpha;
                var uSq = cosSqAlpha * (a * a - b * b) / (b * b);
                var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));
                var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));
                var sigma = s / (b * A),
                    sigmaP = 2 * Math.PI;
                while (Math.abs(sigma - sigmaP) > 1e-12) {
                    var cos2SigmaM = Math.cos(2 * sigma1 + sigma);
                    var sinSigma = Math.sin(sigma);
                    var cosSigma = Math.cos(sigma);
                    var deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM) - B /
                        6 * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * cos2SigmaM * cos2SigmaM)));
                    sigmaP = sigma;
                    sigma = s / (b * A) + deltaSigma;
                }
                var tmp = sinU1 * sinSigma - cosU1 * cosSigma * cosAlpha1;
                var lat2 = Math.atan2(sinU1 * cosSigma + cosU1 * sinSigma * cosAlpha1, (1 - f) * Math.sqrt(sinAlpha * sinAlpha +
                    tmp * tmp));
                var lambda = Math.atan2(sinSigma * sinAlpha1, cosU1 * cosSigma - sinU1 * sinSigma * cosAlpha1);
                var C = f / 16 * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha));
                var L = lambda - (1 - C) * f * sinAlpha * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 *
                    cos2SigmaM * cos2SigmaM)));
                var revAz = Math.atan2(sinAlpha, -tmp); // final bearing
                var lonLatObj = {
                    lon: lon1 + mapNumberUtil.deg(L),
                    lat: mapNumberUtil.deg(lat2)
                }
                return lonLatObj;
            }
        </script>
    </body>
</html>
View Code