应用场景
1. 中小型快递物流公司。快递员投递物件时,一般凭经验行走线路,没有考虑路程长短、时间长短、
是否禁止货车通行,道路阻塞等情况
2. 物流公司需要给员工发放交通补贴时,无法较为准确的评估行驶里程。
3. 各个目标客户的分布经常变化,难以较为科学的快速配送
4. 配送车辆有多有少,网点业务分布不同。配送范围有重合
需求分析
1. 考虑设置配送计算阀值条件:路程最短、时间最短、是否允许货车通行、禁左等
2. 实现里程计算、耗时计算。
3. 指定配送范围内的目标客户加入计算。
4. 根据车辆多少来分配每辆车运送的订单
5. 显示配送顺序
6. 显示具体行驶道路信息
功能实现
1. 需要网络数据集
2. 需要转向表
3. 使用Supermap Objects Java 7C组件以上版本的findVRPPath物流配送分析方法
4. 数据处理,根据具体的禁左、里程等条件,处理相关字段列
5. 地址匹配技术,需要根据中文地址得到相应的坐标信息
6. 空间分析,需要根据区域面筛选出该区域中的目标客户
7. 其他:指定时间运行分析任务、任务命名等附加条件
关键代码
/**
* 使用objects java 710beta 的导航路径分析类的findVRPPath方法实现路径分析服务
*/
@Override
public TransportationAnalystResult findVRPPath(List<Point2D> orderPointsList, List<Point2D> netPoints,List<PathPlanCar> pathPlanCars, boolean withDetail,WeightNameType weightNameType ) throws Exception {
// 1.构建一个物流配送分析参数对象
VRPAnalystParameter vrpAnalystParameter = new VRPAnalystParameter();
// 设置障碍结点 ID 列表
int[] barrierNodes = new int[0];
vrpAnalystParameter.setBarrierNodes(barrierNodes);
// 设置障碍弧段 ID 列表
int[] barrierEdges = new int[0];
vrpAnalystParameter.setBarrierEdges(barrierEdges);
// 设置权值字段信息的名字标识
String [] weightNames=config.getWeightName().split(",");
int weightNameIndex=0;
if(WeightNameType.MileAndTruck==weightNameType){
weightNameIndex=0;
}else if(WeightNameType.MileBlockTruck ==weightNameType){
weightNameIndex=1;
}else if(WeightNameType.TimeAndTruck ==weightNameType){
weightNameIndex=2;
}else {
weightNameIndex=3;
}
vrpAnalystParameter.setWeightName(weightNames[weightNameIndex].trim());
// 设置分析结果中包含路由对象的集合(即 GeoLineM 的集合)。
vrpAnalystParameter.setRoutesReturn(true);
// 设置分析结果中包含经过弧段集合
vrpAnalystParameter.setEdgesReturn(withDetail);
// 设置分析结果中包含行驶导引集合
vrpAnalystParameter.setPathGuidesReturn(withDetail);
vrpAnalystParameter.setNodesReturn(withDetail);
// 设置分析结果中要包含站点索引的集合
vrpAnalystParameter.setStopIndexesReturn(withDetail);
// 2.车辆信息数组
VehicleInfo[] vehicleInfos = new VehicleInfo[pathPlanCars.size()];
for (int i = 0; i < pathPlanCars.size(); i++) {
PathPlanCar car=pathPlanCars.get(i);
VehicleInfo vehicleInfo = new VehicleInfo();
// 设置车辆的最大耗费值
vehicleInfo.setCost(config.getCost());
// 设置车辆的负载量
vehicleInfo.setLoadWeight(car.getLoadOrderNumber());
vehicleInfos[i] = vehicleInfo;
}
// 3.中心点信息数组
CenterPointInfo[] centerPointInfos = new CenterPointInfo[netPoints.size()];
for (int i = 0; i < netPoints.size(); i++) {
CenterPointInfo centerPointInfo = new CenterPointInfo();
// 设置中心点ID
// centerPointInfo.setCenterID(i + 1);
// 设置中心点的坐标
Point2D centerPoint = netPoints.get(i);
centerPointInfo.setCenterPoint(centerPoint);
centerPointInfos[i] = centerPointInfo;
}
// 4.需求点信息数组
DemandPointInfo[] demandPointInfos = new DemandPointInfo[orderPointsList.size()];
for (int i = 0; i < orderPointsList.size(); i++) {
DemandPointInfo demandPointInfo = new DemandPointInfo();
// 需求点(订单)的坐标
demandPointInfo.setDemand(1);
// demandPointInfo.setDemandID(i + 1);
demandPointInfo.setDemandPoint(orderPointsList.get(i));
demandPointInfos[i] = demandPointInfo;
}
return getTransportationAnalyst().findVRPPath(vrpAnalystParameter, vehicleInfos, centerPointInfos, demandPointInfos);
}
应用截图
