公交分析 |
在加载了公交数据之后,就可以进行公交分析了。公交分析的主要功能包括:公交换乘分析和公交查询(查询经过站点的线路和查询线路上的站点)。
公交换乘分析是针对给定的起点和终点分析满足用户需求的公交换乘方案的过程。使用TransferAnalyst类的findTransSolutions方法可以实现公交换乘分析。
在调用findTransSolutions方法进行公交换乘分析前,先要通过公交换乘分析参数(TransferAnalystParameter)类对相关参数进行设置。这些参数主要用来设置分析的起点和终点、换乘策略、最大换乘导引数量、步行与乘车的权重比以及优先和避让的站点、线路等。系统会根据这些设置分析出最优的换乘方案提供给使用者。表列出了TransferAnalystParameter类的方法列表。
表 5.1 TransferAnalystParameter类的方法列表
类型 |
名称 |
描述 |
TransferSearchMode |
get/setSearchMode |
返回或设置公交换乘的搜索模式。 |
Int64 |
get/setStartStopID |
返回或设置公交换乘分析时输入的起始站点ID。 |
Int64 |
get/setEndStopID |
返回或设置公交换乘分析时输入的终止站点ID。 |
Point2D |
get/setStartPosition |
返回或设置公交换乘分析时输入的起点的坐标,可以为任意位置。 |
Point2D |
get/setEndPosition |
返回或设置公交换乘分析时输入的终点的坐标,可以为任意位置。 |
TransferTactic |
get/setTactic |
返回或设置公交换乘策略类型。 |
TransferPreference |
get/setPreference |
返回或设置乘车偏好。 |
int |
get/setSolutionCount |
返回或设置公交换乘分析返回的换乘方案的最大数量。 |
double |
get/setWalkingRatio |
返回或设置步行与乘车权重比。 |
long[] |
get/setPriorStops |
返回或设置优先站点的站点 ID 数组。 |
long[] |
get/setPriorLines |
返回或设置优先线路的线路 ID 数组。 |
long[] |
get/setEvadeStops |
返回或设置避让站点的站点 ID 数组。 |
long[] |
get/setEvadeLines |
返回或设置避让线路的线路 ID 数组。 |
搜索模式(get/setSearchMode)
公交换乘分析支持两种搜索模式,ID模式和Point模式,由TransferSearchMode类型定义。ID模式是指公交换乘的起点和终点使用站点ID进行分析;Point模式是指使用坐标位置(即Point2D对象)作为分析的起点和终点,分析时系统会自动寻找距离该点最近的公交站点。分析的起点和终点类型必须与搜索模式一致:如果设置公交换乘的搜索模式为ID模式,则必须设置起始站点ID(setStartStopID方法)和终止站点ID(setEndStopID方法);如果设置公交换乘的搜索模式为坐标点模式,则必须设置起点坐标(setStartPosition方法)和终点坐标(setEndPosition方法)。如果不一致,换乘分析将失败并返回null。
公交换乘策略(get/setTactic)
在公交换乘时,出行者往往有不同的需求和偏好,如尽量少步行、少换乘、尽快到达目的地等。通过该方法设置了换乘策略后,进行公交换乘分析时,会为分析者优先提供满足策略要求的换乘方案。TransferTactic枚举类型提供了五种换乘策略,包括:少换乘(LESS_TRANSFER)、少步行(LESS_WALK)、距离最短(MIN_DISTANCE)和较快捷(LESS_TIME)。
公交换乘方案的排序涉及到多个参数,如公交分析环境设置( TransferAnalystSetting)中的步行阈值、站点归并容限等,公交换乘分析参数设置( TransferAnalystParameter)中的乘车策略、乘车偏好、步行与乘车权重比等。因此,无论选择何种换乘策略,都需要结合其他参数进行加权计算,得出最优换乘方案。例如,距离最短换乘策略,是指根据所有相关参数的设置进行加权计算,最后按照加权总距离由短到长的顺序对换乘方案排序,而非单纯按照乘车和步行的总距离作为判断标准。
l 少换乘:优先从起点到终点需要换乘的次数较少的换乘方案。如果换乘次数相同,则优先加权总距离小的方案。
l 少步行:优先从起点到终点需要步行的距离较短且加权总距离较短的换乘方案。
l 距离最短:优先从起点到终点加权总距离最短的换乘方案。
l 较快捷:优先从起点到终点耗费最少的换乘方案。
乘车偏好(get/setPreference)
乘车偏好设置支持对公共交通工具进行选择,如不乘地铁、优先公交汽车等,可以和换乘策略、优先和避让配合使用,使公交换乘分析的结果更加灵活和满足出行者的多样需求。TransferPreference类定义了乘车偏好的类型,包括无偏好(NONE)、优先乘坐公交汽车(BUS)、优先乘坐地铁(SUBWAY)和不乘地铁(NO_SUBWAY)。需要特别注意,目前,乘车偏好主要是根据线路的类型来划分的。因此,乘车偏好是否有效还要取决于公交线路数据中是否包含线路类型的属性信息,并且该属性字段的值必须与要求一致。具体介绍请参见LineSetting类的setLineTypeField方法。
公交换乘方案的最大数量(get/setSolutionCount)
根据实际参数的设置不同,公交换乘分析得出的换乘方案的实际数量可能小于或等于该值。
步行与乘车权重比(get/setWalkingRatio)
该权重比可理解为步行1公里相当于乘车几公里,用于评价公交换乘的各种方案。因为有方案数量的限制(setSolutionCount方法),所以就需要在所有方案中进行优选。
通过下面的例子来理解步行与乘车权重比的作用。例如现在有两种换乘方案:
方案1:坐车10公里,走路1公里;
方案2:坐车15公里,走路0.5公里;
假设权重比为15:
方案1的总消耗为:10 + 1*15 = 25
方案2的总消耗为:15 + 0.5*15 = 22.5
此时方案2较好;
假设权重比为2:
方案1的总消耗为:10 + 1*2 = 12
方案2的总消耗为:15 + 0.5*2 = 17
此时方案1较好。
优先与避让(get/setPriorLines 、get/setPriorStops 、get/setEvadeLines 、get/setEvadeStops )
在进行公交换乘分析时,支持设置优先的站点或线路,避让的站点或线路。优先与避让的设置是通过相关方法指定站点ID或线路ID数组来实现的。如果设置某些线路或站点为避让线路或站点,则分析时不会使用这些线路或站点,例如,设置123路为避让线路,则进行公交换乘分析,即使乘坐该线路可以到达目的地,换乘方案中也不会包含乘坐该线路的方案;如果设置为优先线路或站点,则进行换乘分析时会优先考虑这些线路和站点,但最优换乘方案是由多个参数共同决定的,因此并不一定会包含这些线路或站点。
注意,如果将某线路(或站点)同时设置为优先或者避让的线路(或站点),系统将以避让线路(或站点)来处理。另外,优先或避让的站点必须是线路上的站点,例如,某站点在位置上位于某条线路上,但在关系表中不存在二者的对应关系,那么设置该站点为避让站点是无效的,换乘分析的结果中仍有可能包含通过该站点的线路。
完成公交换乘分析参数设置后,就可以调用findTransSolutions方法来进行公交换乘分析。
语法:
public TransferSolutions findTransSolutions(TransferAnalystParameter parameter)
参数说明:
parameter:指定的公交换乘分析参数对象。
返回值说明:
返回公交换乘方案集合对象。
此外,SuperMap还提供了公交换乘分析的试用接口:findTransferLines方法,详细介绍请参阅联机帮助文档的程序员参考。
完整的公交换乘结果包括公交换乘方案(TransferSolution)和公交换乘导引(TransferGuide),二者区别在于换乘方案提供概括方案,而换乘导引提供一个具体的完整的公交换乘路线的详细信息。
换乘方案只包含乘车路线,而每一段乘车路线包含了所有可行的公交线路。如图5-1(上)所示,从起点到终点的一个换乘方案告诉我们,在 A 站上车乘坐 1(或 2 或 3)路到达 B 站,再从 C 站乘坐 4(或 5)路到达 D 站。
但通常一条完整的公交出行线路应包含更多的信息,比如,从起点到达乘车站点、从下车站点到达另一换乘站点、从下车站点到达终点的步行路线,各乘车段或步行段的距离、乘车段的花费和时间等,此时就需要得到换乘导引。 换乘导引由步行、每一个乘车段集合中的一个乘车段,以及它们对应的几何对象、距离、时间以及其他属性信息构成。如图5-1(下)所示,一个换乘导引描述了从起点到终点之间的一条公交换乘路线:从起点步行至 A 站,乘坐 1 路到达 B 站,再步行至 C 站,乘坐 5 路到达 D 站,然后步行至终点。
|
图 5‑1 公交换乘方案与公交换乘导引 |
因此,要获得完整的公交换乘分析结果需要两步:首先获取公交换乘方案,然后获得对应的换乘导引。
1. 首先,调用findTransSolutions方法进行公交换乘分析可以得到公交换乘方案集合(TransferSolutions)对象。从该对象可以通过指定索引值获得集合中的一个换乘方案(TransferSolution)。在这里,公交换乘方案是完整换乘线路中的所有乘车段(TransferLines)的集合,一个乘车段表示完整换乘线路中的一段乘车路线,它包含从上车站点到达下车站点的所有线路。也就是说,在这里公交换乘方案是一个概括的换乘方案。
2. 然后从上一步获得的每一个换乘段集合中选择一个乘车段,采用数组结构作为参数传入TransferAnalyst类的getDetailInfo方法,该方法将返回的对应的公交换乘导引(TransferGuide)。通过TransferGuide类的get方法可以获取公交换乘导引子项(TransferGuideItem对象),每一个导引子项可以表示一段乘车或者步行路线。从行驶导引子项中可以获得该段乘车或步行路线的详细信息,将这些信息与对应的换乘方案的概括信息相结合,从而组织出详细的、完整的公交换乘指导方案。
下面对相关的类和方法进行简单介绍。
TransferSolutions 对象实质上是分析出的所有公交换乘方案(TransferSolution)的集合,通过它可以获知方案的数量,以及返回某个换乘方案。表 5.2列出了TransferSolutions类的方法:
表 5.2TransferSolutions的方法列表
类型 |
名称 |
描述 |
int |
getCount |
返回公交换乘方案集合中公交换乘方案的个数。 |
TransferSolution |
get |
返回公交换乘方案集合中指定索引处的公交换乘方案。 |
一个TransferSolution对象代表了一个概括的公交换乘方案,从该对象可以得知该方案的换乘次数以及每一个乘车段(TransferLines)。TransferSolution类的方法如表 5.3所示:
表 5.3TransferSolution的方法列表
类型 |
名称 |
描述 |
int |
getTransferTime |
返回公交换乘方案的换乘次数。 |
TransferLines |
get |
返回公交换乘方案中指定索引处的乘车段集合。 |
在获得乘车段集合(TransferLines)对象后,可通过TransferLine类的方法获得该集合包含的所有乘车段(TransferLine)。从TransferLine对象则可以得知该乘车段的上车站点、下车站点和所乘线路的名称。表5.4和表5.5分别列出了TransferLines和TransferLine的方法。
表 5.4TransferLines的方法列表
类型 |
名称 |
描述 |
int |
getCount |
返回乘车段集合中乘车段的数量。 |
TransferLine |
get |
返回乘车段集合中指定索引处的乘车段。 |
表 5.5TransferLine的方法列表
类型 |
名称 |
描述 |
String |
getOnName |
返回乘车段的上车站的名称。 |
String |
getDownName |
返回乘车段的下车站的名称。 |
String |
getLineName |
返回乘车段所乘线路的名称。 |
int |
getStartIndex |
返回乘车段的上车站点在对应的完整公交线路中的索引值。该值表示站点在公交线路中位于第几站,从0开始计数。 |
int |
getEndIndex |
返回乘车段的下车站点在对应的完整公交线路中的索引值。该值表示站点在公交线路中位于第几站,从0开始计数。 |
long |
getLineID |
返回乘车段所乘线路的 ID。 |
通过TransferGuide类的方法,可以获取行驶导引子项、公交换乘导引的总长度、总距离和总花费。表 5.6列出了TransferGuide类的方法:
表 5.6 TransferGuide的方法列表
类型 |
名称 |
描述 |
int |
getCount |
返回公交换乘导引对象中子项的个数。 |
TransferGuideItem |
get |
返回根据指定的序号的公交换乘导引中的子项对象。 |
int |
getTransferCount |
返回公交换乘次数,因为换乘方案中可能有步行的子项,所以公交换乘次数不能根据 TransferGuide.Count 来简单计算。 |
double |
getTotalDistance |
返回公交换乘导引的总距离,即当前换乘方案的总距离。 |
double |
getTotalFare |
返回公交换乘导引的费用总和,即当前换乘方案的总票价。 |
double |
getTotalTime |
返回公交换乘导引的总时间,即当前换乘方案所花费的总的时间。 |
通过TransferGuide的get方法可以获取公交换乘导引子项(TransferGuideItem对象),从子项中可以获得该段换乘或步行路线的信息,包括子项所代表的乘车或步行路线的距离、时间、线对象等。TransferGuideItem类的方法如表 5.7所示:
表 5.7 TransferGuideItem类的方法列表
类型 |
名称 |
描述 |
GeoLine |
getRoute |
返回换乘导引子项所表示的一段乘车或步行路线对应的线对象。 |
boolean |
getIsWalking |
返回该行驶导引子项所表示的是步行线路还是乘车线路。如果为true表示该行驶导引子项为步行路线,否则为乘车路线。如果为步行路线,则getStartName、getEndName、getLineName、getStartIndex、getEndIndex、getPassStopCount这些与乘车有关的方法无意义,将返回null。 |
String |
getLineName |
返回换乘导引子项所表示的一段乘车路线的线路名称。 |
int |
getLineType |
返回换乘导引子项所表示的一段乘车路线的线路类型。该值从公交线路环境设置( LineSetting)中的setLineTypeField方法指定的字段中获得。 |
int |
getPassStopCount |
返回换乘导引子项所表示的一段乘车路线所经过的站点个数。 |
String |
getStartName |
返回换乘导引子项所表示的一段乘车路线的上车站点的名称。 |
Point2D |
getStartPosition |
返回换乘导引子项所表示的一段乘车(或步行)路线的上车站点(或起点)的坐标。 |
int |
getStartIndex |
返回换乘导引子项所表示的一段乘车路线的上车站点在对应的完整的公交线路中的索引值。该值表示站点在公交线路中位于第几站,从0开始计数。 |
String |
getEndName |
返回换乘导引子项所表示的一段乘车路线的下车站点的名称。 |
Point2D |
getEndPosition |
返回换乘导引子项所表示的一段乘车(或步行)路线的下车站点(或终点)的坐标。 |
int |
getEndIndex |
返回换乘导引子项所表示的一段乘车路线的下车站点在对应的完整的公交线路中的索引值。该值表示站点在公交线路中位于第几站,从0开始计数。 |
double |
getDistance |
返回换乘导引子项所表示的一段乘车或步行路线的距离。 |
double |
getFare |
返回换乘导引子项所表示的一段乘车路线的费用(即票价)。 |
double |
getTime |
返回换乘导引子项所表示的一段乘车或步行路线所花费的时间。 |
TransferAnalyst类提供了两个getDetailInfo方法。
方法一:根据起点、终点和乘车段集合获取完整的公交换乘导引。
语法:
public TransferGuide getDetailInfo(Point2D startPoint, Point2D endPoint, TransferLine[] transferLines)
参数说明:
startPoint:指定的公交换乘分析的起点。
endPoint:指定的公交换乘分析的终点。
TransferLines:指定的乘车段数组。
返回值说明:
完整的公交换乘导引。
方法二:根据起始站点 ID、终止站点 ID 和乘车段集合获取完整的公交换乘导引。
语法:
public TransferGuide getDetailInfo(long startID,long endID, TransferLine[] transferLines)
参数说明:
startID:指定的公交换乘分析的起始站点ID。
endID:指定的公交换乘分析的终止站点ID。
transferLines:指定的乘车段数组。
返回值说明:
完整的公交换乘导引。
注意,该方法通过 transferLines 参数指定的乘车段数组的含义与乘车段集合对象 TransferLines 的含义不同:
公交换乘分析后,从返回的公交换乘方案集合(TransferSolutions)中可以获得一个公交换乘方案(TransferSolution),从该换乘方案中可以得到所有乘车段集合(TransferLines)。而该方法中需要指定的transferLines参数,则是由每一个乘车段集合对象中的一个乘车段(TransferLine)对象共同构成的数组,这些乘车段是一个唯一的换乘方案中的所有乘车段按照次序的组合。注意,乘车段必须按照一定的次序写入数组,该次序即换乘方案中乘车段集合的次序,如果次序不正确,得到的换乘导引可能因此出现混乱的情况而与实际需求不符。
通过TransferAnalyst类的findLinesByStop方法,可以查询经过指定站点的线路。从该方法返回的LineInfo对象数组,可以获得这些线路的详细信息。
语法:
public LineInfo[] findLinesByStop(Int64 stopID)
参数说明:
stopID:指定的公交站点ID。
返回值说明:
返回经过指定站点的公交线路信息对象集合。
该方法返回一个线路信息(LineInfo)对象的数组,通过LineInfo对象能够获取的信息,必须是在LineSettings中设置了对应的有效参数,并且在公交线路数据集中对应的字段存在有效值。表 5.8列出了LineInfo类的方法。
表 5.8 LineInfo类的方法列表
类型 |
名称 |
描述 |
GeoLine |
getTotalLine |
返回完整的公交线路,是一个GeoLine对象。 |
long |
getID |
返回公交线路的SMID。 |
int |
getLineID |
返回公交线路的ID。 |
String |
getName |
返回公交线路名称。 |
String |
getAlias |
返回公交线路别名。 |
FareInfo |
getFareInfo |
返回公交线路票价信息。详细信息请参见表 5.9。从FareInfo能够获得的信息,必须是在FareFieldInfo类中设置了对应的参数,并且在公交线路数据的对应字段存在有效值。 |
double |
getSpeed |
返回公交车行车速度。 |
int |
getLineType |
返回公交线路的类型。该值由公交线路环境设置(LineSettings)中 setLineTypeField方法设置的公交线路数据中代表线路类型的字段的值决定。字段值为0代表公交汽车,1代表地铁,2代表无轨电车。 |
int |
getStopCount |
返回公交线路总站数。 |
String |
getStartTime |
返回公交线路首班车发车时间。 |
double |
getInterval |
返回公交线路发车时间间隔。 |
String |
getTerminalTime |
返回公交线路末班车发车时间。 |
double |
getTotalDistance |
返回公交线路总长度。 |
double |
getTotalFare |
返回公交线路总费用,即全程票价。 |
double |
getTotalTime |
返回公交线路花费的总时间。 |
表 5.9 FareInfo类的方法列表
类型 |
名称 |
描述 |
int |
getType |
返回公交票价类型。值为0表示为单一票价,表示按距离计价,2表示按站数计价。 |
long |
getStartFareRange |
返回起步价格范围。 |
int |
getStartFare |
返回起步价格。 |
String |
getFareStepRange |
返回超出起步价范围后的票价递增范围。 |
String |
getFareStep |
返回票价递增步长。票价递增步长是指每增加一站(按站数计价)或者一个距离单位所增加的票价(按距离计价)。 |
通过TransferAnalyst类的findStopsByLine方法,可以查询指定线路上有哪些站点。从该方法返回的StopInfo对象数组,可以获得这些站点的详细信息。
语法:
public StopInfo[] findStopsByLine (Int64 lineID)
参数说明:
lineID:指定的公交线路ID。
返回值说明:
返回指定线路上的站点信息对象集合。
该方法返回一个站点信息(StopInfo)对象的数组,通过StopInfo对象能够获取的信息,必须是在StopSetting中设置了对应的有效参数,并且在公交站点数据集中对应的字段存在有效值。表 5.10列出了StopInfo类的方法。
表 5.10 StopInfo的方法列表
类型 |
名称 |
描述 |
long |
getID |
返回公交站点的SMID。 |
int |
getStopID |
返回公交站点的ID。 |
String |
getName |
返回公交站点名称。 |
String |
getAlias |
返回公交站点别名。 |
Point2D |
getPosition |
返回公交站点位置,即在公交站点数据集中该站点的位置。 |
在阅读前文了解了公交分析的内容后,我们对公交分析的实现步骤做如下总结:
1. 通过公交站点环境设置(StopSetting)类设置公交站点数据的相关信息;
2. 通过公交线路环境设置(LineSetting)类设置公交线路数据的相关信息;
3. 通过公交关系设置(RelationSetting)类设置站点与线路关系、站点与出入口关系以及网络数据集的相关信息;
4. 通过公交分析环境设置设置(TransferAnalystSetting)类设置公交分析环境;
5. 通过TrafficAnalyst类的check方法对公交数据(除网络数据集外)进行检查,根据返回的错误信息对数据进行修改;
6. 通过TrafficAnalyst类的load方法加载公交数据;
7. 选择一种分析方法(findTransSolutions方法、findLinesByStop方法、findStopsByLine方法)进行相应的分析;
8. 进行公交换乘分析时,在调用findTransSolutions方法后,还需要调用getDetailInfo方法来获得换乘导引;
9. 最后对分析结果进行解析。