使用高德地图API实现web端路径规划

这是我学习webgis 时跟着教程做的一点小实验,全部代码如下,可以运行,只要申请了高德地图key和密钥即可。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <title>Title</title>
    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css"/>
</head>
<script type="text/javascript">
    window._AMapSecurityConfig = {
        securityJsCode: '填写您申请的高德安全密钥',
    }
</script>
<script type="text/javascript"
        src="https://webapi.amap.com/maps?v=1.4.15&key=填写您申请的高德地图key"></script>
<style>
    * {
        margin: 0;
        padding: 0;
    }
    body,
    html,
    #container {
        width: 100%;
        height: 100%;
    }
    #as {
        position: absolute;
        top: 10px;
        left: 10px;
        z-index: 1;
    }
    div > ul > li {
        float: left; /*使用组合选择器定位到第一级ul下一级的li,使其左浮动*/
    }
    li {
        list-style: none; /*所有的项目都取消标记*/
    }
    li > ul {
        display: none; /*使用组合选择器定位到li下一级的ul,使其隐藏*/
    }
    li:hover ul { /*使用伪类选择器设置悬停在li上面时显示ul*/
        display: block;
    }
    .a {
        text-decoration: none;
        display: block;
        font-size: 15px;
        padding: 5px;
        text-align: center;
        color: yellowgreen;
        background-color: gray;
        cursor: pointer;
    }
    .a:hover { /*使用伪类选择器设置悬停在a上面时修改a的显示样式*/
        color: papayawhip;
    }
</style>
<body>
<div id="as">
    <ul>
        <li><a id='t' class="a" onclick="tj()">添加图层</a>
        </li>
        <li><a class="a" onclick="clearMarker()">删除点标记</a>
        </li>
        <li><a class="a">路线规划方式</a>
            <ul>
                <li><a class="a" onclick="qtz()" style="font-size: 15px" title="先选起点,再选停靠点,最后选终点">起-停-终</a></li>
                <li><a class="a" onclick="qzt()" style="font-size: 15px" title="先选择起点和终点,再选停靠点">起-终-停</a></li>
            </ul>
        </li>
        <li><a class="a">路线生成</a>
            <ul>
                <li><a class="a" onclick="dh()" style="font-size: 15px">生成路线</a></li>
            </ul>
        </li>
    </ul>
</div>
<div id="container"></div>
</body>
</html>
<script>
    //添加比例尺和罗盘插件
    AMap.plugin(['AMap.Scale', 'AMap.ControlBar', 'AMap.MoveAnimation'],
        function () {
            map.addControl(new AMap.Scale());
            map.addControl(new AMap.ControlBar());
        });
    //设置主视图
    var map = new AMap.Map('container', {
        zoom: 11,//级别
        viewMode: '3D',
        pitch: 45,
        center: [116.379028, 39.865042],//中心点坐标
    });
    let markers = [];//用来存放点标注
    let info = [];//用来保存点击标注产生的信息窗口
    let geojson = new AMap.GeoJSON({
        geojson: null,
    });
    //点击地图生成点标记
    map.on('click', function (e) {
        let marker = new AMap.Marker({
            draggable: true,
            position: e.lnglat,//位置
            extData: {//自定义属性
                _geoJsonProperties: {
                    id: markers.length + 1,/*点标记的唯一识别码*/
                    click: 0,/*点标记的点击次数*/
                },
            },
        });
        markers.push(marker);//创建一个点就加进去
        geojson.addOverlay(marker);/*将一个点标记放到geojson中转站中*/
        saveData(geojson.toGeoJSON());/*将geojson中转站内的标记全部保存到标准geoJSON数据*/
        //点击点标记显示打卡次数
        marker.on('click', function (e) {/*点击事件*/
            let i = ++marker.getExtData()._geoJsonProperties.click;/*在某标签上点击一次对应的click加一次*/
            info = new AMap.InfoWindow({
                anchor: 'top-center',
                content: `<div>${markers.indexOf(marker) + 1}打卡了${i}次</div>`
            })
            info.open(map, marker.getPosition());
            saveData(geojson.toGeoJSON());/*将geojson中转站内的标记全部保存到标准geoJSON数据*/
        })
    });
    //生成轨迹动画
    let opts = {
        waypoints: [],
    }
    let start = [];
    let end = [];
    //路线规划方法起点-停靠点-终点
    function qtz() {
        geojson.eachOverlay(function (item) {
            //遍历geojson得到每一个点的坐标
            opts.waypoints.push(item.getPosition());
        })
        start = opts.waypoints.shift();//删除数组最前面的对象,且返回该对象作为起点
        end = opts.waypoints.pop();//删除数组最后面的对象,且返回该对象作为终点
    }
    //路线规划方法起点-终点-停靠点
    function qzt() {
        geojson.eachOverlay(function (item) {
            //遍历geojson得到每一个地图上点的坐标
            opts.waypoints.push(item.getPosition());
        })
        start = opts.waypoints.shift();//删除数组最前面的对象,且返回该对象作为起点
        end = opts.waypoints.shift();//删除目前数组最前面的对象,且返回该对象作为终点
        // 这时候opts中的数组对象只剩下中间点了
    }
    function dh() {
        //如果判断到起点为0,则没有选择路线规划方法
        if (start.length == 0) {
            alert("请先选择路线规划方式!!!!");
        }
        //调用高德路线规划插件
        AMap.plugin('AMap.Driving', function () {
            let drivng = new AMap.Driving({
                map: map,
                //驾车测策
                policy: AMap.DrivingPolicy.LEAST_TIME,
            })
            //设置规划路线方法,参数分别为起点,终点,中途点
            drivng.search(start, end, opts, function (a, b) {
                console.log(b);
                //
                var lineArr = [];
                console.log(b.routes[0].steps);
                //设置路线的样式
                var passedPolyline = new AMap.Polyline({
                    map: map,
                    strokeColor: "#AF5",  //线颜色
                    strokeWeight: 6,      //线宽
                });
            })
        })
    }
    function clearMarker() {
        AMap.GeoJSON();//中转站清空,这样下次新生成的点标注就不会把之前中转站的旧数据存入JSON中
        map.remove(markers);//移除所有标记
        markers = [];//将数组清空
        map.remove(info);//打卡信息框删除
        localStorage.clear();/*清除所有已经保存的JSON字符串*/
    }
    map.add(geojson);
    if (JSON.stringify(getData()) != '[]') {
        //导入数据
        geojson.importData(getData());
        //恢复旧数据的点击事件
        geojson.eachOverlay(function (item) {
            item.on('click', function (e) {
                let i = ++item.getExtData()._geoJsonProperties.click;/*在某标签上点击一次对应的click加一次*/
                let info = new AMap.InfoWindow({
                    anchor: 'top-center',
                    content: `<div>${markers.indexOf(marker) + 1}打卡了${i}次</div>`
                })
                info.open(map, item.getPosition());
                saveData(geojson.toGeoJSON());/*将点标签内的新属性转换到标准geoJSON数据*/
            });
        })
    }
    //在localstorage中操作数据
    function getData() {
        if (!localStorage.getItem('geojson')) {
            localStorage.setItem('geojson', '[]');/*如果不存在数据则返回js空对象*/
        }
        return JSON.parse(localStorage.getItem('geojson'));
    }
    function saveData(data) {/*保存JSON字符串*/
        localStorage.setItem('geojson', JSON.stringify(data));/*保存为JSON字符串*/
    }
    //引入新图层
    let ss = new AMap.TileLayer.Traffic({
        zIndex: 10,
        autoRefresh: true,
        interval: 180,
    });
    //添加移除图层
    let f = true;
    function tj() {
        if (f) {
            map.add(ss);
            document.querySelector("#t").innerText = '移除图层';
            f = false;
        } else {
            map.remove(ss);
            document.querySelector("#t").innerText = '添加图层';
            f = true;
        }
    }
</script>

  • 5
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
高德地图API提供了多种路径规划服务,包括驾车路径规划、步行路径规划、公交路径规划、骑行路径规划等。其中,驾车路径规划是应用最广泛的一种规划方式。下面以驾车路径规划为例,介绍一下如何使用高德地图API进行路径规划。 1. 准备工作 首先,需要在高德开放平台上注册账号,并创建应用。创建应用后,可以获取到一个应用Key,用于调用API。 2. 发送请求 使用高德地图API进行路径规划,需要向以下接口发送请求: ``` https://restapi.amap.com/v3/direction/driving ``` 其中,`direction/driving`表示进行驾车路径规划。 在请求中需要包含以下参数: - `key`:应用Key,用于身份验证。 - `origin`:起点坐标,格式为“经度,纬度”。 - `destination`:终点坐标,格式为“经度,纬度”。 例如,下面是一个请求示例: ``` https://restapi.amap.com/v3/direction/driving?key=yourkey&origin=116.481028,39.989643&destination=116.434446,39.90816 ``` 3. 处理响应 发送请求后,会得到一个JSON格式的响应。响应中包含了路径规划的结果,包括路线、路况、收费等信息。可以根据需要对响应进行解析,提取需要的信息。 以下是一个响应的示例: ```json { "status": "1", "info": "OK", "infocode": "10000", "count": "1", "route": { "origin": "116.481028,39.989643", "destination": "116.434446,39.90816", "taxi_cost": "34.7", "paths": [ { "distance": "11433", "duration": "2335", "strategy": "速度优先", "tolls": "0", "toll_distance": "0", "steps": [ { "instruction": "从“清华大学(东门)”发,沿“清华东路”向南行驶40米左右,右转进入“清华东路”。", "orientation": "南", "road": "清华东路", "distance": "101", "duration": "43", "polyline": "116.481846,39.989564;116.481822,39.989425;116.481784,39.989302;116.481724,39.98922;116.481601,39.989177;116.481479,39.989167;116.481357,39.989175;116.481233,39.9892;116.48112,39.989239;116.481014,39.98929;116.48091,39.989355;116.480807,39.989423;116.480703,39.989498;116.480599,39.989576;116.4805,39.989655;116.480396,39.98973;116.480288,39.98979;116.480181,39.989834;116.48007,39.989868", "action": "右转", "assistant_action": "进入", "cities": [], "road_inter": "清华东路", "tmcs": [] }, ... ] } ] } } ``` 以上就是使用高德地图API进行驾车路径规划的基本方法。其他类型的路径规划也可以按照类似的方法进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要随地大便

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值