com.supermap.analyst.networkanalyst

类 TransportationAnalyst

  • java.lang.Object
    • com.supermap.analyst.networkanalyst.TransportationAnalyst


  • public class TransportationAnalyst
    extends java.lang.Object

    交通网络分析类。该类用于提供路径分析、旅行商分析、服务区分析、多旅行商(物流配送)分析、最近设施查找和选址分区分析等交通网络分析的功能。

    交通网络分析是网络分析的重要组成部分,是基于交通网络模型的分析。与设施网络模型不同,交通网络是没有方向的,即使可以为网络边线指定方向,但流通介质(行人或传输的资源)可以自行决定方向、速度和目的地。

    使用该类进行交通网络分析的数据基础是拥有网络数据集。构建网络数据集,请参见SuperMap iDesktop帮助文档的网络分析相关介绍。在分析前,需要通过 setAnalystSetting 方法设置交通网络分析环境(TransportationAnalystSetting)。

    还可以阅读《网络分析》技术文档以便了解更多有关网络分析的基本概念和功能介绍。

    • 构造器详细资料

      • TransportationAnalyst

        public TransportationAnalyst()
        构造一个新的交通网络分析对象。
    • 方法详细资料

      • dispose

        public void dispose()
        释放对象所占用的资源。调用该方法之后,此对象不再可用。
      • load

        public boolean load()
        加载网络模型。

        该方法根据交通网络分析环境设置(TransportationAnalystSetting)对象中的环境参数,加载网络模型。在设置好交通网络分析环境的参数后,只有调用该方法,所做的交通网络分析环境设置才会在交通网络分析的过程中生效。

        注意:

        1. 出现以下两种情况都必须重新调用 load 方法来加载网络模型,然后再进行分析,并且在重新调用前,必须先调用 dispose 方法释放 TransportationAnalyst 对象所占用的资源,否则可能出错。
          • 对交通网络分析环境设置对象的参数进行了修改,需要重新调用该方法,否则所作修改不会生效从而导致分析结果错误;
          • 对所使用的网络数据集进行了任何修改,包括修改网络数据集中的数据、替换数据集等,都需要重新加载网络模型,否则分析可能出错。
        2. 已经调用 load 方法加载了网络模型,再次调用 load 方法之前,必须先调用 dispose 方法释放资源,否则加载可能失败。
        返回:
        一个布尔值指定是否加载网络模型。
      • setAnalystSetting

        public void setAnalystSetting(TransportationAnalystSetting value)
        设置交通网络分析环境设置对象。

        在利用交通网络分析类进行各种交通网络分析时,都要首先设置交通网络分析的环境,都要首先设置交通网络分析的环境,而交通网络分析环境的设置就是通过 TransportationAnalyst 类对象的 setAnalystSetting() 方法来完成的,具体该方法中都设置了哪些相关信息,请参见 TransportationAnalystSetting 类。

        参数:
        value - 交通网络分析环境设置对象。
      • updateEdgeWeight

        public double updateEdgeWeight(int edgeID,
                                       int fromNodeID,
                                       int toNodeID,
                                       java.lang.String weightName,
                                       double weight)
        该方法用来更新弧段的权值。

        该方法用于对加载到内存中的网络模型的弧段权值进行修改,并不会修改网络数据集。

        该方法可以更新弧段的正向权值或反向权值。正向权重是指从弧段的起始结点到达终止结点的花费,反向权值为从弧段的终止结点到达起始结点的花费。因此,指定 fromNodeID 为网络数据集中被更新弧段的起始结点 ID,toNodeID 为该弧段的终止结点 ID,则更新正向权值,反之,指定 fromNodeID 为网络数据集中该弧段的终止结点 ID,toNodeID 为该弧段的起始结点 ID,则更新反向权值。

        注意,权值为负数表示弧段在该方向禁止通行。

        参数:
        edgeID - 被更新的弧段的 ID。
        fromNodeID - 被更新的弧段的起始结点 ID。
        toNodeID - 被更新的弧段的终止结点 ID。
        weightName - 被更新的权值字段所属的权值字段信息对象的名称,即在交通网络分析环境(TransportationAnalystSetting)中指定的 WeightFieldInfos 对象中相应的 WeightFieldInfo 对象的 getName() 方法的返回值。
        weight - 权值,即用该值更新旧值。单位与 weightName 指定的权值信息字段对象中权值字段的单位相同。
        返回:
        成功返回更新前的权值,失败返回-1.7976931348623157e+308。
        Example:
        以下代码示例如何更新弧段的权值,并将修改前与修改后的权值在控制台输出。下面函数中操作的网络数据集为安装目录\SampleData\changchun\下的 changchun.udb 数据源中的名为 RoadNet 的网络数据集。
         public void UpdateEdgeWeightExample(DatasetVector networkDataset)
             {
                 //创建交通网络分析对象和交通网络分析参数对象并进行相应设置
                 TransportationAnalyst transportationAnalyst = new TransportationAnalyst();
                 TransportationAnalystSetting transportationAnalystSetting = new TransportationAnalystSetting();
                 transportationAnalystSetting.setNetworkDataset ( networkDataset);
                 transportationAnalyst.setAnalystSetting ( transportationAnalystSetting);
        
                 //加载网络模型
                 transportationAnalyst.load();
        
                 //构建一个交通网络分析参数对象
                 TransportationAnalystParameter parameter = new TransportationAnalystParameter();
                 parameter.setNodes ( new int[] { 6901, 6783 });
                 TransportationAnalystResult result1 = transportationAnalyst.findPath(parameter, true);
                 System.out.println("The weight is " + result1.getWeights()[0]);
        
                 //修改更新弧段的权值
                 transportationAnalyst.updateEdgeWeight(10, 6901, 6783, "Length", 200);
                 TransportationAnalystResult result2 = transportationAnalyst.findPath(parameter, true);
                 System.out.println("The weight is " + result2.getWeights()[0]);
             }
        
         
      • updateTurnNodeWeight

        public double updateTurnNodeWeight(int nodeID,
                                           int fromEdgeID,
                                           int toEdgeID,
                                           java.lang.String turnWeightField,
                                           double weight)
        该方法用来更新转向结点的权值。

        该方法用于对加载到内存中的网络模型的转向权值进行修改,并不会修改转向表。

        在一个结点处,可能产生多种转向。转弯的方向通过给定的转向结点的起始弧段 ID 和终止弧段 ID 确定。详细介绍请参阅SuperMap iDesktop帮助文档的网络分析相关介绍。

        注意,转向权值为负数表示该转弯方向禁止通行。

        参数:
        nodeID - 被更新的转向结点 ID。
        fromEdgeID - 被更新的转向结点的起始弧段 ID。
        toEdgeID - 被更新的转向结点的终止弧段 ID。
        turnWeightField - 转向权值字段名称。
        weight - 权值,即用该值更新旧值。单位与 turnWeightField 指定的转向权值字段的单位相同。
        返回:
        成功返回更新前的权值,失败返回-1.7976931348623157e+308。
      • findPath

        public TransportationAnalystResult findPath(TransportationAnalystParameter parameter,
                                                    boolean hasLeastEdgeCount)
        最佳路径分析。

        最佳路径分析解决的问题是,在网络数据集中,给定 N 个点(N 大于等于2),找出按照给定点的次序依次经过这 N 个点的花费最小的路径。“花费最小”有多种理解,如时间最短、费用最低、风景最好、路况最佳、过桥最少、收费站最少、经过乡村最多等。

        最佳路径分析的经过点是在 TransportationAnalystParameter 类型的参数 parameter 中指定的。通过 TransportationAnalystParameter 对象有两种方式可以指定经过点:

        1. 使用该对象的 setNodes 方法,以网络数据集中结点 ID 数组的形式指定最佳路径分析经过的点,因此分析过程中经过的点就是相应的网络结点;
        2. 使用该对象的 setPoints 方法,以坐标点串的形式指定最佳路径分析经过的点,因此分析过程中经过的点就是相应的坐标点。

        此外,通过 TransportationAnalystParameter 对象还可以指定最佳路径分析需要的其他信息,如障碍点(边),分析结果是否包含路由、行驶导引、途经弧段或结点等。具体内容请参见 TransportationAnalystParameter 类。

        需要注意,网络分析中的旅行商分析(findTSPath 方法)与最佳路径分析类似,都是在网络中寻找遍历所有经过点的花费最少的路径。但二者具有明显的区别,即在遍历经过点时,二者对访问经过点的顺序处理有所不同:

        • 最佳路径分析:必须按照给定的经过点的次序访问所有点;
        • 旅行商分析:需要确定最优次序来访问所有点,而并不一定按照给定的经过点的次序。
        参数:
        parameter - 交通网络分析参数对象。
        hasLeastEdgeCount - 是否弧段数最少。true 代表按照弧段数最少进行查询,由于弧段数少不代表弧段长度短,所以此时查出的结果可能不是最短路径。如下图所示,如果连接AB 的绿色路径的弧段数少于黄色路径,当本参数设置为 true 时,绿色路径就是查询得到的路径,当参数设置为 false 时,黄色路径就是查询得到的路径。

        返回:
        分析结果对象。
        另请参阅:
        updateEdgeWeight()方法的示例。
      • findTSPPath

        public TransportationAnalystResult findTSPPath(TransportationAnalystParameter parameter,
                                                       boolean isEndNodeAssigned)
        旅行商分析。

        旅行商分析是查找经过指定一系列点的路径,旅行商分析是无序的路径分析。旅行商可以自己决定访问结点的顺序,目标是旅行路线阻抗总和最小(或接近最小)。

        旅行商分析的经过点是在 TransportationAnalystParameter 类型的参数 parameter 中指定的。通过 TransportationAnalystParameter 对象有两种方式可以指定经过点:

        1. 使用该对象的 setNodes 方法,以网络数据集中结点 ID 数组的形式指定旅行商分析经过的点,因此分析过程中经过的点就是相应的网络结点;
        2. 使用该对象的 setPoints 方法,以坐标点串的形式指定旅行商分析经过的点,因此分析过程中经过的点就是相应的坐标点。

        需要强调的是,此方法默认将给定的经过点集合中的第一个点(结点或坐标点)作为旅行商的起点。此外,用户还可以指定终点(对应方法中的 isEndNodeAssigned 参数)。如果选择指定终点,则给定的经过点集合的最后一个点为终点,此时旅行商从第一个给定点出发,到指定的终点结束,而其他经过点的访问次序由旅行商自己决定。

        另外,如果选择指定终点,终点可以与起点相同,即经过点集合中的最后一个点与第一个点相同。此时,旅行商分析的结果是一条闭合路径,即从起点出发,最终回到该点。

        注意:使用该方法时,如果选择指定终点(对应方法中的 hasLeastEdgeCount 参数),指定的经过点集合的第一个点与最后一点可以相同,也可以不同;其他点不允许有相同的点,否则会分析失败;当不指定终点时,不允许有相同的点,如果有相同点,分析会失败。

        此外,通过 TransportationAnalystParameter 对象还可以指定旅行商分析需要的其他信息,如障碍点(边),分析结果是否包含路由、行驶导引、途经弧段或结点等。具体内容请参见 TransportationAnalystParameter 类。

        需要注意,网络分析中的最佳路径分析(findPath 方法)与旅行商分析类似,都是在网络中寻找遍历所有经过点的花费最少的路径。但二者具有明显的区别,即在遍历经过点时,二者对访问经过点的顺序处理有所不同:

        • 最佳路径分析:必须按照给定的经过点的次序访问所有点;
        • 旅行商分析:需要确定最优次序来访问所有点,而并不一定按照给定的经过点的次序。
        参数:
        parameter - 交通网络分析参数对象。
        isEndNodeAssigned - 是否指定终点。指定为 true 表示指定终点,此时给定的经过点集合中最后一个点即为终点;否则不指定终点。
        返回:
        分析结果对象。
        Example:
        以下代码示范了如何进行旅行商分析。下面函数中操作的网络数据集为安装目录\SampleData\changchun\下的 changchun.udb 数据源中的名为 RoadNet 的网络数据集。
         public void FindTSPPath(DatasetVector networkDataset)
             {
                 //创建交通网络分析对象和交通网络分析参数对象并进行相应设置
                 TransportationAnalyst transportationAnalyst = new TransportationAnalyst();
                 TransportationAnalystSetting Setting = new TransportationAnalystSetting();
                 Setting.setNetworkDataset (networkDataset);
                 transportationAnalyst.setAnalystSetting(Setting);
        
                 //加载网络模型
                 transportationAnalyst.load();
        
                 //构建并设置一个交通网络分析参数对象
                 TransportationAnalystParameter Parameter = new TransportationAnalystParameter();
                 Parameter.setNodes ( new int[] { 2772, 3114, 2878 });
                 Parameter.setNodesReturn ( true);
        
                 //进行旅行商分析
                 TransportationAnalystResult Result = transportationAnalyst.findTSPPath(Parameter, false);
        
                 //循环输出途径结点的ID
                 for (int i = 0; i < Result.getNodes().length; i++)
                 {
                     for (int j = i; j < Result.getNodes()[i].length; j++)
                     {
                         System.out.println(Result.getNodes()[i][j]);
                     }
                 }
             }
         
      • findClosestFacility

        public TransportationAnalystResult findClosestFacility(TransportationAnalystParameter parameter,
                                                               int eventID,
                                                               int facilityCount,
                                                               boolean isFromEvent,
                                                               double maxWeight)
        根据指定的参数进行最近设施查找分析,事件点为结点 ID。

        最近设施查找分析是指在网络上给定一个事件点和一组设施点,为事件点查找以最小耗费能到达的一个或几个设施点,结果为从事件点到设施点(或从设施点到事件点)的最佳路径。

        有关最近设施查找分析的详细介绍,请参见另一重载方法 findClosestFacility 方法。这两个方法的区别在于,该方法通过坐标点指定事件点,而本方法通过结点 ID 指定事件点。

        参数:
        parameter - 交通网络分析参数对象。
        eventID - 事件点 ID。
        facilityCount - 要查找的设施点数量。
        isFromEvent - 是否从事件点到设施点进行查找。
        maxWeight - 查找半径。单位同网络分析环境中设置的阻力字段,如果要查找整个网络,该值设为0。
        返回:
        分析结果对象。
        Example:
        以下代码示例了如何根据指定的参数进行最近设施查找分析。下面函数中操作的网络数据集和点数据集分别为为安装目录\SampleData\changchun\下的 changchun.udb 数据源中的名为 RoadNet 的网络数据集和名为 Hospital 的点数据集。
         public void FindClosesetFacilityExample(DatasetVector networkDataset,DatasetVector pointDataset)
             {
                 //创建交通网络分析参数对象并进行相应设置
                 TransportationAnalystSetting transportationAnalystSetting = new TransportationAnalystSetting();
                 transportationAnalystSetting.setNetworkDataset(networkDataset);
                 transportationAnalystSetting.setNodeIDField ( "SmNodeID");
                 transportationAnalystSetting.setEdgeIDField ( "SmID");
                 transportationAnalystSetting.setTolerance ( 89.00);
        
                 //设置权重信息
                 WeightFieldInfos weightInfos = new WeightFieldInfos();
                 WeightFieldInfo weightInfo = new WeightFieldInfo();
                 weightInfo.setFTWeightField ( "SmLength");
                 weightInfo.setTFWeightField ( "Smlength");
                 weightInfo.setName ( "Name");
                 weightInfos.add(weightInfo);
                 transportationAnalystSetting.setWeightFieldInfos (weightInfos);
        
                 //创建交通网络分析对象,设置分析环境对象,加载网络模型
                 TransportationAnalyst transportationAnalyst = new TransportationAnalyst();
                 transportationAnalyst.setAnalystSetting (transportationAnalystSetting);
                 transportationAnalyst.load();
        
                 //从设施点数据集中直接得到记录集
                 Recordset recordset = pointDataset.getRecordset(false, CursorType.DYNAMIC);
        
                 //返回医院的ID赋值给途径结点ID
                 int[] nodes = new int[recordset.getRecordCount()];
                 for (int i = 0; i < recordset.getRecordCount(); i++)
                 {
                     nodes[i] = i;
                 }
        
                 //构造交通网络分析参数对象,进行相应设置
                 TransportationAnalystParameter parameter = new TransportationAnalystParameter();
                 parameter.setNodes (nodes);
                 parameter.setWeightName (weightInfo.getName());
                 parameter.setEdgesReturn (true);
                 parameter.setNodesReturn (true);
                 parameter.setRoutesReturn (true);
        
                 //进行最近设施分析
                 int eventPoint = 100;
                 int facilityCount = 3;
                 double maxWeight = 0.0;
                 TransportationAnalystResult result = transportationAnalyst.findClosestFacility(parameter, eventPoint, facilityCount, true, maxWeight);
             }
         
      • findClosestFacility

        public TransportationAnalystResult findClosestFacility(TransportationAnalystParameter parameter,
                                                               Point2D eventPoint,
                                                               int facilityCount,
                                                               boolean isFromEvent,
                                                               double maxWeight)
        根据指定的参数进行最近设施查找分析,事件点为坐标点。

        最近设施分析是指在网络上给定一个事件点和一组设施点,为事件点查找以最小耗费能到达的一个或几个设施点,结果为从事件点到设施点(或从设施点到事件点)的最佳路径。

        设施点和事件点是最近设施查找分析的基本要素。设施点是提供服务的设施,如学校、超市、加油站等;事件点则是需要设施点的服务的事件位置。

        例如,在某位置发生一起交通事故,要求查找在 10 分钟内最快到达的 3 家医院,超过 10 分钟能到达的都不予考虑。此例中,事故发生地即是一个事件点,周边的医院则是设施点。

        事件点的指定方式有两种,一是通过坐标点来指定;二是以网络数据集中的结点 ID 指定,也就是将该网络结点看做事件点,本方法中事件点的指定是采用坐标点的方式。在另一重载方法 findClosestFacility 中,事件点通过结点 ID 来指定。

        设施点则是在 TransportationAnalystParameter 类型的参数 parameter 中指定的。通过 TransportationAnalystParameter 对象有两种方式可以指定经过点:

        1. 使用该对象的 setNodes 方法,以网络数据集中结点 ID 数组的形式指定设施点,因此分析过程中使用到的设施点就是相应的网络结点;
        2. 使用该对象的 setPoints 方法,以坐标点串的形式指定设施点,因此分析过程中使用到的设施点就是相应的坐标点。

        另外,最近设施查找实际上也是一种路径分析,因此,同样可以应用障碍边和障碍点的设置,在行驶路途上这些障碍将不能被穿越,在路径分析中会予以考虑。

        通过 TransportationAnalystParameter 对象还可以指定最佳路径分析需要的其他信息,如权重信息,分析结果是否包含路由、行驶导引、途经弧段或结点等。具体内容请参见 TransportationAnalystParameter 类。

        参数:
        parameter - 交通网络分析参数对象。
        eventPoint - 事件点坐标。
        facilityCount - 要查找的设施点数量。
        isFromEvent - 是否从事件点到设施点进行查找。
        maxWeight - 查找半径。单位同网络分析环境中设置的阻力字段,如果要查找整个网络,该值设为 0。
        返回:
        分析结果对象。
        Example:
        以下代码示例了如何根据指定的参数进行最近设施查找分析。下面函数中操作的网络数据集和点数据集分别为为安装目录\SampleData\City\下的 Changchun.udb数据源中的名为 RoadNet 的网络数据集和名为 Hospital 的点数据集。
         public void FindClosesetFacilityExample(DatasetVector networkDataset,DatasetVector pointDataset)
             {
                 //创建交通网络分析参数对象并进行相应设置
                 TransportationAnalystSetting transportationAnalystSetting = new TransportationAnalystSetting();
                 transportationAnalystSetting.setNetworkDataset(networkDataset);
                 transportationAnalystSetting.setNodeIDField ("SmNodeID");
                 transportationAnalystSetting.setEdgeIDField ("SmID");
                 transportationAnalystSetting.setTolerance ( 89.00);
        
                 //设置权重信息
                 WeightFieldInfos weightInfos = new WeightFieldInfos();
                 WeightFieldInfo weightInfo = new WeightFieldInfo();
                 weightInfo.setFTWeightField ("SmLength");
                 weightInfo.setTFWeightField ("Smlength");
                 weightInfo.setName ("Name");
                 weightInfos.add(weightInfo);
                 transportationAnalystSetting.setWeightFieldInfos (weightInfos);
        
                 //创建交通网络分析对象并设置分析环境对象
                 TransportationAnalyst transportationAnalyst = new TransportationAnalyst();
                 transportationAnalyst.setAnalystSetting (transportationAnalystSetting);
        
                 //加载网络模型
                 transportationAnalyst.load();
        
                 //从设施点数据集中直接得到记录集
                 Recordset recordset = pointDataset.getRecordset(false, CursorType.DYNAMIC);
        
                 //遍历设施点记录集中的每条记录,得到几何对象
                 //得到点几何对象的X、Y坐标构造点对象,并添加到点集合对象中
                 Point2Ds points = new Point2Ds();
                 for (int i = 0; i < recordset.getRecordCount(); i++)
                 {
                     GeoPoint geoPoint = (GeoPoint)recordset.getGeometry();
                     Point2D point = new Point2D(geoPoint.getX(), geoPoint.getY());
                     points.add(point);
                     recordset.moveNext();
                 }
                 //构造交通网络分析参数对象,进行相应设置
                 TransportationAnalystParameter parameter = new TransportationAnalystParameter();
                 parameter.setPoints ( points);
                 parameter.setWeightName (weightInfo.getName());
                 parameter.setEdgesReturn ( true);
                 parameter.setNodesReturn ( true);
                 parameter.setRoutesReturn (true);
        
                 //进行最近设施分析
                 Point2D eventPoint = new Point2D(3534, 3820);
                 int facilityCount = 3;
                 double maxWeight = 0.0;
                 TransportationAnalystResult result = transportationAnalyst.findClosestFacility(parameter, eventPoint, facilityCount, true, maxWeight);
             }
      • findMTSPPath

        public TransportationAnalystResult findMTSPPath(TransportationAnalystParameter parameter,
                                                        int[] centerNodes,
                                                        boolean hasLeastTotalCost)
        多旅行商(物流配送)分析,配送中心为结点 ID 数组。

        多旅行商分析也称为物流配送,是指在网络数据集中,给定 M 个配送中心点和 N 个配送目的地(M,N 为大于零的整数),查找经济有效的配送路径,并给出相应的行走路线。如何合理分配配送次序和送货路线,使配送总花费达到最小或每个配送中心的花费达到最小,是物流配送所解决的问题。

        有关多旅行商分析的详细介绍,请参见另一重载方法 findMTSPPath 方法。这两个方法的区别在于,该方法通过坐标点集合指定配送中心点,而本方法通过结点 ID 数组指定配送中心点。

        参数:
        parameter - 交通网络分析参数对象。
        centerNodes - 配送中心结点 ID 数组。
        hasLeastTotalCost - 配送模式是否为总花费最小方案。若为 true,则按照总花费最小的模式进行配送,此时可能会出现某些配送中心点配送的花费较多而其他的配送中心点的花费较少的情况。若为 false,则为局部最优,此方案会控制每个配送中心点的花费,使各个中心点花费相对平均,此时总花费不一定最小。
        返回:
        分析结果对象。
      • findMTSPPath

        public TransportationAnalystResult findMTSPPath(TransportationAnalystParameter parameter,
                                                        Point2Ds centerPoints,
                                                        boolean hasLeastTotalCost)
        多旅行商(物流配送)分析,配送中心为点坐标串。

        多旅行商分析也称为物流配送,是指在网络数据集中,给定 M 个配送中心点和 N 个配送目的地(M,N 为大于零的整数),查找经济有效的配送路径,并给出相应的行走路线。如何合理分配配送次序和送货路线,使配送总花费达到最小或每个配送中心的花费达到最小,是物流配送所解决的问题。

        配送中心点的指定方式有两种,一是通过坐标点集合指定,二是以网络结点 ID 数组指定。本方法中配送中心点要求以坐标点集合的方式给出(centerPoints 参数),因此相应的坐标点就是配送中心点。在另一重载方法 findMTSPPath 中,配送中心点通过结点 ID 数组来指定,此时,相应的网络结点就被看成是配送中心。

        配送目的地则是在 TransportationAnalystParameter 类型的参数 parameter 中指定。通过 TransportationAnalystParameter 对象有两种方式可以指定配送目的地:

        1. 使用该对象的 setNodes 方法,以网络数据集中结点 ID 数组的形式指定配送目的地,因此分析过程中使用到的配送目的地就是相应的网络结点;
        2. 使用该对象的 setPoints 方法,以坐标点串的形式指定配送目的地,因此分析过程中使用到的配送目的地就是相应的坐标点。

        此外,通过 TransportationAnalystParameter 对象还可以指定最佳路径分析需要的其他信息,如障碍点(边),分析结果是否包含路由、行驶导引、途经弧段或结点等。具体内容请参见 TransportationAnalystParameter 类。

        多旅行商分析的结果将给出每个配送中心所负责的配送目的地,以及这些配送目的地的经过顺序,和相应的行走路线,从而使该配送中心的配送花费最少,或者使得所有的配送中心的总花费最小。并且,配送中心点在完成其所负责的配送目的地的配送任务后,最终会回到配送中心点。

        应用实例:现有 50 个报刊零售地(配送目的地),和 4 个报刊供应地(配送中心),现寻求这 4 个供应地向报刊零售地发送报纸的最优路线,属物流配送问题。

        下图为报刊配送的分析结果,其中红色大一点的圆点代表 4 个报刊供应地(配送中心),而其他小一点的圆点代表报刊零售地(配送目的地),每个配送中心的配送方案采用不同的颜色标示,包括它所负责的配送目的地、配送次序以及配送线路。

        下图为上图中矩形框圈出的第 2 号配送中心的配送方案。蓝色的标有数字的小圆点是2号配送中心所负责的配送目的地(共有 18 个),2 号配送中心将按照配送目的地上标有数字的顺序依次发送报纸,即先送 1 号报刊零售地,再送 2 号报刊零售地,依次类推,并且沿着分析得出的蓝色线路完成配送,最终回到配送中心。

        需要注意,由于物流配送的目的是寻找使配送总花费最小或每个配送中心的花费最小的方案,因此,分析结果中有可能某些物流配送中心点不参与配送。

        参数:
        parameter - 交通网络分析参数对象。
        centerPoints - 配送中心点坐标串。
        hasLeastTotalCost - 配送模式是否为总花费最小方案。若为 true,则按照总花费最小的模式进行配送,此时可能会出现某些配送中心点配送的花费较多而其他的配送中心点的花费较少的情况。若为 false,则为局部最优,此方案会控制每个配送中心点的花费,使各个中心点花费相对平均,此时总花费不一定最小。
        返回:
        分析结果对象。
        Example:
        以下代码示范了如何进行多旅行商分析。下面函数中操作的网络数据集为安装目录\SampleData\changchun\下的 changchun.udb 数据源中的名为 RoadNet 的网络数据集。
         public void FindMTSPPath1(DatasetVector networkDataset)
             {
                 //创建交通网络分析对象和交通网络分析参数对象并进行相应设置
                 TransportationAnalyst transportationAnalyst = new TransportationAnalyst();
                 TransportationAnalystSetting transportationAnalystSetting = new TransportationAnalystSetting();
                 transportationAnalystSetting.setNetworkDataset ( networkDataset);
                 transportationAnalyst.setAnalystSetting ( transportationAnalystSetting);
        
                 //加载网络模型
                 transportationAnalyst.load();
        
                 //构建并设置交通网络分析参数对象
                 TransportationAnalystParameter parameter = new TransportationAnalystParameter();
                 Point2Ds pt2Ds=new Point2Ds(new Point2D[] { new Point2D(14, 50),new Point2D(30, 28),new Point2D(40,50) });
                 parameter.setPoints (pt2Ds);
                 parameter.setPathGuidesReturn ( true);
                 parameter.setStopIndexesReturn ( true);
                 parameter.setWeightName("Length");
        
                 //设置配送中心点坐标串
                 Point2D[] point2D = { new Point2D(10, 20), new Point2D(30, 40), new Point2D(50, 60) };
                 Point2Ds point2Ds = new Point2Ds(point2D);
                 new Point2Ds(new Point2D[] { new Point2D(14, 50),new Point2D(30, 28),new Point2D(40,50) });
        
        
                 //进行多旅行商分析,返回多旅行商分析结果
                 TransportationAnalystResult Result = transportationAnalyst.findMTSPPath(parameter, point2Ds, false);
             }
        
         
      • findServiceArea

        public ServiceAreaResult findServiceArea(TransportationAnalystParameter parameter,
                                                 double[] weights,
                                                 boolean isFromCenter,
                                                 boolean isCenterMutuallyExclusive)
        服务区分析。

        服务区是以指定点为中心,在一定阻力范围内,包含所有可通达边、通达点的一个区域。服务区分析就是依据给定的阻力值(即服务半径)为网络上提供某种特定服务的位置(即中心点)查找其服务的范围(即服务区)的过程。阻力可以是到达的时间、距离或其他任何花费。例如:为网络上某点计算其 30 分钟的服务区,则结果服务区内,任意点出发到该点的时间都不会超过 30 分钟。

        服务区分析的结果包含了每个服务中心点所能服务到的路由和区域。路由是指从服务中心点出发,按照阻力值不大于所指定的服务半径的原则,沿网络弧段延伸出的路径;服务区则是按照一定算法将路由包围起来所形成的面状区域。如下图所示,红色圆点代表提供服务或资源的服务中心点,各种颜色的面状区域就是以相应的服务中心点为中心,在给定的阻力范围内的服务区,每个服务中心点所服务到的路由也以对应的颜色标示。

        调用本方法时,需要通过 parameter 参数指定一个交通分析参数设置(TransportationAnalystParameter)对象,通过该对象的方法指定服务区分析的有关参数,包括服务区的位置、权值(即阻力)信息、障碍信息,以及分析结果中是否返回行驶导引、路由对象、经过的弧段和结点的集合等。

        服务中心点

        通过 TransportationAnalystParameter 对象有两种方式可以指定服务中心点的位置:

        1. 使用 setNodes() 方法,以网络数据集中结点 ID 数组的形式指定服务中心点,因此分析过程中使用到的服务中心点就是相应的网络结点。
        2. 使用 setPoints() 方法,以服务中心点的坐标点串的形式指定服务中心点,因此分析过程中使用到的服务中心点就是相应的坐标点集合。

        是否从中心点分析

        是否从中心点开始分析,体现了服务中心和需要该服务的需求地的关系模式。从中心点开始分析,表示服务中心向服务需求地提供服务;而不从中心点开始分析,则代表服务需求地主动到服务中心获得服务。例如:某个奶站向各个居民点送牛奶,如果要对这个奶站进行服务区分析,查看这个奶站在允许的条件下所能服务的范围,那么在实际分析过程中应当使用从中心点开始分析的模式;另一个例子,如果想分析一个区域的某个学校在允许的条件下所能服务的区域时,由于在现实中都是学生主动来到学校学习,接受学校提供的服务,那么在实际分析过程中就应当使用不从中心点开始分析的模式。

        服务区互斥

        若两个或多个相邻的服务区有交集,可将它们进行互斥处理。互斥处理后,这些服务区不会有交叠。如图所示左图未进行互斥处理,右图进行了互斥处理。

        参数:
        parameter - 交通网络分析参数对象。
        weights - 服务区半径数组。数组长度应与给定的服务中心点的数量一致,且数组元素按照顺序与中心点一一对应。服务区半径的单位与指定的权值信息中的正向、反向阻力字段的单位一致。
        isFromCenter - 是否从中心点开始分析。
        isCenterMutuallyExclusive - 是否进行服务区互斥处理。如果设置为 true,则进行互斥处理,设置为 false,则不进行互斥处理。
        返回:
        服务区分析结果对象。
        Example:
        以下代码示范了如何进行服务区分析。下面函数中操作的网络数据集为安装目录\SampleData\changchun\下的 changchun.udb 数据源中的名为 RoadNet 的网络数据集。
         public void FindServiceArea(DatasetVector networkDataset)
             {
                 //创建交通网络分析对象和交通网络分析参数对象并进行相应设置
                 TransportationAnalystSetting Setting = new TransportationAnalystSetting();
                 Setting.setNetworkDataset (networkDataset);
                 TransportationAnalyst transportationAnalyst = new TransportationAnalyst();
                 transportationAnalyst.setAnalystSetting (Setting);
        
                 //加载网络模型
                 transportationAnalyst.load();
        
                 //构建并设置交通网络分析参数对象
                 TransportationAnalystParameter Parameter = new TransportationAnalystParameter();
                 Parameter.setNodes (new int[] { 3, 40 });
                 Parameter.setRoutesReturn(true);
        
                 //进行网络分析,查找服务区
                 ServiceAreaResult serviceAreaResult = transportationAnalyst.findServiceArea(Parameter, new double[] { 28.0, 50.0 }, false, false);
        
             }
        
         
      • findLocation

        public LocationAnalystResult findLocation(LocationAnalystParameter parameter)
        根据给定的参数进行选址分区分析。

        选址分区分析是为了确定一个或多个待建设施的最佳位置,使得设施可以用一种最经济有效的方式为需求方提供服务或者商品。选址分区不仅仅是一个选址过程,还要将需求点的需求分配到相应的设施的服务区中,因此称之为选址与分区。

        • 资源供给中心与需求点
        • 资源供给中心:即中心点,是提供资源和服务的设施,对应于网络结点,资源供给中心的相关信息包括最大阻力值、资源供给中心类型,资源供给中心在网络中所处结点的 ID 等。

          需求点:通常是指需要资源供给中心提供的服务和资源的位置,也对应于网络结点。

          最大阻力值用来限制需求点到资源供给中心的花费。如果需求点到此资源供给中心的花费大于最大阻力值,则该需求点被过滤掉,即该资源供给中心不能服务到此需求点。

          资源供给中心分为三种:非中心点,固定中心点和可选中心点。固定中心点是指网络中已经存在的、已建成或已确定要建立的服务设施(扮演资源供给角色);可选中心点是指可以建立服务设施的资源供给中心,即待建服务设施将从这些可选中心点中选址;非中心点在分析时不予考虑,在实际中可能是不允许建立这项设施或者已经存在了其他设施。

          另外,分析过程中使用的需求点都为网络结点,即除了各种类型的中心点所对应的网络结点,所有网络结点都作为资源需求点参与选址分区分析,如果要排除某部分结点,可以将其设置为障碍点。

        • 是否从资源供给中心分配资源
        • 选址分区可以选择从资源供给中心开始分配资源,或不从资源供给中心分配:

          • 从中心点开始分配(供给到需求)的例子:
          • 电能是从电站产生,并通过电网传送到客户那里去的。在这里,电站就是网络模型中的中心,因为它可以提供电力供应。电能的客户沿电网的线路(网络模型中的弧段)分布,他们产生了“需求”。在这种情况下,资源是通过网络由供方传输到需要来实现资源分配的。

          • 不从中心点开始分配(需求到供给)的例子:
          • 学校与学生的关系也构成一种在网络中供需分配关系。学校是资源提供方,它负责提供名额供适龄儿童入学。适龄儿童是资源的需求方,他们要求入学。作为需求方的适龄儿童沿街道网络分布,他们产生了对作为供给方的学校的资源--学生名额的需求。

        • 应用实例
        • 某个区域目前有 3 所小学,根据需求,拟在该区域内再建立 3 所小学。选择了 9 个地点作为待选地点,将在这些待选点中选择 3 个最佳地点建立新的小学。如图 1 所示,已有的 3 所小学为固定中心点,7 个候选位置为可选中心点。新建小学要满足的条件为:居民点中的居民步行去学校的时间要在 30 分钟以内。选址分区分析会根据这一条件给出最佳的选址位置,并且圈出每个学校,包括已有的 3 所学校的服务区域。如图 2 所示,最终序号为 5、6、8 的可选中心点被选为建立新学校的最佳地点。

          备注:下面两幅中的网络数据集的所有网络结点被看做是该区域的居民点全部参与选址分区分析,居民点中的居民数目即为该居民点所需服务的数量。

        资源供给中心及其类型和最大阻力值,是否从资源供给中心分配,期望分析出的资源供给中心数目等,均在 LocationAnalystParameter 类型的参数 parameter 中指定,具体含义参见 LocationAnalystParameter 类。

        参数:
        parameter - 选址分析参数对象。
        返回:
        选址分析结果对象。
        Example:
        以下代码示例了根据期待中心点数量,从中心点开始分配进行选址分区分析。下面函数中操作的网络数据集为安装目录\SampleData\changchun\下的 changchun.udb 数据源中的名为 RoadNet 的网络数据集。
         public void FindLocationExample(DatasetVector networkDataset)
             {
                 //构造交通网络分析环境设置对象,进行相应设置
                 TransportationAnalystSetting setting = new TransportationAnalystSetting();
                 setting.setNetworkDataset (networkDataset);
                 setting.setEdgeIDField ("SmID");
                 setting.setNodeIDField ("SmNodeID");
                 setting.setTolerance (89.00);
        
                 //设置权重信息
                 WeightFieldInfos weightFieldInfos = new WeightFieldInfos();
                 WeightFieldInfo weightFieldInfo = new WeightFieldInfo();
                 weightFieldInfo.setFTWeightField ("SmLength");
                 weightFieldInfo.setTFWeightField ("SmLength");
                 weightFieldInfo.setName ("Length");
                 weightFieldInfos.add(weightFieldInfo);
                 setting.setWeightFieldInfos (weightFieldInfos);
                 setting.setFNodeIDField ("SmFNode");
                 setting.setTNodeIDField ("SmTNode");
        
                 //构造交通网络分析对象,加载环境设置对象
                 TransportationAnalyst transportationAnalyst = new TransportationAnalyst();
                 transportationAnalyst.setAnalystSetting (setting);
                 transportationAnalyst.load();
        
                 //构造交通网络分析参数,进行相应设置
                 LocationAnalystParameter parameter = new LocationAnalystParameter();
        
                 //构造5个资源供给中心对象并进行相应设置
                 int[] id = { 3534, 1190, 1384, 4503, 5416 };
                 for (int i = 0; i < id.length; i++)
                 {
                     SupplyCenter supplyCenter = new SupplyCenter();
                     supplyCenter.setID (id[i]);
                     supplyCenter.setMaxWeight( 7000);
                     supplyCenter.setType (SupplyCenterType.OPTIONALCENTER);
                     // 添加资源供给中心对象到集合
                     parameter.getSupplyCenters().add(supplyCenter);
                 }
                 parameter.setFromCenter ( true);
                 parameter.setExpectedSupplyCenterCount (5);
                 parameter.setWeightName (weightFieldInfo.getName());
        
                 //进行选址分析,返回选址分析结果
                 LocationAnalystResult result = transportationAnalyst.findLocation(parameter);
        
                 //返回需求结果的相关信息
                 DemandResult[] demandResult = result.getDemandResults();
                 System.out.println(demandResult[1].getID());
                 System.out.println(demandResult[1].getSupplyCenterID());
             }
         
      • computeWeightMatrix

        public double[][] computeWeightMatrix(TransportationAnalystParameter parameter)
        计算给定点的耗费矩阵。该矩阵是一个二维 double 数组,存储了任意两点间的最小耗费。

        该方法可以计算指定的结点(或坐标点)间的耗费矩阵。可以通过 TransportationAnalystParameter 对象的 setNodes 方法指定待计算耗费矩阵的结点,通过 setPoints 方法指定待计算的坐标点,注意二者互斥,如果同时设置,则只有分析前最后的设置有效。例如,先指定了结点集合,又指定了坐标点集合,然后分析,此时只对坐标点进行分析。

        该方法将计算两点间的最小耗费,也就是两点间最佳路径的耗费,并且设置障碍点或障碍边有效,与 findPath 方法的结果耗费一致。

        耗费矩阵为一个等长二维数组,元素的索引与指定的被计算点的索引一致,例如,元素 [1,2] 的值为点集合中索引为 1 的点到索引为 2 的点的最小耗费。注意,计算结果包含点自身到自身的耗费,并且为 0。

        参数:
        parameter - 指定的交通网络分析参数。
        返回:
        一个存储任意两点间耗费的二维矩阵。
        Example:
        以下代码示例了根据输入的交通网络分析参数返回一个耗费矩阵。下面函数中操作的网络数据集为安装目录\SampleData\changchun\下的 changchun.udb 数据源中的名为 RoadNet 的网络数据集。
         public void ComputeWeightMatrixExample(DatasetVector networkDataset)
             {
                 //创建交通网络分析参数对象并进行相应设置
                 TransportationAnalystSetting transportationAnalystSetting = new TransportationAnalystSetting();
                 transportationAnalystSetting.setNetworkDataset(networkDataset);
                 transportationAnalystSetting.setNodeIDField ("SmNodeID");
                 transportationAnalystSetting.setEdgeIDField ("SmID");
                 transportationAnalystSetting.setTolerance (89.00);
        
                 //设置权重信息
                 WeightFieldInfos weightInfos = new WeightFieldInfos();
                 WeightFieldInfo weightInfo = new WeightFieldInfo();
                 weightInfo.setFTWeightField ("SmLength");
                 weightInfo.setTFWeightField ("Smlength");
                 weightInfo.setName ("Name");
                 weightInfos.add(weightInfo);
                 transportationAnalystSetting.setWeightFieldInfos (weightInfos);
        
                 //创建交通网络分析对象并设置分析环境对象
                 TransportationAnalyst transportationAnalyst = new TransportationAnalyst();
                 transportationAnalyst.setAnalystSetting (transportationAnalystSetting);
        
                 //加载网络模型
                 transportationAnalyst.load();
        
                 //构造交通网络分析参数设置对象,设置权重名称、设置结点ID数组
                 TransportationAnalystParameter parameter = new TransportationAnalystParameter();
                 parameter.setWeightName(weightInfo.getName());
                 int[] nodes = { 3534, 3000, 3820 };
                 parameter.setNodes (nodes);
        
                 //创建耗费矩阵分析,返回二维数组
                 double[][] matrix = transportationAnalyst.computeWeightMatrix(parameter);
        
                 //释放资源
                 workspace.dispose();
             }
      • check

        public TransportationAnalystCheckResult check()
        对交通网络数据集和转向表进行数据检查,返回交通网络分析数据检查结果对象。

        该方法用于对交通网络数据集和转向表进行检查,给出错误信息,便于用户针对错误信息对数据进行修改,以避免由于数据错误导致交通网络分析错误。

        注意,该方法需要在设置交通网络分析环境(setAnalystSetting 方法)之后调用,但不需要加载网络模型(load 方法)。

        如果在交通网络分析环境(TransportationAnalystSetting)中没有指定转向表,则不会检查转向表。

        该方法返回一个交通网络分析数据检查结果(TransportationAnalystCheckResult)对象,通过该对象的 getArcErrorInfos 方法和 getNodeErrorInfos 方法可以返回网络数据集的弧段错误信息和结点错误信息;通过 getTurnErrorInfos 方法可以返回转向表的错误信息。错误信息分别存储在三个映射(HashMap)中,键代表错误弧段或结点的 SMID,值代表错误类型。错误类型以数字表示,代表的具体错误含义如下表所示。

        1. 对网络数据集进行检查的结果错误类型如下表所示:
        2. 对转向表进行检查的结果错误类型如下表所示:
        返回:
        交通网络分析数据检查结果。
      • createModel

        public boolean createModel(java.lang.String filePath)
        创建内存文件。

        该接口需要在调用完load()接口后调用,可以生成对应load()的内存文件。

        参数:
        filePath - 创建内存文件的路径。文件的后缀名是'.snm'。
        返回:
        内存文件是否生成成功。
      • loadModel

        public boolean loadModel(java.lang.String filePath,
                                 DatasetVector networkDataset)
        加载内存文件。

        生成文件所用到的网络数据集需和该接口传入的网络数据集一样,否则加载会失败。

        参数:
        filePath - 内存文件的路径。
        networkDataset - 所用到的网络数据集。
        返回:
        网络模型是否加载成功。