当前位置:   article > 正文

物流配送的数据制作和功能实现_物料配送数据集

物料配送数据集

作者:xinixin

物流配送也称为多旅行商分析,是指在网络数据集中,给定 M 个配送中心点和 N 个配送目的地(M,N 为大于零的整数),查找经济有效的配送路径,并给出相应的行走路线。物理配送可以更合理分配配送次序和送货路线,使配送总花费达到最小或每个配送中心的花费达到最小。下面小编将用SuperMap产品,以小车每天配送包裹8(9:00—17:00)小时为例分享物流配送的数据制作和功能实现。
####一、 数据制作
#####1、 数据准备
准备研究区域的道路线数据集、包裹配送中心点和包裹配送点(小编准备了1个包裹中心点和20个包裹配送点)。
#####2、 构建网络数据
将线数据集构建二维网络数据集,如下图所示:
这里写图片描述
#####3、 添加字段
在上一步生成的网络数据集中添加小车跑的速度(单位默认:米/分钟)和每个弧段耗时(单位默认:分钟),可以通过更新列先设置网络数据集中小车速度字段(SuDu)值为60(应不同的交通工具设置合理的行驶速度);然后再更新耗时字段(Times)值,在更新列中使用“双字段运算”(SmLength / SuDu)得到。
####二、 功能实现
在功能这块小编使用SuperMap iObjects Java来实现,在9D版本前,iObjects Java中是用TransportationAnalyst类下的findMTSPPath()方法来实现,但无法设置配送车辆信息、需求量等的设置,所以为了更充分满足现实生活中不同的使用场景,从9D版本开始,TransportationAnalyst类下增加了findVRPPath()方法更好的实现物流配送。下面将分享物流配送的具体实现:
#####1、打开数据
可以通过工作空间或者数据源打开iDesktop中准备好的数据,具体代码就不做过多介绍。
#####2、参数设置

1)物流配送分析属于交通网络分析中的一种,所以需要先对交通网络分析参数对象并进行相应设置,具体参数设置如下:

		 //创建交通网络分析参数对象并进行相应设置
        TransportationAnalystSetting transportationAnalystSetting = new 
        		TransportationAnalystSetting();
        //设置物流配送分析的网络数据集
        transportationAnalystSetting.setNetworkDataset(networkDataset);
        //设置网络数据集中的节点ID
        transportationAnalystSetting.setNodeIDField ("SmNodeID");
        //设置网络数据集中的弧段ID
        transportationAnalystSetting.setEdgeIDField ("SmEdgeID");
        //设置网络数据集中表示弧段的起始点ID的字段
        transportationAnalystSetting.setFNodeIDField("SmFNode");
        //设置网络数据集中表示弧段的终止点ID的字段
        transportationAnalystSetting.setTNodeIDField("SmTNode");

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2)设置分析过程中的字段权重信息,如果想要在分析过程中有耗时限制和分析结果中含有时间点信息,除了要设置弧段长度字段权重信息外,还需要设置耗时字段权重信息。具体实现代码如下:

		//设置权重信息(用时间和长度字段设置权重)
        WeightFieldInfos weightInfos = new WeightFieldInfos();
        WeightFieldInfo weightInfo = new WeightFieldInfo();
        weightInfo.setFTWeightField ("Times");
        weightInfo.setTFWeightField ("Times");
        weightInfo.setName ("time");
        WeightFieldInfo weightFieldInfo1 = new WeightFieldInfo();
        weightFieldInfo1.setFTWeightField("SmLength");
        weightFieldInfo1.setTFWeightField("SmLength");
        weightFieldInfo1.setName("length");
        weightInfos.add(weightInfo);
        weightInfos.add(weightFieldInfo1);        
        transportationAnalystSetting.setWeightFieldInfos (weightInfos);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3)设置分析对象并加载模型,具体代码如下:

		//创建交通网络分析对象并设置分析环境对象
        TransportationAnalyst transportationAnalyst = new TransportationAnalyst();
        transportationAnalyst.setAnalystSetting (transportationAnalystSetting);
        //加载网络模型
        transportationAnalyst.load();
  • 1
  • 2
  • 3
  • 4
  • 5

4)构造物流分析参数设置对象,设置权重名称、分析模式,具体代码如下:

		//构造物流分析参数设置对象,设置权重名称、分析模式:
        VRPAnalystParameter parameter = new VRPAnalystParameter();
        //设置权值字段信息的名称
        parameter.setWeightName(weightFieldInfo1.getName());
        //设置时间字段信息的名称
        parameter.setTimeWeight(weightInfo.getName());
        //耗费最少模式
        parameter.setAnalystType(AnalystType.LEASTCOST);
        //设置分析结果中包含路由(GeoLineM)对象的集合
        parameter.setRoutesReturn(true);
        //设置分析结果中包含途经弧段的集合
        parameter.setEdgesReturn(true);
        //设置分析结果中包含结点的集合
        parameter.setNodesReturn(true);
        //设置分析结果中是否要包含站点索引的集合
        parameter.setStopIndexesReturn(true);
        //设置分析结果的路线条数
        parameter.setRouteCount(5);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

其中parameter.setRouteCount()方法在9.10版本才添加,如果不设置这个参数,那么物流配送的分析结果和安排的配送车的耗载量有关。
5)设置5量配送车一天工作8小时配送包裹,具体实现如下:

		Date startTime = new Date();
        Date endTime = new Date();
        //设置5辆车信息数组:      
        VehicleInfo[] vehicles = new VehicleInfo[5];
        for (int i = 0; i < vehicles.length; i++) {
        	 vehicles[i] = new VehicleInfo();
        	 //每辆车的发车时间最多8小时,28800秒
             vehicles[i].setCost(28800);
             //每辆车的耗载量1000
             vehicles[i].setLoadWeights(new double[]{1000});

             SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
             try {
				startTime = format.parse("09:00:00");
				endTime = format.parse("17:00:00");
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
             //设置车辆的发车和收车时间(早9点晚5点)
             vehicles[i].setStartTime(startTime);
             vehicles[i].setEndTime(endTime);                   
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

6)设置包裹配送中心点,具体设置如下

		 //设置中心点信息数组(1个中心点):
        CenterPointInfo[] centers = new CenterPointInfo[1];
        centers[0] = new CenterPointInfo();
        //通过节点id设置中心点(也可以通过节点坐标设置)
        centers[0].setCenterID(109329);
        //centers[0].setCenterPoint(new Point2D(116.4081654,40.10596173));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其中配送中心点可以通过节点ID来设置,也可以通过节点的坐标系来设置,下面设置派送点时也是类似的。
7)包裹派送点设置,具体代码如下:

		//设置需求点信息数组(20个派送点):
        DemandPointInfo[] demands = new DemandPointInfo[20];
        demands[0] = new DemandPointInfo();
        demands[0].setDemandID(108051);
        //每个派送点有10斤包裹
        demands[0].setDemands(new double[]{10});
        demands[1] = new DemandPointInfo();
        demands[1].setDemandID(108068);
        demands[1].setDemands(new double[]{10});
        demands[2] = new DemandPointInfo();
        demands[2].setDemandID(109415);
        demands[2].setDemands(new double[]{10});
        demands[3] = new DemandPointInfo();
        demands[3].setDemandID(104702);
        demands[3].setDemands(new double[]{10});
        demands[4] = new DemandPointInfo();
        demands[4].setDemandID(110859);
        demands[4].setDemands(new double[]{10});
        demands[5] = new DemandPointInfo();
        demands[5].setDemandID(112135);
        demands[5].setDemands(new double[]{10});
        demands[6] = new DemandPointInfo();
        demands[6].setDemandID(110785);
        demands[6].setDemands(new double[]{10});
        demands[7] = new DemandPointInfo();
        demands[7].setDemandID(107938);
        demands[7].setDemands(new double[]{10});
        demands[8] = new DemandPointInfo();
        demands[8].setDemandID(113287);
        demands[8].setDemands(new double[]{10});
        demands[9] = new DemandPointInfo();
        demands[9].setDemandID(114764);
        demands[9].setDemands(new double[]{10});
        demands[10] = new DemandPointInfo();
        demands[10].setDemandID(114637);
        demands[10].setDemands(new double[]{10});
        demands[11] = new DemandPointInfo();
        demands[11].setDemandID(116237);
        demands[11].setDemands(new double[]{10});
        demands[12] = new DemandPointInfo();
        demands[12].setDemandID(114596);
        demands[12].setDemands(new double[]{10});
        demands[13] = new DemandPointInfo();
        demands[13].setDemandID(113256);
        demands[13].setDemands(new double[]{10});
        demands[14] = new DemandPointInfo();
        demands[14].setDemandID(107949);
        demands[14].setDemands(new double[]{10});
        demands[15] = new DemandPointInfo();
        demands[15].setDemandID(113210);
        demands[15].setDemands(new double[]{10});
        demands[16] = new DemandPointInfo();
        demands[16].setDemandID(111995);
        demands[16].setDemands(new double[]{10});
        demands[17] = new DemandPointInfo();
        demands[17].setDemandID(110714);
        demands[17].setDemands(new double[]{10});
        demands[18] = new DemandPointInfo();
        demands[18].setDemandID(107971);
        demands[18].setDemands(new double[]{10});
        demands[19] = new DemandPointInfo();
        demands[19].setDemandID(104661);
        demands[19].setDemands(new double[]{10});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

8)进行物流配送分析,返回分析结果,并根据项目需求得到分析结果的具体信息(比如每条配送路线经过派送点的时间点)或者将结果路线以不同的颜色显示在地图上,部分实现代码如下:

		//进行物流分析,返回物流分析方案
        VRPAnalystResult result = transportationAnalyst.findVRPPath(parameter, 
        		vehicles, centers, demands);
        if (result==null) {
        	JOptionPane.showMessageDialog(null, "分析失败");
		}
        //返回物流配送中每条线路中到达每个配送点的时间
       Date[][] datas = result.getTimes();
       for (int i = 0; i < datas.length; i++) {
    	   int n = i + 1;
    	   System.out.println("第"+ n + "条到达包裹点时间");
    	   for (int j = 0; j < datas[i].length; j++) {
			Date time = datas[i][j];
			System.out.println(time.toString());
		}	  	   
	}
	//将分析结果线以不同颜色显示在地图上
       GeoLineM[] lineMs = result.getRoutes();
       int count = lineMs.length;
       System.out.println(String.valueOf(count));
     //填充路由列表		
		for (int i = 0; i < count; i++)
		{
			switch (i) {
			case 0:
				GeoLineM geoLineM0 = result.getRoutes()[i];				
				com.supermap.data.GeoStyle style0 = new com.supermap.data.GeoStyle();
				style0.setLineColor(Color.BLUE);
				style0.setLineWidth(1);
				geoLineM0.setStyle(style0);
				trackingLayer.add(geoLineM0, "result");
				break;
			case 1:
				GeoLineM geoLineM1 = result.getRoutes()[i];
				com.supermap.data.GeoStyle style1 = new com.supermap.data.GeoStyle();
				style1.setLineColor(Color.RED);
				style1.setLineWidth(1);
				geoLineM1.setStyle(style1);
				trackingLayer.add(geoLineM1, "result");
				break;
			case 2:
				GeoLineM geoLineM2 = result.getRoutes()[i];
				com.supermap.data.GeoStyle style2 = new com.supermap.data.GeoStyle();
				style2.setLineColor(Color.GREEN);
				style2.setLineWidth(1);
				geoLineM2.setStyle(style2);
				trackingLayer.add(geoLineM2, "result");
				break;
			case 3:
				GeoLineM geoLineM3 = result.getRoutes()[i];
				com.supermap.data.GeoStyle style3 = new com.supermap.data.GeoStyle();
				style3.setLineColor(Color.CYAN);
				style3.setLineWidth(1);
				geoLineM3.setStyle(style3);
				trackingLayer.add(geoLineM3, "result");
				break;
			case 4:
				GeoLineM geoLineM4 = result.getRoutes()[i];
				com.supermap.data.GeoStyle style4 = new com.supermap.data.GeoStyle();
				style4.setLineColor(Color.ORANGE);
				style4.setLineWidth(1);
				geoLineM4.setStyle(style4);
				trackingLayer.add(geoLineM4, "result");
				break;

			default:
				break;
			}
			
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

物流配送分析的结果路线经过各自配送点的时间输出打印如下:
这里写图片描述
其中每条路线的第一行时间是配送车从配送中心点出发的时间,最后一行是配送车回到中心点的时间,中间的是该路线经过的派送点时间。

物流配送分析结果线在地图中显示的效果图如下:
这里写图片描述

**结语:**这个只是小编模拟的一个物流配送的使用场景,给大家实现的思路,大家在实现的时候还是要根据自己的项目需求来做相应的设置。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/549008
推荐阅读
相关标签
  

闽ICP备14008679号