如何使用高德地图 API 做一个路线规划应用,展示自定义路线

如何使用高德地图 API 做一个路线规划应用,展示自定义路线

喜欢骑车转,知道一些比较好的路线,想要分享给别人的时候不知道该怎么分享,有自定义路线的功能就好了。前不久高德推出了手机端的自定义路线功能。

其实 web API 可以实现很具体的路线规则,使用 Amap.DragRoute

看例子:

路线推荐: 彩西路
http://kylebing.cn/tools/map/#/route/route-line?lineId=8

在这里插入图片描述

前提:

新版 Web API JS 需要你设置一下密钥才能正常使用路径功能,参见官方文档:

https://lbs.amap.com/api/javascript-api-v2/guide/abc/jscode

官方 DragRoute 的说明

关于路线规则的说明,官方如下,我们主要使用其中的 途经点 功能

https://lbs.amap.com/api/jsapi-v2/guide/services/navigation

粗略的代码是这样的:

export default {
    
    data(){
        return {
            activeLineObj:  {
                index: 1,
                name: '金刚纂路',
                area: '南部山区',
                note: '金刚纂路是一条比较曲折的山路,平坦,注意拐弯不可见的地方鸣笛示意',
                roadType: '柏油路',
                months: '春,夏,秋',
                videoLink: 'https://www.bilibili.com/video/BV1dB4y1M7fc/',
                paths: [
                    {position: [117.111285, 36.658996], name: '奥体西', note: ''},
                    {position: [117.119066, 36.647191], name: '龙洞立交桥', note: ''},
                    {position: [117.136836, 36.646152], name: '龙洞隧道', note: ''},
                    {position: [117.166971, 36.647804], name: '旅游路', note: ''},
                    {position: [117.177737, 36.639391], name: '港九路', note: ''},
                    {position: [117.178289, 36.623558], name: '滩九线', note: ''},
                    {position: [117.179607, 36.576843], name: '金刚纂路开始', note: ''},
                    {position: [117.1682, 36.547592], name: '南山牧场', note: '这段路最高的地方,峰顶'},
                    {position: [117.164123, 36.529662], name: '潘洪路起点', note: '另一条不错路线的开始'},
                    {position: [117.166935, 36.515995], name: '村庄', note: '路边很多卖水果的,|很多采摘的地方,|5-6 月份有樱桃,|之后有杏什么的'},
                    {position: [117.152763, 36.505393], name: '金刚纂路结束', note: '小桥'},
                ]
            },
        }
    },
    
    
    mounted() {
        this.loadLine(this.map, this.activeLineObj)
    },
    
    methods: {
        // 载入路线信息
        loadLine(map, line) {

            // path 是驾车导航的起、途径和终点,官方建议最多旋转 16 个途经点,以保证良好使用体验
            // 取出路径中的所有点
            let path = line.paths.map (item => item.position)

            let route = new AMap.DragRoute(map, path, AMap.DrivingPolicy.LEAST_FEE, {
                
                // 定义始点、结点、途经点的图标
                startMarkerOptions: {
                    offset: new AMap.Pixel(-13, -40),
                    icon: new AMap.Icon({ // 设置途经点的图标
                        size: new AMap.Size(26, 40),
                        image: ICON.start,
                        // imageOffset: new AMap.Pixel(0,0), // 图片的偏移量,在大图中取小图的时候有用
                        imageSize: new AMap.Size(26, 40) // 指定图标的大小,可以压缩图片

                    }),
                },
                endMarkerOptions: {
                    offset: new AMap.Pixel(-13, -40),
                    icon: new AMap.Icon({ // 设置途经点的图标
                        size: new AMap.Size(26, 40),
                        image: ICON.end,
                        // imageOffset: new AMap.Pixel(0,0), // 图片的偏移量,在大图中取小图的时候有用
                        imageSize: new AMap.Size(26, 40) // 指定图标的大小,可以压缩图片

                    }),
                },
                midMarkerOptions: {
                    offset: new AMap.Pixel(-5, -10),
                    icon: new AMap.Icon({ // 设置途经点的图标
                        size: new AMap.Size(15, 15),
                        image: ICON.midIcon,
                        // imageOffset: new AMap.Pixel(0,0), // 图片的偏移量,在大图中取小图的时候有用
                        imageSize: new AMap.Size(15, 15) // 指定图标的大小,可以压缩图片

                    }),
                },
            })

            // 路线规划完成后,返回的路线数据:设置距离、行驶时间
            route.on('complete', res => {
                let lineData = res.data.routes[0]
                let distance =  (lineData.distance / 1000).toFixed(1) // m -> km
                let time = (lineData.time / 60).toFixed() // second -> min
                this.$set(this.activeLineObj, 'distance', distance)
                this.$set(this.activeLineObj, 'time', time)
            })

            // 查询导航路径并开启拖拽导航
            route.search()
        },
    }
}

1、途经点坐标

首先需要有途经点的坐标数组,这里可以使用我做的这个工具来获取,官方的那个很不方便。

http://kylebing.cn/tools/map/#/tool/route

在这里插入图片描述

最终获取到这样的数据:

[
    {position: [117.111285, 36.658996], name: '奥体西', note: ''},
    {position: [117.119066, 36.647191], name: '龙洞立交桥', note: ''},
    {position: [117.136836, 36.646152], name: '龙洞隧道', note: ''},
    {position: [117.166971, 36.647804], name: '旅游路', note: ''},
    {position: [117.177737, 36.639391], name: '港九路', note: ''},
    {position: [117.178289, 36.623558], name: '滩九线', note: ''},
    {position: [117.179607, 36.576843], name: '金刚纂路开始', note: ''},
    {position: [117.1682, 36.547592], name: '南山牧场', note: '这段路最高的地方,峰顶'},
    {position: [117.164123, 36.529662], name: '潘洪路起点', note: '另一条不错路线的开始'},
    {position: [117.166935, 36.515995], name: '村庄', note: '路边很多卖水果的,|很多采摘的地方,|5-6 月份有樱桃,|之后有杏什么的'},
    {position: [117.152763, 36.505393], name: '金刚纂路结束', note: '小桥'},
]

2、需要在代码中引入 DragRoute 插件

所有的功能都是以插件的形式引入的,像比例尺、缩放按钮什么的。看官方文档,有绍介说如何引入插件

3、生成路径

let route = new AMap.DragRoute(map, path, AMap.DrivingPolicy.LEAST_FEE, {})
// map 生成的地图对象
// path 就是路径点数组
// AMap.DrivingPolicy 就是路经生成的规则,驾车规则。就近还是就最省钱,还是步行少什么的

驾车规则具体:https://lbs.amap.com/api/javascript-api/reference/route-search#m_DrivingPolicy

官方的说明如下:

在这里插入图片描述

4、获取路径的信息

这个在官方没有说明,就是路线规则好之后,关于路线的一些信息,如驾车时间,路线距离等。
这个需要监听上面生成的途经点路线的事件

route.on('complete', res => {
    // 路线规划完成后,返回的路线数据:设置距离、行驶时间
    let lineData = res.data.routes[0] // 路线数据
    let distance =  (lineData.distance / 1000).toFixed(1) // m -> km  距离 
    let time = (lineData.time / 60).toFixed() // second -> min  用时
})

5、生成各途经点的说明

根据上面 paths 中的各途经点的信息,生成地图的 Marker 标识,就成了截图中的路径的样子。

6、另外还支持的路径规划有

https://lbs.amap.com/api/javascript-api/reference/route-search
在这里插入图片描述

所有的例子都在我那个页面中

地图工具 http://kylebing.cn/tools/map

我已经将 Loca 和 路线规划、范围标记的几个页面放在了这个开源项目中,使用的时候填入自己申请的高德开发 app id:

https://github.com/KyleBing/map

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十月ooOO

许个愿,我帮你实现

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

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

打赏作者

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

抵扣说明:

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

余额充值