F24fee01af0668d6570f0faf1c5798a8
Cesium项目实战(7)-路径规划-集成百度、高德、腾讯地图路径规划服务(百度篇)

路径规划是运动规划的主要研究内容之一。运动规划由路径规划和轨迹规划组成,连接起点位置和终点位置的序列点或曲线称之为路径,构成路径的策略称之为路径规划。
路径规划在很多领域都具有广泛的应用。在高新科技领域的应用有:机器人的自主无碰行动;无人机的避障突防飞行;巡航导弹躲避雷达搜索、防反弹袭击、完成突防爆破任务等。在日常生活领域的应用有:GPS导航;基于GIS系统的道路规划;城市道路网规划导航等。在决策管理领域的应用有:物流管理中的车辆问题(VRP)及类似的资源管理资源配置问题。通信技术领域的路由问题等。凡是可拓扑为点线网络的规划问题基本上都可以采用路径规划的方法解决。(摘抄百度百科)

路径规划系列文章:路径规划之百度篇 路径规划之高德篇 路径规划之腾讯篇

路径规划技术路线的基本思路

  1. 搭建路网分析服务器,获取实时路网数据,方向、车速、时间等等权重,整合数据,发布服务,典型的有ArcGIS的network服务,SuperMap的交通服务。
  2. 使用在线的路径规划服务,例如:百度地图路径规划服务API、高德地图路径规划服务API、腾讯地图路径规划路径规划服务API。需要按照API接口传入参数,自定义显示结果。
  3. 当然还可以自己根据路网数据,编写路径规划算法,参考 浅谈路径规划算法 等文章。

笔者采用第2种方式来处理,需要处理,BD09、GCJ02、WGS84坐标系的转换问题,结果数据解析,自定义显示。

从本文开始,连续3篇文章,分别介绍百度地图、高德地图、以及腾讯地图的路径规划服务API在Cesium中的集成显示。

在集成前,需要了解的一些东西:

  1. 由于Cesium采用的是WGS84坐标系,百度地图相关的坐标需要进行转换,关于百度坐标的转换算法,可以参考百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换(JS版代码)
  2. 百度地图提供的路径规划文档地址:打开链接
  3. 百度地图提供的相关接口:

效果图:



具体集成步骤

1、定义有关参数

var startPoint = null; // 起点坐标
var endPoint = null; // 终点坐标
var startMarker = null; // 起点对应绘制的entity
var endMarker = null; // 终点对应绘制的entity
var dataSource = "baidu"; // 定义数据源
var method = "driving"; // 定义路径规划方式

2、采集起点、终点

// 点击获取坐标点
function getPickPosition(callback) {
  // 注册点击事件
  viewer.screenSpaceEventHandler.setInputAction((clickEvent) => {
    // 拾取坐标点
    var position = viewer.scene.globe.pick(viewer.camera.getPickRay(clickEvent.position), viewer.scene);
    position = Cesium.Cartographic.fromCartesian(position);
    // 转换为经纬度
    position = Cesium.Math.toDegrees(position.longitude) + "," + Cesium.Math.toDegrees(position.latitude);
    // 取消点击事件
    viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
    // 执行回调,返回position
    callback(position);
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}

// 根据坐标位置绘制entity
function addPositionMarker(position, imageUrl) {
  return viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(parseFloat(position.split(',')[0]), parseFloat(position.split(',')[1])),
    billboard: {
      image: imageUrl,
      scale: 0.5,
      verticalOrigin: Cesium.VerticalOrigin.BOTTOM
    }
  });
}

设置起点按钮和设置终点按钮对应的函数分为是:
```
function setStartLocation() {
getPickPosition((position) => {
startPoint = position;

top Created with Sketch.