清风飒影 Blog

自由、平等、随意、突破!

路线规划

应用场景
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);
    }
应用截图

路线规划

评论