public class TransferAnalyst
extends com.supermap.data.InternalHandleDisposable
公交,即公共交通,包括道路运输、轨道运输及航空运输等,一直是人们出行最常使用的方式。公交分析的主要任务即输出从起点到终点的最符合人们出行需求(如少步行、少换乘)和偏好(如不乘地铁)的换乘方法。随着城市建设的快速步伐,公交基础设施的建设也得到了长足发展,为人们生活带来了极大便利。面对日趋复杂和多样化的公共交通网络,准确、人性化的公交换乘方案显得尤为重要,对人们的日常出行起到不可小觑的指引作用。
SuperMap 公交分析是针对如公交车、地铁、无轨电车等城市公交交通方式,以公交换乘分析(findTransferSolutions
方法)、查询经过站点的线路(findLinesByStop
方法)和线路有哪些站点(findStopsByLine
方法)为主要功能的分析模块。不仅支持丰富的线路和站点信息设置,如公交票价信息、发车时间和间隔等,还提供避开线路或站点、优先线路或站点、站点归并容限、站点捕捉容限、最大步行距离、换乘策略和偏好的设置,以及根据网路数据集给出步行线路的支持,结合高效、准确和灵活的查找算法,为使用者提供最优的公交换乘方案。
公交分析涉及五种数据:公交站点数据、公交线路数据、站点与线路关系数据、站点及出入口关系数据和网络数据集。目前这五种数据均需要使用者提供,其中前三种是必须具备的数据。
LineSetting
类的方法。StopSetting
类。RelationSetting
类。RelationSetting
类。RelationSetting
类。将现实世界公交系统中的公交站点和线路分别抽象为点数据和线数据,再通过站点与线路关系数据、站点与出入口数据,将线路与站点、站点与出入口建立起一定的逻辑关系,从而模拟现实世界的公交系统,如下图所示。
SuperMap 还提供数据检查功能。在设置了公交分析环境后,可对公交数据(除网络数据集外)进行检查,用户可以根据给出的错误信息对数据进行修改(通过普通的编辑方式进行修改即可),之后再加载公交数据。详细介绍请参见 check
方法。
StopSetting
)类设置公交站点数据的相关信息;LineSetting
)类设置公交线路数据的相关信息;RelationSetting
)类设置站点与线路关系、站点与出入口关系以及网络数据集的相关信息;TransferAnalystSetting
)类设置公交分析环境;check
方法对公交数据(除网络数据集外)进行数据检查,根据返回的错误信息对数据进行修改;
load
方法加载公交数据; findTransferSolutions
方法、findLinesByStop
方法、findStopsByLine
方法)进行相应的分析; findTransferSolutions
方法)后,还需要调用 getDetailInfo
方法(或其重载方法)来获取换乘导引; 有关公交分析的详细介绍,请参阅《公交分析》技术文档。
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)
已过时。
此方法已废弃,请使用新方法
TransferAnalyst.findTransferSolutions(TransferAnalystParameter) 替换。 |
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() 替代。
使用公交分析基础功能时,加载公交数据。注意,该方法不支持多线程处理,否则可能出错。
该方法用于使用基本公交功能时,根据公交站点环境设置( 注意:如果修改了公交线路环境设置、公交站点环境设置和公交关系设置,或者对公交数据进行了修改,必须先调用 |
boolean |
load(TransferAnalystSetting transferAnalystSetting)
根据公交分析环境设置加载公交数据。
|
@Deprecated public boolean load(LineSetting lineSetting, StopSetting stopSetting, RelationSetting relationSetting)
load()
替代。
使用公交分析基础功能时,加载公交数据。注意,该方法不支持多线程处理,否则可能出错。
该方法用于使用基本公交功能时,根据公交站点环境设置(StopSetting
)、公交线路环境设置(LineSetting
)和公交关系设置(RelationSetting
)来加载公交数据。公交分析的基础功能是指能够进行一般的站点或线路查询、公交换乘分析,不能通过公交分析环境设置对象(TransferAnalystSetting
)对站点捕捉容限、站点归并容限、步行阈值等参数进行设置,因此进行公交换乘分析时,只给出基本的换乘线路。
注意:如果修改了公交线路环境设置、公交站点环境设置和公交关系设置,或者对公交数据进行了修改,必须先调用 dispose
方法释放 TransferAnalyst
对象所占用的资源,然后重新调用 load 方法来加载公交数据,否则可能出错。
lineSetting
- 指定的公交线路环境设置。stopSetting
- 指定的公交站点环境设置。relationSetting
- 指定的公交关系设置。public boolean load(TransferAnalystSetting transferAnalystSetting)
该方法用于根据公交分析环境设置(TransferAnalystSetting
)对象中所进行的设置来加载公交数据。成功加载公交数据是进行公交分析的前提,因此建议在加载公交数据前,先使用 check
方法对数据进行检查。
注意:出现以下两种情况都必须重新调用 load
方法来加载公交数据,然后再进行分析,并且在重新调用前,必须先调用 dispose
方法释放
TransferAnalyst
对象所占用的资源,否则可能出错。
transferAnalystSetting
- 指定的公交分析环境设置。本示例使用的数据为 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()); } }
public boolean check(TransferAnalystSetting transferAnalystSetting)
公交数据可能由于测量误差、数据制作人员失误等原因出现错误,从而可能导致公交分析的结果不正确。此时,可通过该方法进行检查。注意,检查的前提是已经设置好分析环境设置(TransferAnalystSetting
),系统需要根据公交分析环境的设置进行检查,例如,站点捕捉容限(setSnapTolerance
)用于对站点与线路关系进行检查,检查站点是否能被捕捉到对应的线路上。
检查成功后,系统将自动在站点、线路数据集的属性表、站点与线路关系数据集和站点与轨道交通出入口关系数据集的属性表中添加一个文本型字段,名称为“Sm_ErrorInfo”,写入对应的错误信息。各个数据集对应的错误信息内容及说明如下表所示。
使用者可针对错误信息进行修改,严格意义上来讲,应反复检查反复修改直至没有错误被检查出来,之后才能通过 load
方法加载公交数据。
transferAnalystSetting
- 指定的公交分析环境设置对象。load
方法的示例。@Deprecated public TransferAnalystResult findTransferLines(TransferAnalystParameter parameter)
TransferAnalyst.findTransferSolutions(TransferAnalystParameter)
替换。通过该方法可以试用公交换乘分析功能。该方法针对给定的起点(或起始站点)和终点(或终止站点)分析满足用户需求的公交换乘导引。如果想获得公交换乘方案请使用 findTransferSolutions
方法。
parameter
- 指定的公交换乘分析参数对象。public TransferSolutions findTransferSolutions(TransferAnalystParameter parameter)
SuperMap 的公交换乘分析,针对给定的起点和终点分析满足用户需求的公交换乘方案,起点和终点可以指定为坐标位置或者公交站点的 ID。使用者不仅可以在设置分析环境时自定义站点归并的最大距离、换乘时行走的最大距离,还可以通过公交换乘分析参数对象(TransferAnalystParameter
)根据个人喜好设置换乘策略(如少换乘、少步行、较快捷、距离最短等)和偏好(如不乘地铁、优先乘公交汽车等)、换乘方案的最大数量等,系统会根据这些设置分析出最优的换乘方案,使用者不仅可以从中获得起点到终点的行驶导引,包括步行和乘车导引,还能够获得距离、出行费用等信息。
公交换乘方案(TransferSolution)与公交换乘导引(TransferGuide)
公交换乘方案与公交换乘导引的区别就在于:
那么,想要获得完整、详细的公交换乘分析结果,就需要两步:首先获取公交换乘方案,然后获取换乘导引。
findTransferSolutions
方法进行公交换乘分析,返回的结果为公交换乘方案集合(TransferSolutions
)对象,是公交换乘方案(TransferSolution
)的集合。在这里,公交换乘方案包含了完整换乘线路中的所有的乘车段集合(TransferLines
),而一个乘车段(TransferLine
)表示一段乘车路线,它包含从上车站点能够到达下车站点的所有路线。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); } }
public LineInfo[] findLinesByStop(long stopID)
stopID
- 指定的公交站点 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()); } }
public StopInfo[] findStopsByLine(long lineID)
lineID
- 指定的公交线路 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()); } }
public TransferGuide getDetailInfo(long startID, long endID, TransferLine[] transferLines)
注意,该方法通过 transferLines 参数指定的乘车段数组的含义与乘车段集合对象 TransferLines
的含义不同。具体请参见 getDetailInfo
方法的介绍。
startID
- 指定的公交换乘分析的起始站点 ID。endID
- 指定的公交换乘分析的终止站点 ID。transferLines
- 指定的乘车段数组。findTransferSolutions
方法的示例。public TransferGuide getDetailInfo(Point2D startPoint, Point2D endPoint, TransferLine[] transferLines)
注意,该方法通过 transferLines 参数指定的乘车段数组的含义与乘车段集合对象 TransferLines
的含义不同:
公交换乘分析后,从返回的公交换乘方案集合(TransferSolutions
)中可以获得一个公交换乘方案(TransferSolution
),从该换乘方案中可以得到所有乘车段集合(TransferLines
)。而该方法中需要指定的 transferLines 参数,则是由每一个乘车段集合对象中的一个乘车段(TransferLine
)对象共同构成的数组,这些乘车段是一个唯一的换乘方案中的所有乘车段按照次序的组合。注意,乘车段必须按照一定的次序写入数组,该次序即换乘方案中乘车段集合的次序,如果次序不正确,得到的换乘导引可能因此出现混乱的情况而与实际需求不符。
startPoint
- 指定的公交换乘分析的起点。endPoint
- 指定的公交换乘分析的终点。transferLines
- 指定的乘车段数组。findTransferSolutions
方法的示例。public void dispose()
Copyright © 2021–2024 SuperMap. All rights reserved.