基于高德地图实现路径规划

1,485 阅读3分钟

需求背景:

想在地图展示页面给开车用户实现自己的路基规划,在此路径上面把 车主所需要的东西展示出来

abc.png

差不多类似这样的效果 就差把需要给用户展示的东西打点上去了

开始实施:

1: 首先你得申请一个高德地图使用api得账号 这里直接百度 就可以 很详细 然后申请成功后大概是 “https://webapi.amap.com/maps?v=1.4.14&key=你所申请得钥匙” 这样得链接放在你所需要用的地方

2: 因为你在该地图需要用到路径规划 所以 对应得高德提供得 AMap.Driving 需要在地图上面打图钉就需要对应AMap.MarkerClusterer 然后“https://webapi.amap.com/maps?v=1.4.14&key=你所申请得钥匙plugin=AMap.MarkerClusterer,AMap.Driving” 这样声明一下就行了

3:准备工作完了 就是写代码时候 首先在地图页面需要初始化地图 在html结构里面先声明一个<div id="container"></div> 这个id就是应下面地图得实例

// 首先去初始化地图展示
const map = new AMap.Map("container", {
  resizeEnable: true, // 监听地图尺寸变化
  zoom: 11, // 地图层级
  center: [121.53872956249998, 31.0863954773267], //地图中心点
});
// https://lbs.amap.com/api/javascript-api/reference/map/#MapOption 具体对象里面得值和含义见官网

初始化结束后 就要去画路线 我们声明得插件AMap.Driving就起作用了

//驾车路线规划
let driving = new this.AMap.Driving({
  // 这边路径规划的方式 LEAST_TIME:最快捷模式, LEAST_FEE:	最经济模式, LEAST_DISTANCE: 最短距离模式 REAL_TRAFFIC: 考虑实时路况
  policy: this.AMap.DrivingPolicy.LEAST_TIME,  //一般我们都是选择最快捷模式
  panel: "panel", // 这个是高德提供的路线图和UI图片 如果用panel 就需要在html 上面定一个 <div id="panel"></div>
  map: map // 对应上面声明的地图
}); 
// 具体更多的api 见 https://lbs.amap.com/api/javascript-api/reference/route-search#m_AMap.Driving

然后我们就要把经纬度什么的放进去

let startLngLat = [] // 起始的经纬度
let startLngLat = [] // 终点的经纬度
let wayPoints = []   // 沿途点的经纬度
driving.search(
  startLngLat,
  endLngLat,
  {
    waypoints: wayPoints
  },
  (status, result) => {
    // result 即是对应的驾车导航信息,相关数据结构文档请参考  https://lbs.amap.com/api/javascript-api/reference/route-search#m_DrivingResult
    if (status === "complete") {
      console.log("绘制驾车路线完成"); // 成功之后可以去调用接口把需要的沿途数据展示出来
    } else {
      console.log("获取驾车数据失败:" + result);
    }
  }
);

这样 地图规划 差不多都完成了 下面属于如何定制化自己的UI 和路线的颜色

// 这时候这边下面参数也不要了 就要一个路径规划方式
let driving = new this.AMap.Driving({
  policy: this.AMap.DrivingPolicy.LEAST_TIME,
});
// 然后再上一块代码里面加个方法
if (status === "complete") {
  this.drawRoute(result.routes[0]); 
  console.log("绘制驾车路线完成");
} else {
  console.log("获取驾车数据失败:" + result);
}
drawRoute(route) {
  let path = this.parseRouteToPath(route);
  // 起始点的样式
  let startMarker = new this.AMap.Marker({
    position: path[0],
    icon: "https://webapi.amap.com/theme/v1.3/markers/n/start.png",
    map: map
  });
  // 途径点的样式
  let waypoint = new this.AMap.Marker({
    position: { Q: 31.19281, R: 121.48872956249998, lat: 31.19281, lng: 121.48872956249998 },
    icon: "https://webapi.amap.com/theme/v1.3/markers/n/mid.png",
    map: map
  });
  // 终点的样式
  let endMarker = new this.AMap.Marker({
    position: path[path.length - 1],
    icon: "https://webapi.amap.com/theme/v1.3/markers/n/end.png",
    map: map
  });
  // 路线的样式
  // 具体api见https://lbs.amap.com/api/jsapi-v2/documentation#driving 的 AMap.Polyline
  let routeLine = new this.AMap.Polyline({
    path: path,
    isOutline: true, 
    outlineColor: "#ffeeee",
    borderWeight: 2,
    strokeWeight: 5,
    strokeColor: "#0091ff",
    lineJoin: "round"
  });
  routeLine.setMap(map); // 放在当前地图里面
  map.setFitView([startMarker, endMarker, routeLine]); // 自适应地图视野 这样地图展示会把画的路线完美展示到页面
}
  // 解析DrivingRoute对象,构造成AMap.Polyline的path参数需要的格式
  // DrivingResult对象结构参考文档 https://lbs.amap.com/api/javascript-api/reference/route-search#m_DriveRoute
  // 这个地方是把路线上的经纬度全部循环出来 这边拿到这些数据可以根据具体的业务去操作相当于的东西
  parseRouteToPath(route) {
    let path = [];
    for (let i = 0, l = route.steps.length; i < l; i++) {
      let step = route.steps[i];
      for (let j = 0, n = step.path.length; j < n; j++) {
        path.push(step.path[j]);
      }
    }
    return path;
  }

到这里自定义地图的绘制也完成了啦, 感谢高德强大的支持度

链接地址

lbs.amap.com/api/javascr…