com.supermap.analyst.trafficanalyst
类 TransferAnalyst

java.lang.Object
  继承者 com.supermap.analyst.trafficanalyst.TransferAnalyst

public class TransferAnalyst
extends java.lang.Object

公交分析类。 该类主要用于进行公交换乘分析、根据经过的站点查询公交线路的信息、查询指定公交线路上的站点的信息。

有关公交分析的详细介绍,请参阅《公交分析》技术文档。

示例:
请参见 load 方法、findTransferSolutions方法、findLinesByStop 方法和 findStopsByLine 方法的示例。

构造方法摘要
TransferAnalyst()
          构造一个新的 TransferAnalyst 对象。
 
方法摘要
 boolean check(TransferAnalystSetting transferAnalystSetting)
          根据公交分析环境设置对公交数据进行检查,检查出的错误写入源数据属性表中。
 void dispose()
          释放该对象所占用的资源。
 LineInfo[] findLinesByStop(long stopID)
          根据指定的公交站点 ID 查找经过该站点的公交线路。
 StopInfo[] findStopsByLine(long lineID)
          根据指定的公交线路 ID 查找该线路经过的站点。
 TransferAnalystResult findTransferLines(TransferAnalystParameter parameter)
          已过时。  
 TransferSolutions findTransferSolutions(TransferAnalystParameter parameter)
          根据指定的公交换乘分析参数对象进行公交换乘分析,返回公交换乘方案集合。
 TransferGuide getDetailInfo(long startID, long endID, TransferLine[] transferLines)
          根据起始站点 ID、终止站点 ID 和乘车段集合返回完整的公交换乘导引。
 TransferGuide getDetailInfo(Point2D startPoint, Point2D endPoint, TransferLine[] transferLines)
          根据起点、终点和乘车段集合返回完整的公交换乘导引。
 boolean load(LineSetting lineSetting, StopSetting stopSetting, RelationSetting relationSetting)
          已过时。 该方法已废弃,使用 load()替代。 使用公交分析基础功能时,加载公交数据。注意,该方法不支持多线程处理,否则可能出错。

该方法用于使用基本公交功能时,根据公交站点环境设置(StopSetting)、公交线路环境设置(LineSetting)和公交关系设置(RelationSetting)来加载公交数据。公交分析的基础功能是指能够进行一般的站点或线路查询、公交换乘分析,不能通过公交分析环境设置对象(TransferAnalystSetting)对站点捕捉容限、站点归并容限、步行阈值等参数进行设置,因此进行公交换乘分析时,只给出基本的换乘线路。

注意:如果修改了公交线路环境设置、公交站点环境设置和公交关系设置,或者对公交数据进行了修改,必须先调用 dispose 方法释放 TransferAnalyst 对象所占用的资源,然后重新调用 load 方法来加载公交数据,否则可能出错。

 boolean load(TransferAnalystSetting transferAnalystSetting)
          根据公交分析环境设置加载公交数据。
 
从类 java.lang.Object 继承的方法
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

TransferAnalyst

public TransferAnalyst()
构造一个新的 TransferAnalyst 对象。

方法详细信息

check

public boolean check(TransferAnalystSetting transferAnalystSetting)
根据公交分析环境设置对公交数据进行检查,检查出的错误写入源数据属性表中。注意,该方法不支持多线程处理,否则可能出错。

公交数据可能由于测量误差、数据制作人员失误等原因出现错误,从而可能导致公交分析的结果不正确。此时,可通过该方法进行检查。注意,检查的前提是已经设置好分析环境设置(TransferAnalystSetting),系统需要根据公交分析环境的设置进行检查,例如,站点捕捉容限(setSnapTolerance)用于对站点与线路关系进行检查,检查站点是否能被捕捉到对应的线路上。

检查成功后,系统将自动在站点、线路数据集的属性表、站点与线路关系数据集和站点与轨道交通出入口关系数据集的属性表中添加一个文本型字段,名称为“Sm_ErrorInfo”,写入对应的错误信息。各个数据集对应的错误信息内容及说明如下表所示。

使用者可针对错误信息进行修改,严格意义上来讲,应反复检查反复修改直至没有错误被检查出来,之后才能通过 load 方法加载公交数据。

参数:
transferAnalystSetting - 指定的公交分析环境设置对象。
返回:
一个布尔值,表示是否检查出错误。如果检查成功且没有检查出错误返回 true,否则返回 false。
示例:
请参见 load 方法的示例。

load

public boolean load(LineSetting lineSetting,
                    StopSetting stopSetting,
                    RelationSetting relationSetting)
已过时。 该方法已废弃,使用 load()替代。 使用公交分析基础功能时,加载公交数据。注意,该方法不支持多线程处理,否则可能出错。

该方法用于使用基本公交功能时,根据公交站点环境设置(StopSetting)、公交线路环境设置(LineSetting)和公交关系设置(RelationSetting)来加载公交数据。公交分析的基础功能是指能够进行一般的站点或线路查询、公交换乘分析,不能通过公交分析环境设置对象(TransferAnalystSetting)对站点捕捉容限、站点归并容限、步行阈值等参数进行设置,因此进行公交换乘分析时,只给出基本的换乘线路。

注意:如果修改了公交线路环境设置、公交站点环境设置和公交关系设置,或者对公交数据进行了修改,必须先调用 dispose 方法释放 TransferAnalyst 对象所占用的资源,然后重新调用 load 方法来加载公交数据,否则可能出错。

参数:
lineSetting - 指定的公交线路环境设置。
stopSetting - 指定的公交站点环境设置。
relationSetting - 指定的公交关系设置。
返回:
一个布尔值,表示是否加载公交数据成功。如果成功返回 true,否则返回 false。

load

public boolean load(TransferAnalystSetting transferAnalystSetting)
根据公交分析环境设置加载公交数据。注意,该方法不支持多线程处理,否则可能出错。

该方法用于根据公交分析环境设置(TransferAnalystSetting )对象中所进行的设置来加载公交数据。成功加载公交数据是进行公交分析的前提,因此建议在加载公交数据前,先使用 check 方法对数据进行检查。

注意:出现以下两种情况都必须重新调用 load 方法来加载公交数据,然后再进行分析,并且在重新调用前,必须先调用 dispose 方法释放 TransferAnalyst 对象所占用的资源,否则可能出错。

  1. 对公交分析环境设置对象的参数进行了修改,需要重新调用该方法,否则所作修改不会生效从而导致分析结果错误;
  2. 对所使用的公交数据进行了任何修改,包括修改数据集中的数据、替换数据集等,都需要重新调用该方法来加载公交数据,否则分析可能出错。

参数:
transferAnalystSetting - 指定的公交分析环境设置。
返回:
一个布尔值,表示是否加载公交数据成功。如果成功返回 true,否则返回 false。
示例:
以下代码示范了如何加载公交数据。

本示例使用的数据为 SuperMap 组件产品安装目录\SampleData\City\下的 Changchun.udb 数据源。使用以下代码时,请确保已经存在一个名为 m_datasource 的 Datasource,并打开该数据源。

private void loadExample() {
                try {
                        // 设置公交线路环境
                        LineSetting lineSetting = new LineSetting();
                        lineSetting.setDataset((DatasetVector) m_datasource.getDatasets()
                                        .get("BusLine"));
                        lineSetting.setLineIDField("LINEID");
                        lineSetting.setNameField("NAME");
                        lineSetting.setLengthField("SMLENGTH");
                        lineSetting.setLineTypeField("LINETYPE");
                        // 设置票价信息
                        FareFieldInfo fareFieldInfo = new FareFieldInfo();
                        fareFieldInfo.setFareTypeField("FARETYPE");
                        fareFieldInfo.setStartFareField("STARTFARE");
                        fareFieldInfo.setStartFareRangeField("STARTFARERANGE");
                        fareFieldInfo.setFareStepField("FARESTEP");
                        fareFieldInfo.setFareStepRangeField("FARESTEPRANGE");
                        lineSetting.setFareFieldInfo(fareFieldInfo);
                        // 根据线路数据的实际情况,还可以设置线路类型、首班和末班的发车时间、发车间隔等信息

                        // 设置公交站点环境
                        StopSetting stopSetting = new StopSetting();
                        stopSetting.setDataset((DatasetVector) m_datasource.getDatasets()
                                        .get("BusPoint"));
                        stopSetting.setStopIDField("STOPID");
                        stopSetting.setNameField("NAME");

                        // 设置公交关系
                        RelationSetting relationSetting = new RelationSetting();
                        relationSetting.setDataset((DatasetVector) m_datasource
                                        .getDatasets().get("LineStopRelation"));
                        relationSetting.setLineIDField("LINEID");
                        relationSetting.setStopIDField("STOPID");
                        // 设置网络数据集的信息
                        relationSetting.setDatasetNetwork((DatasetVector) m_datasource
                                        .getDatasets().get("RoadNet"));
                        relationSetting.setEdgeIDField("SMEDGEID");
                        relationSetting.setNodeIDField("SMNODEID");
                        relationSetting.setFNodeIDField("SMFNODE");
                        relationSetting.setTNodeIDField("SMTNODE");

                        // 设置公交分析环境
                        TransferAnalystSetting transferAnalystSetting = new TransferAnalystSetting();
                        transferAnalystSetting.setLineSetting(lineSetting);
                        transferAnalystSetting.setStopSetting(stopSetting);
                        transferAnalystSetting.setRelationSetting(relationSetting);
                        transferAnalystSetting.setSnapTolerance(50);
                        transferAnalystSetting.setWalkingTolerance(1000);
                        transferAnalystSetting.setUnit(Unit.METER);

                        // 加载公交分析环境设置
                        TransferAnalyst transferAnalyst = new TransferAnalyst();
                        // 对公交数据进行检查,检查无错误之后才加载
                        Boolean isChecked = transferAnalyst.check(transferAnalystSetting);
                        if (isChecked) {
                                Boolean isLoad = transferAnalyst.load(transferAnalystSetting);
                                if (isLoad) {
                                        System.out.println("加载公交数据成功!");
                                } else {
                                        System.out.println("加载失败!请检查公交分析环境设置。");
                                }
                        }
                } catch (Exception Err) {
                        System.out.println(Err.getMessage());
                }
        }
 

findTransferLines

public TransferAnalystResult findTransferLines(TransferAnalystParameter parameter)
已过时。 

公交换乘分析试用接口。根据指定的公交换乘分析参数对象进行公交换乘分析,返回公交分析结果。

通过该方法可以试用公交换乘分析功能。该方法针对给定的起点(或起始站点)和终点(或终止站点)分析满足用户需求的公交换乘导引。如果想获得公交换乘方案请使用 findTransferSolutions 方法。

参数:
parameter - 指定的公交换乘分析参数对象。
返回:
公交分析结果对象。

findTransferSolutions

public TransferSolutions findTransferSolutions(TransferAnalystParameter parameter)
根据指定的公交换乘分析参数对象进行公交换乘分析,返回公交换乘方案集合。

SuperMap 的公交换乘分析,针对给定的起点和终点分析满足用户需求的公交换乘方案,起点和终点可以指定为坐标位置或者公交站点的 ID。使用者不仅可以在设置分析环境时自定义站点归并的最大距离、换乘时行走的最大距离,还可以通过公交换乘分析参数对象(TransferAnalystParameter)根据个人喜好设置换乘策略(如少换乘、少步行、较快捷、距离最短等)和偏好(如不乘地铁、优先乘公交汽车等)、换乘方案的最大数量等,系统会根据这些设置分析出最优的换乘方案,使用者不仅可以从中获得起点到终点的行驶导引,包括步行和乘车导引,还能够获得距离、出行费用等信息。

公交换乘方案(TransferSolution)与公交换乘导引(TransferGuide)

公交换乘方案与公交换乘导引的区别就在于:

那么,想要获得完整、详细的公交换乘分析结果,就需要两步:首先获取公交换乘方案,然后获取换乘导引。

  1. 首先,调用 findTransferSolutions 方法进行公交换乘分析,返回的结果为公交换乘方案集合(TransferSolutions)对象,是公交换乘方案(TransferSolution)的集合。在这里,公交换乘方案包含了完整换乘线路中的所有的乘车段集合(TransferLines),而一个乘车段(TransferLine)表示一段乘车路线,它包含从上车站点能够到达下车站点的所有路线。
  2. 然后,从上一步获得的每一个换乘段集合中选择一个乘车段,采用数组结构作为参数传入 TransferAnalyst 类的 getDetailInfo 方法(或其重载方法)来获取换乘导引(TransferGuide)。换乘导引中包含所有的换乘导引子项(TransferGuideItem),通过这些子项可以获取到一条完整公交换乘线路中的所有乘车路线和步行路线的信息。获得这些信息后,再与对应的换乘方案的概括信息相结合,组织出详细的、完整的公交换乘指导方案。

参数:
parameter - 指定的公交换乘分析参数对象。
返回:
公交换乘方案集合。
示例:
以下代码示范了如何进行公交换乘分析。

使用以下代码时,需确保已经设置了公交分析环境(TransferAnalystSetting)。

 private void findTransferSolutionsExample(
                        TransferAnalystSetting transferAnalystSetting, long startStopID,
                        long endStopID) {
                try {
                        // 实例化一个公交分析对象
                        TransferAnalyst transferAnalyst = new TransferAnalyst();

                        // 加载公交数据
                        Boolean isLoad = false;
                        isLoad = transferAnalyst.load(transferAnalystSetting);

                        if (isLoad) {
                                // 实例化一个公交换乘分析参数设置对象,并设置相关参数
                                TransferAnalystParameter parameter = new TransferAnalystParameter();
                                parameter.setSearchMode(TransferSearchMode.ID);
                                parameter.setStartStopID(startStopID);
                                parameter.setEndStopID(endStopID);
                                parameter.setSolutionCount(5);
                                parameter.setWalkingRatio(2);
                                // 设置优先与避让的站点和线路
                                parameter.setEvadeStops(new long[] { 57L, 92L });
                                parameter.setEvadeLines(new long[] { 25L });
                                parameter.setPriorLines(new long[] { 3L, 9L });
                                parameter.setPriorStops(new long[] { 50L, 90L, 159L });
                                // 设置换乘策略为“少换乘”
                                parameter.setTactic(TransferTactic.LESS_TRANSFER);

                                // 调用findTransferLines方法进行公交换乘分析并获得公交换乘方案集合对象
                                TransferSolutions solutions = transferAnalyst
                                                .findTransferSolutions(parameter);

                                TransferSolution solution = null;
                                String summary = "";

                                for (int i = 0; i < solutions.getCount(); i++) {
                                        solution = solutions.get(i);
                                        // 一条具体的公交换乘路线的乘车段数组
                                        TransferLine[] linesOnOne = new TransferLine[solution
                                                        .getTransferTime() + 1];
                                        summary += "方案 " + ( i + 1) + ":\n";
                                        TransferLines lines = null;
                                        for (int j = 0; j < solution.getTransferTime() + 1; j++) {
                                                lines = solution.get(j);
                                                // 这里只获得每个方案中的第一个具体路线
                                                linesOnOne[j] = lines.get(0);
                                                for (int k = 0; k < lines.getCount(); k++) {
                                                        if (k == 0) {
                                                                summary += "在" + lines.get(0).getOnName()
                                                                                + "乘坐" + lines.get(0).getLineName();
                                                        } else {
                                                                summary += "或" + lines.get(k).getLineName();
                                                        }
                                                }
                                                summary += "在" + lines.get(0).getDownName() + "下车\n";
                                        }

                                        // 获取行驶导引
                                        TransferGuide transferGuide = transferAnalyst
                                                        .getDetailInfo(startStopID, endStopID, linesOnOne);
                                        TransferGuideItem item = null;
                                        String guide = "";
                                        for (int m = 0; m < transferGuide.getCount(); m++) {
                                                item = transferGuide.get(m);
                                                if (!item.isWalking())// 行驶导引子项是乘车路线
                                                {
                                                        guide += "从" + item.getStartName() + "乘坐"
                                                                        + item.getLineName() + "经过"
                                                                        + item.getPassStopCount() + "站,在"
                                                                        + item.getEndName() + "下车,距离为"
                                                                        + item.getDistance() + ",费用为"
                                                                        + item.getFare() + "\n";
                                                } else {
                                                        // 行驶导引子项是步行
                                                        if (m == transferGuide.getCount() - 1) {
                                                                guide += "步行至终点,距离为" + item.getDistance() + "\n";
                                                        } else {
                                                                guide += "步行至"
                                                                                + transferGuide.get(m + 1)
                                                                                                .getStartName() + "距离为"
                                                                                + item.getDistance() + "\n";
                                                        }
                                                }
                                        }
                                        summary += "总距离约为:" + transferGuide.getTotalDistance()
                                                        + ",总费用为:" + transferGuide.getTotalFare() + "\n";
                                        summary += guide;
                                }
                                System.out.println(summary);
                        }
                } catch (Exception ex) {
                        System.out.println(ex);
                }
        }
 

getDetailInfo

public TransferGuide getDetailInfo(long startID,
                                   long endID,
                                   TransferLine[] transferLines)
根据起始站点 ID、终止站点 ID 和乘车段集合返回完整的公交换乘导引。

注意,该方法通过 transferLines 参数指定的乘车段数组的含义与乘车段集合对象 TransferLines 的含义不同。具体请参见 getDetailInfo 方法的介绍。

参数:
startID - 指定的公交换乘分析的起始站点 ID。
endID - 指定的公交换乘分析的终止站点 ID。
transferLines - 指定的乘车段数组。
返回:
完整的公交换乘导引。
示例:
请参见 findTransferSolutions 方法的示例。

getDetailInfo

public TransferGuide getDetailInfo(Point2D startPoint,
                                   Point2D endPoint,
                                   TransferLine[] transferLines)
根据起点、终点和乘车段集合返回完整的公交换乘导引。

注意,该方法通过 transferLines 参数指定的乘车段数组的含义与乘车段集合对象 TransferLines 的含义不同:

公交换乘分析后,从返回的公交换乘方案集合(TransferSolutions)中可以获得一个公交换乘方案(TransferSolution),从该换乘方案中可以得到所有乘车段集合(TransferLines)。而该方法中需要指定的 transferLines 参数,则是由每一个乘车段集合对象中的一个乘车段(TransferLine)对象共同构成的数组,这些乘车段是一个唯一的换乘方案中的所有乘车段按照次序的组合。注意,乘车段必须按照一定的次序写入数组,该次序即换乘方案中乘车段集合的次序,如果次序不正确,得到的换乘导引可能因此出现混乱的情况而与实际需求不符。

参数:
startPoint - 指定的公交换乘分析的起点。
endPoint - 指定的公交换乘分析的终点。
transferLines - 指定的乘车段数组。
返回:
完整的公交换乘导引。
示例:
请参见 findTransferSolutions 方法的示例。

findLinesByStop

public LineInfo[] findLinesByStop(long stopID)
根据指定的公交站点 ID 查找经过该站点的公交线路。

参数:
stopID - 指定的公交站点 ID。
返回:
经过该站点的公交线路信息对象集合。
示例:
以下代码示范了如何根据指定的公交站点 ID 来查找经过该站点的公交线路。

假设已经设置好了公交分析环境设置对象,名为“transferAnalystSetting”。关于如何设置公交分析环境 ,可参考 load 方法的示例。

                private void findLinesExample(
                        TransferAnalystSetting transferAnalystSetting, long stopID) {
                try {
                        // 实例化一个公交分析对象
                        TransferAnalyst transferAnalyst = new TransferAnalyst();

                        // 加载公交数据
                        Boolean isLoad = false;
                        isLoad = transferAnalyst.load(transferAnalystSetting);

                        if (isLoad) {
                                // 调用 FindLinesByStop 方法查找经过指定站点的线路
                                LineInfo[] lineInfos = transferAnalyst
                                                .findLinesByStop(stopID);
                                // 提取经过该站点的线路信息
                                String message = "经过该站点的公交线路有:\r";
                                for (int i = 0; i < lineInfos.length; i++) {
                                        LineInfo info = lineInfos[i];
                                        String lineInfo = "线路ID:" + info.getLineID() + ",线路名称:"
                                                        + info.getName() + ",该线路共有" + info.getStopCount()
                                                        + "站,总长为" + info.getTotalDistance() + "。";
                                        System.out.println(message + lineInfo);
                                }
                        }
                } catch (Exception Err) {
                        System.out.println(Err.getMessage());
                }
        }
 

findStopsByLine

public StopInfo[] findStopsByLine(long lineID)
根据指定的公交线路 ID 查找该线路经过的站点。

参数:
lineID - 指定的公交线路 ID。
返回:
经过该线路的公交站点信息对象集合。
示例:
以下代码示范了如何根据指定的公交线路 ID 来查找该线路包含哪些公交站点。

假设已经设置好了公交分析环境设置对象,名为“transferAnalystSetting”。关于如何设置公交分析环境 ,可参考 load 方法的示例。

                private void findStopsExample(
                        TransferAnalystSetting transferAnalystSetting, long lineID) {
                try {
                        // 实例化一个公交分析对象
                        TransferAnalyst transferAnalyst = new TransferAnalyst();

                        // 加载公交数据
                        Boolean isLoad = false;
                        isLoad = transferAnalyst.load(transferAnalystSetting);

                        if (isLoad) {
                                // 调用 FindStopsByLine 方法查找指定线路上的站点
                                StopInfo[] stopInfos = transferAnalyst.findStopsByLine(lineID);
                                // 提取该线路上的站点名称
                                String message = "位于该线路上的站点有:\r";
                                for (int i = 0; i < stopInfos.length; i++) {
                                        message += "站点 ID:" + stopInfos[i].getStopID() + ",站点名称:"
                                                        + stopInfos[i].getName() + "\r";
                                }
                                System.out.println(message);
                        }
                } catch (Exception Err) {
                        System.out.println(Err.getMessage());
                }
        }  
 

dispose

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