高德地图路径规划功能

在基于 Vue 和高德地图开发地理信息系统时,除了基础的地图展示和标点功能,路径规划是一个常见的扩展需求。本文将结合实际项目场景,分享如何在现有组件中快速集成高德地图的驾车路线规划功能。

一、功能需求与实现思路

需求背景

原有组件已实现地图加载、用户足迹标记和弹窗展示。现在需要新增驾车路线规划功能,支持:

  • 通过点击地图标记点或地图任意位置设置起点 / 终点
  • 显示详细的路线信息(距离、时间、转向指引等)
  • 支持路径清除和重新规划

核心思路

  1. 插件引入:使用高德地图 JavaScript API 中的AMap.Driving插件实现路线计算
  2. 交互设计:通过按钮切换起点 / 终点设置模式,点击地图触发点位选择
  3. 状态管理:使用 Vue 响应式变量跟踪起点 / 终点状态、规划结果
  4. UI 扩展:新增路径规划控制栏

二、关键代码实现步骤

1. 新增路径规划控制栏

在原有搜索栏下方添加操作按钮,通过动态样式反馈当前模式:

<!-- 路径规划控制区域 -->
      <a-form style="height: 50px; margin-top: 10px">
        <a-flex>
          <div style="width: 150px; font-size: 20px">路径规划:</div>
          <a-form-item>
            <a-space>
              <a-button
                :style="{
                  'border-radius': '0',
                  'width': '80px',
                  'height': '40px',
                  'padding': '4px',
                  'background': startPoint ? '#21b47c' : '#ffffff',
                  'color': startPoint ? '#ffffff' : '#000000'
                }"
                @click="setMode('start')"
                >起点</a-button
              >
              <a-button
                :style="{
                  'border-radius': '0',
                  'width': '80px',
                  'height': '40px',
                  'padding': '4px',
                  'background': endPoint ? '#21b47c' : '#ffffff',
                  'color': endPoint ? '#ffffff' : '#000000'
                }"
                @click="setMode('end')"
                >终点</a-button
              >
              <a-button
                style="
                  border-radius: 0;
                  width: 80px;
                  height: 40px;
                  padding: 4px;
                  background: #21b47c;
                  color: #ffffff;
                "
                @click="showRoute"
                :disabled="!startPoint || !endPoint"
                >显示路径</a-button
              >
              <a-button
                style="border-radius: 0; width: 80px; height: 40px; padding: 4px"
                @click="clearRoute"
                >清除路径</a-button
              >
            </a-space>
          </a-form-item>
          <div style="font-size: 16px; color: #21b47c; margin-left: 20px;">
            {{ routeStatus }}
          </div>
        </a-flex>
      </a-form>

2. 初始化路径规划插件

在地图初始化时加载AMap.Driving插件,并绑定点击事件处理点位选择:

const initMap = async () => {
  // ... 原有地图初始化代码 ...
  
  // 初始化驾车导航插件
  driving.value = new AMap.Driving({
    map: mapInstance.value, // 绑定地图实例
    panel: 'panel' // 绑定路线详情面板
  });

  // 地图点击事件:设置起点/终点
  mapInstance.value.on('click', (e) => {
    if (currentMode.value === 'start') {
      startPoint.value = e.lnglat;
      drawPointMarker(startPoint.value, 'start'); // 绘制起点标记
      routeStatus.value = '起点已设置,选择终点';
      currentMode.value = null;
    } else if (currentMode.value === 'end') {
      endPoint.value = e.lnglat;
      drawPointMarker(endPoint.value, 'end'); // 绘制终点标记
      routeStatus.value = '终点已设置,点击计算路线';
      currentMode.value = null;
    }
  });
};

3. 点位标记与样式优化

使用不同图标区分起点 / 终点,并支持点击足迹标记快速设置点位:

// 绘制起点/终点标记
const drawPointMarker = (position, type) => {
  // 清除之前的标记
  const markers = mapInstance.value.getAllOverlays('marker')
  markers.forEach(marker => {
    if (marker.getExtData() === type) {
      marker.setMap(null)
    }
  })
  
  // 创建新标记
  const marker = new AMap.Marker({
    position: position,
    icon: type === 'start' 
      ? 'https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png' 
      : 'https://webapi.amap.com/theme/v1.3/markers/n/mark_r.png',
    extData: type // 存储标记类型
  })
  
  marker.setMap(mapInstance.value)
}


const markPoints = (map) => {
  mapData.value.forEach((item) => {
    const marker = new AMap.Marker({
      position: new AMap.LngLat(item.longitude, item.latitude)
    })
    map.add(marker)

    marker.on('click', (e) => {
      setInfoWindows(map, e, item, true)
      
      // 如果处于设置起点或终点的模式下,使用该点作为起点或终点
      if (currentMode.value === 'start') {
        startPoint.value = new AMap.LngLat(item.longitude, item.latitude)
        routeStatus.value = '起点已设置,现在请选择终点'
        currentMode.value = null
        drawPointMarker(startPoint.value, 'start')
      } else if (currentMode.value === 'end') {
        endPoint.value = new AMap.LngLat(item.longitude, item.latitude)
        routeStatus.value = '终点已设置,点击"显示路径"按钮查看路线'
        currentMode.value = null
        drawPointMarker(endPoint.value, 'end')
      }
    })
  })
}


// 设置当前模式(起点或终点)
const setMode = (mode) => {
  currentMode.value = mode
  if (mode === 'start') {
    routeStatus.value = '请选择起点位置'
  } else {
    routeStatus.value = '请选择终点位置'
  }
}

4. 路线计算与清除逻辑

核心业务逻辑封装在showRouteclearRoute方法中:

// 显示路径
const showRoute = () => {
  if (!startPoint.value || !endPoint.value) {
    message.error('请先设置起点和终点')
    return
  }
  
  // 调用驾车导航服务
  driving.value.search(startPoint.value, endPoint.value, function(status, result) {
    if (status === 'complete') {
      routeStatus.value = '路径规划完成'
      console.log('路径规划结果:', result)
    } else {
      routeStatus.value = '路径规划失败'
      console.error('获取驾车数据失败:', result)
      message.error('路径规划失败,请重试')
    }
  })
}

// 清除路径
const clearRoute = () => {
  // 清除路径显示
  driving.value.clear()
  
  // 清除起点和终点标记
  const markers = mapInstance.value.getAllOverlays('marker')
  markers.forEach(marker => {
    if (marker.getExtData() === 'start' || marker.getExtData() === 'end') {
      marker.setMap(null)
    }
  })
  
  // 重置状态
  startPoint.value = null
  endPoint.value = null
  currentMode.value = null
  routeStatus.value = '请选择起点和终点'
}

三、功能优化与注意事项

1. 交互体验优化

  • 动态样式反馈:通过按钮颜色变化提示当前操作模式(选择起点 / 终点)
  • 点位复用:点击已有足迹标记可直接作为起点 / 终点,提升操作效率
  • 面板控制:通过#panel容器显示路线详情,支持滚动查看长内容

2. 性能与资源管理

  • 地图销毁:在组件卸载时调用mapInstance.value.destroy()释放内存
  • 插件按需加载:仅在需要时加载AMap.Driving插件(可结合 Vue 异步组件实现)

四、最终效果展示

通过以上步骤,我们在 Vue 组件中成功集成了高德地图的路径规划功能。该方案支持灵活的点位选择、实时路线计算和详细信息展示,可直接应用于出行导航、物流追踪等场景。实际开发中可根据业务需求扩展步行 / 公交规划(替换AMap.Walking/AMap.Transit插件)或自定义路线样式。

本文内容基于个人博客优化:
高德地图 API 配置指南:地图初始化与标点弹窗开发全流程_高德api-CSDN博客

路径API参考:
概述-地图 JS API 2.0 | 高德地图API

注意:具体的详细信息展示(路径详情面板、各阶段时间等)可自行添加和完善!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值