openlayers+高德地图实现路径规划

261 阅读2分钟

Demo样例

  1. 新建map.html文件
<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>高德路径规划demo</title>
    <!-- <link rel="stylesheet" href="https://openlayers.org/en/v4.5.0/css/ol.css" type="text/css"> -->
    <!-- <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" type="text/css"> -->
    <style type="text/css"></style>
</head>
<body style="margin:0 0 0 0; padding:0 0 0 0;">
    <div><a id="start" href="#">设置起点</a> <a id="end" href="#">设置终点</a> <a id="clear" href="#">清除路径</a></div>
    <div id="map" style="width: 1000px;height:1000px"></div>
    <script src="https://cdn.jsdelivr.net/npm/ol@v9.2.0/dist/ol.js"></script>
    <!-- <script src="./static/jquery-3.2.1.min.js"></script> -->
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script type="text/javascript">
        var result = 0;
        var start;
        var end;
        var name;
        var projection = ol.proj.get("EPSG:4326");
        function getNavmapLayer() {
            return new ol.layer.Tile({
                source: new ol.source.XYZ({
                    url: 'http://webrd01.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8'//7,8
                }),
                projection: projection
            });
        }
        var navlayer = getNavmapLayer();
        var map = new ol.Map({
            target: document.getElementById("map"),
            layers: [
                navlayer
            ],
            view: new ol.View({
                center: [115.46, 37.92],
                projection: 'EPSG:4326',
                zoom: 7
            })
        });
        var menu_overlay = new ol.Overlay({
            element: document.getElementById("contextmenu_container"),
            positioning: 'center-center'
        });
        menu_overlay.setMap(map);
        //矢量图层数据源
        sourceVector = new ol.source.Vector();
        //矢量图层
        var vector = new ol.layer.Vector({
            source: sourceVector,
            style: function (feature) {
                var status = feature.get("status");
                
                
                var _color = "#8f8f8f";
                if (status === "拥堵") _color = "#e20000";
                else if (status === "缓行") _color = "#ff7324";
                else if (status === "畅通") _color = "#00b514";

                return new ol.style.Style({
                    stroke: new ol.style.Stroke({
                        color: _color,
                        width: 5,
                        lineDash:[10, 8]
                    }),
                })
            }
        });
        map.addLayer(vector);
        //菜单栏点击事件
        $("#start").click(function () {
            result = 1;
        });
        $("#end").click(function () {
            result = 2;
        });
        $("#clear").click(function () {
            result = 0;
            start = "";
            end = "";
            name = "";
            sourceVector.clear();
        });
        //地图点击事件
        map.on("click", function (evt) {
            //获取坐标
            var coordate = evt.coordinate;
            console.log(evt.coordinate);
            console.log(coordate);
            //如果result为0,返回不做任何操作
            if (result == 0) {
                return;
            }
            else {
                if (result == 1) {
                    //起点
                    //构造提交api起点坐标
                    start = GetCoordate(coordate);
                    console.log("起点" + start);
                    name = "起点";
                    //矢量元素
                        var featureStart = new ol.Feature({
                            geometry: new ol.geom.Point(coordate),
                            name: '起点',//自定义属性

                        });
                        featureStart.setStyle(createFeatureStyle(featureStart,name));
                    sourceVector.addFeature(featureStart);
                }
                else {
                    //终点
                    //构造提交api终点坐标
                    name = "终点";
                    end = GetCoordate(coordate);
                    console.log("终点" + end);
                    //矢量元素
                    var featureEnd = new ol.Feature({
                        geometry: new ol.geom.Point(coordate),
                        name: '终点',//自定义属性

                    });
                    featureEnd.setStyle(createFeatureStyle(featureEnd,name));
                    sourceVector.addFeature(featureEnd);
                    ////请求数据
                    getRouteResult(start, end);
                }
            }
        });
        //获取路径规划
        function getRouteResult(start, end) {
            var data = {
                key: "",//申请的key值
                origin: start,//起点
                destination: end,//终点
                extensions:"all"
            };
            $.ajax({
                url: "https://restapi.amap.com/v3/direction/driving?",
                type: "post",
                dataType: "jsonp",
                data: data,
                success: function (result) {
                    console.log(result);
                    var routes = result["route"]["paths"][0];
                    console.log(routes);
                    //console.log(routes);
                    var steps = routes["steps"];
                    //console.log(steps);
                    for (var i = 0; i < steps.length; i++) {                       
                        var route = steps[i];
                        var path = route["tmcs"];
                        for (var k = 0; k < path.length; k++) {
                            var routePath = path[k];                           
                            var distance = routePath["distance"];
                            var polyline = routePath["polyline"].toString().split(";");
                            var status = routePath["status"];
                            var polylineData = [];
                            for (var j = 0; j < polyline.length; j++) {
                                //将字符串拆成数组
                                var realData = polyline[j].split(",");
                                var coordinate = [realData[0], realData[1]];
                                polylineData.push(coordinate);
                                //要素属性
                            }
                            var attribute = {
                                distance: distance,
                            };
                            //线此处注意一定要是坐标数组
                            var plygon = new ol.geom.LineString(polylineData);
                            //线要素类
                            var feature = new ol.Feature({
                                geometry: plygon,
                                attr: attribute,
                                status: status
                            });
                            sourceVector.addFeature(feature);                         
                        }
                    }
                }
            });
        };
        //保存小数点后六位
        function GetCoordate(coordate) {
            var lng = coordate[0].toString();
            var lat = coordate[1].toString();
            var lngIndex = lng.indexOf(".") + 7;
            var latIndex = lat.indexOf(".") + 7;
            lng = lng.substring(0, lngIndex);
            lat = lat.substring(0, latIndex);
            var str = lng + "," + lat;
            console.log(str.toString());
            return str;
        }
        //样式函数
        var createFeatureStyle = function (feature, name) {
            var url;
            if (name==null) {
                url = "https://pic.616pic.com/ys_img/00/13/15/8ECQqFB3cV.jpg";
            }
            else {
                if (name=="起点") {
                    url = "https://pic.616pic.com/ys_img/00/13/15/8ECQqFB3cV.jpg";
                }
                else {
                    url = "https://bpic.588ku.com/element_pic/00/16/10/22580b15f5ca95d.jpg";
                }
            }
            return new ol.style.Style({
                image: new ol.style.Icon(/** @type {olx.style.IconOptions} */({
                    anchor: [0.5, 60],
                    anchorOrigin: 'top-right',
                    anchorXUnits: 'fraction',
                    anchorYUnits: 'pixels',
                    offsetOrigin: 'top-right',
                    offset: [0, 10],//偏移量设置
                    scale: 0.2,  //图标缩放比例
                    opacity: 0.75,  //透明度
                    src: url, //图标的url
                    
                })),
            });

        }
        $(map.getViewport()).on("contextmenu", function (e) {
            e.preventDefault();
            var coordinate = map.getEventCoordinate(e);
            menu_overlay.setPosition(coordinate);
        });
        $(map.getViewport()).on("click", function (e) {
            e.preventDefault();
            menu_overlay.setPosition(undefined);
        });
    </script>
</body>
</html>
  1. 双击打开map.html即可实现一个简单的map路径规划功能

踩坑点:高德地图需要注册秘钥才能使用

  1. 登陆高德地图api(路径规划 2.0-基础 API 文档-开发指南-Web服务 API | 高德地图API (amap.com)

image.png 2. 点击【控制台】-【应用管理】-【我的应用】-【创建新应用】申请秘钥 3. 申请到秘钥后,将秘钥填入html文件中

image.png