高级调整技巧
如何对已有的运行图数据进行修改是一个重要的话题。固然,通过基本的线路信息编辑、车次编辑可以完成大多数的任务,但这样的工作量往往很大,并涉及大量重复的操作。更严重的是,有时候信息是相互牵连的,修改一处就会导致其他数据的变化。例如,通过基本的线路信息编辑改变车站站名后,车次时刻表中的站名并不会随之变化,这将导致原来在本站停车的车次数据不再匹配,也就无法显示这个站的点。
pyETRC系统设计了一些特定场景下的批量调整工具,以减少这样的工作量,用尽可能少的操作完成运行图的调整。本文档将对这些功能进行简要说明,并指出典型的应用场景。本文档将大部分取代以往随发行版发布的技巧提示.pdf文件的作用。
运行图调整的情形很多,我们不可能一一列举。如果用户在使用过程中有一些调整场景不能通过已有功能实现,可以提出建议,以便功能进一步完善。
本文档已于2020年9月28日编辑,更新至3.2.0版本。
单车次时刻调整
一般来说,车次时刻表中的各个车站时刻数据并非是独立的,而是有非常强的牵连的。例如,某个站以前的运行线不变,但在该站由通过改为办客停车,一般来说将导致后面的时刻相应发生变化。此时若逐一去调整后续车站,则非常繁琐并且容易出错,这时可以考虑区间运行线平移功能。诸如此类。
本段介绍仅涉及一个车次的时刻表调整操作。这些操作一般是针对当前车次的。有关当前车次的概念,参见运行图铺画。
区间运行线平移
本功能适用于同时调整车次某段(或全部)时刻表的时间,将到发时刻向前或向后平移一段距离。菜单位于调整->调整当前车次时刻,快捷键ctrl+A。调整界面如下图所示。

在列表中选中需要调整的车站(一般来说,应当是连续的),选择提早或者延后,按确定即生效。
?> 同时,这个窗口也是一个比较简洁、省空间的列车时刻表,便于截图。
时刻表修正
在一些情况下,运行图所用的时刻数据由外部程序转换而得到,由于程序的原因,难免出现时刻表顺序错误、到发站时刻颠倒等问题。当然,有时手工输入也会产生这些问题。为此,设计了时刻表修正的功能,通过调整->当前车次时刻表重排,或者当前车次设置面板中的顺序重排按钮,或者快捷键ctrl+V调出。
?> 在2.4.1版本之后,当前车次设置界面直接提供了上下移动车站的功能。但在此之前,上下移动只能通过顺序重排来实现。
如下例是一个顺序错误的例子。显然,尚武、嘉川两站在时刻表上的顺序反了,导致运行线异常,如图:

在对话框表格中,可以看到尚武站与前一站的区间列车运行时间异常,已经用红色背景标出。选中嘉川站所在行,再上移一次,即可改正。
支持的操作在图上皆有说明,不再赘述。
?> 3.2.0版本中新增批选功能。在表格中用鼠标框选单元格,再点击批选按钮,则被涉及的所有行勾选。此功能适合快速选择连续的站点。
交互式时刻微调
到现在为止介绍的直接调整单个车站时刻的方法只有通过当前车次设置中表格来调整。这样调整的问题是,调整后必须点击确定才能看到效果;另外当前车次设置面板功能过多,留给时刻表的空间有限,且容易误操作。为此设计了交互式时刻调整停靠面板,位于窗口->交互式时刻表,快捷键为ctrl+shift+Y。界面如下图所示。

每一组中,第二列的第一行为到达时刻,第二行为出发时刻。第三列的第一行为停靠时间,第二行为股道。调整第二列的时刻后立即生效,重新铺画运行图,且不能撤销。
第一、三列的文字,红色表示营业,蓝色表示停站但不营业。
双击第一、三列,或者通过右键菜单,可以在营业与不营业之间循环切换。此功能与ETRC相似。
运行线外观调整
运行线外观是指运行线的颜色和宽度。我们已经介绍过在当前车次设置面板中个别调整的方法,也在列车类型系统章节中介绍过按照类型设置运行线外观的方法和逻辑。但显然,前者只能一个个改,效率过低;后者又只能通过类别这一种标准来修改,显得过于局限。因此设计了这个功能。
在车次编辑停靠面板(ctrl+C)选中一组车次,然后点击底部的批量调整,在弹出的对话框中即可设置选中车次的运行线外观。
【例】按照交路的不同,为每个交路设置一种运行线颜色。
先点击车次编辑面板上方的筛选,勾选属于交路,并选择某一个交路,确定。此时列表中只显示该交路的车次。全部选中,然后点击批量调整,设置运行线颜色即可。
?> 车次筛选器的具体用法参见通用车次筛选器。
通过时刻推定(插值)
一般情况下,pyETRC的很多功能实现都要求完整的时刻表数据。例如根据跨越站数量自动管理运行线,计算里程等。在一些情况下,已知的数据包含所有停站数据,但不包括通过站的时刻数据(一般在高铁客专中比较常见,也就是没有单纯越行/会让停车情况),此时可以考虑使用通过时刻推定的功能。
?> 通过时刻推定的实质是数值分析中的插值问题,其算法类似分段线性插值,但比一般的分段线性插值更为复杂,因为考虑到了起停附加时分的问题。
通过时刻推定的依据是标尺数据。用户可以选择一套标尺数据,对选中的一组车次进行推定。推定时,认为所有要推定时刻的无数据车站都是通过,对每两个有停靠数据的站间,先按照标尺扣去起停附加时分(如果有),再将剩下的区间运行时长,按照各个小区间的通通时分比例,分配到各个小区间,从而确定各个区间通过站点的通过时刻。
本功能菜单见调整->推定通过时刻,或者用快捷键ctrl+2。第一步的界面如下图所示。
!> 使用本功能前,请将运行图设置中的最大跨越站数设置为充分大的数值,以保证所有需要推定的区间,图上都能看到运行线。

此界面可以选择推定依据的标尺,时刻精度(推定时刻的尾数保留到1秒,5秒,10秒,30秒或1分钟),以及是否要推定到起点、终点。
推定到本线起点是指,对所有车次,如果在本线起点(下行方向起点,或者里程的0点)没有时刻数据,是否从本线入图点开始,推定到本线起点。推定到本线终点,是类似的。
?> 如果推定到起点、终点,则外推部分的区间运行时分标准直接套用标尺数据,而不考虑内插部分的误差。显然,与一般的插值法一样,“外推”的精度低于“内插”的精度。
在表中选择要推定的车次,然后点击下一步。没有选中的车次将不会被推定。
!> 为了减少计算时的干扰,点击下一步时,所选车次时刻表中的非本线站点将会被删除。
点击下一步后,程序计算出相对误差。相对误差的计算方法如上图所示。背景色深浅标识车次实际(已知)运行时分与标尺数据误差的相对大小。如下图所示。

若相对误差很大,一般来说表明该车次并非是按照所选标尺运行的,或者其中有慢行、停点等情况。此时一般不建议继续推定。若要取消或者新增推定的车次,可以点击上一步重新选择。
点击确定即将新的时刻数据插入时刻表,并重新铺画运行图。
?> 使用本功能推定出来的时刻,在其备注一栏自动标注推定。但用户可以撤销,或者新增其他内容。
推定结果的撤销
如果需要撤销上述推定的结果,则可用调整->撤销全部推定结果功能,该功能将所有备注栏标注推定的时刻表信息全部删除。
!> 此功能只检查备注一栏的信息,而并不追究时刻是否真的是由推定给出的。这就是说,即使在非推定的数据加上推定的备注也会被删除;修改推定出来的结果的备注,则该时刻信息不会被删除。
多车次调整
运行线批量复制
有时运行图中有一些同方向的、除了始发时刻不同之外,其余运行时刻几乎完全一样的车次,例如沪宁城际的整点标杆车。这种情况下,依次输入或者分别排图都显得太过繁琐。为此,设计了运行线批量平移复制功能。菜单栏工具->批量复制运行线,或者快捷键ctrl+shift+A。此功能对话框如下图所示

每行一个车次,并依次输入始发时刻(时刻表中第一个站的时刻),点击应用即添加新的运行线。如上图所示是以40103/4次为蓝本,复制了两个10分钟追踪的车次(图上已经应用了结果)。
区间换线
这是一个参照国铁运行图编制系统设计的功能。在两车次运行线发生交叉时,有时候可能需要交换两车次某一个区段的运行线,此时可以用本功能方便地实现。
此功能位于菜单栏调整->区间换线,或者快捷键ctrl+5。操作界面、操作效果对比如下图所示。

先选中一个车次,调出菜单后,再选择另一车次。在对话框中,左侧一栏是当前车次的时刻,右侧一栏是另一车次的时刻。分别在两侧选择要交换的范围(不管选多少个站,范围总是从选择的第一个站到最后一个站),点击确定即生效。效果如上图所示。
所选区间的起始站和终止站的到发时刻是否交换,可以由用户决定。在上面这样的例子中,不应当交换。
!> 原则上,只有交叉两次的运行线之间的区段,或者交叉一次、并从交叉点到两车次起点/终点的区间才可以如此交换。但本系统不加限制。若进行不合理的交换,可能导致运行线混乱。
运行线铺画
本节介绍与标尺有关的运行线设计。标尺是列车区间运行的时分标准,其最重要的作用当然就是计算运行线。由标尺计算运行线是本系统的亮点功能之一。
?> 必须要说明,在本系统中,标尺与车次之间没有对应关系,即使车次时刻表是由某个标尺计算出来的。这是因为,一个车次的时刻表可能不符合任何一个标尺;也可能有多个一样的标尺。这种意义下,不容易严格地定义何种情况下列车属于一个标尺。
?> 但作为一个退化了的功能,我们提供了标尺对照功能,提供标尺与实际车次之间的时刻比较。显然,如果按照下面叙述的方法铺画运行线再使用标尺对照,它们应该是完全吻合的。
按标尺铺画运行线
菜单栏工具->标尺排图向导,或者快捷键ctrl+R可以调出本功能。第一个界面如下图所示

首先选择排图标尺、方向。
附加到车次一栏选择是否要将排图结果添加到某个车次。如果输入的车次有效,则可选择将新铺画的时刻附加到所要附加车次的开头或者末尾;如果不输入或者车次无效,则铺画新的运行线。
!> 附加到车次的功能只适用于在首尾添加一组时刻信息的情况。如果要改变中间某段运行线,请使用区间运行线重排功能。
选择起始站并点击下一步后,出现第二步的界面,如下图所示(此图并非是上一张图直接点击下一步的结果,而是铺画新车次)。

输入起始时刻,在表中选择各个车站的停车时间,系统自动产生时刻信息。
如果勾选在本线始发,则车次始发站被设置为铺画起始站,且第一个区间无条件计算起步附加时分;否则第一个区间是否计算起步附加时分取决于第一个站是否有停点,车次起始站为空。
如果勾选在本线终到,则车次的终到站被设置为当前的最后一站(是动态的。随着铺画的延伸,此终到站也会变化)。
若勾选即时模式,则在表中调整停靠时间时立即生效,且在图中更新运行线;如果不勾选,只有双击到一行时,才会铺画运行线到指定行所示站点。
使用右键菜单,或者快捷键Alt+X可查看当前行的冲突时刻,如上图中对话框所示。
表中调整一栏可以以秒为单位调整区间运行的时分,调整值可以是正数(增加区间时分,即慢行)或者负数(减少区间时分)。此调整是临时的,仅在此处生效。
点击确定即生成新运行线和时刻表。
!> 当点击确定时,只有图上已经显示运行线的部分才会被提交。这就是说,如果没有勾选即时模式,又没有双击过(除第一行外的)表中某一行,则没有数据会被提交,此时系统会提示错误。
如果没有附加到车次(即铺画的是新的运行线),则点击确定后会弹出窗口,要求输入车次。输入一不与既有重复的车次即可。如果有附加到车次,则点击确定后立即生效,原车次时刻被修改。
?> 如果是附加到车次的状态,则铺画过程中会直接在原车次的基础上展示新运行线。但如果中途取消铺画,则已经铺画的部分作废,不会产生影响。
区间运行线重排
有时需要调整既有车次某个区间的停站情况,或者补全某个区间的停站数据(原始数据缺失中间站,但中间站有停点,故不能用通过时刻推定(插值)功能实现),这时可以考虑用本功能,在运行线的某一个区间应用标尺排图。下面用宝成线K195次列车绵阳-成都区间的重排来说明。
先选中K195次运行线,点击工具-区间运行线重排,或者快捷键ctrl+shift+R打开调整对话框,如下图所示。

在对话框中选择要覆盖排图的区间。选择任意多的站,从选中的第一个站到最后一个站的区间即为要覆盖排图的区间。点击确定后弹出标尺排图向导的对话框。
默认情况下,直接进入引用第一套标尺,进入第二步,并自动填好起始站时刻和停车时长。如果需要调整标尺,可以点击上一步重新选择。
标尺排图向导中的剩余操作同按标尺铺画运行线。
?> 注意:标尺排图向导中的自本线始发 在本线终到选项是指是否在当前排图的起始站和结束站终到。在本例中应勾选在本线终到,因为覆盖排图区间的结束站成都是本次列车终点站。
?> 本功能实际上等价于,先铺画区间运行线(铺画新车次),再进行区间换线,最后删除新铺画的车次。
线路数据调整
反排运行图
在说明反排运行图的功能前,有必要再强调一下本系统的上下行逻辑。在本系统中,总是以下行为主方向,即要求线路信息的车站排列顺序、里程递增方向、对里程递增方向(虽然对里程的意义是上行线里程,但仍然要求按下行方向递增)都是下行方向。
?> 如果一定要深究,本系统所称的下行应当定义为:线路信息中里程递增的方向,或者线路信息中车站排列顺序所对应的方向。这个方向并不一定是实际线路的下行方向(具体是不是,取决于用户设置),但一般来说,至少有某一段是下行方向才方便一些,因为系统自动识别上下行车次时,总是将单数车次作为下行、双数车次作为上行。
在实际的操作中,有时候可能确实需要反排运行图,例如需要将当前线路以一段的身份加入到另一运行图中,或者确实排反了。此时可以用调整->反排运行图功能实现。
此功能完成的操作有:
将线路信息中的车站反序排列,并以终点里程为0点、反向地重新计算里程和对里程数据。
将对里程与里程数据交换。如果本来没有对里程数据,则新的里程数据就是原来的里程数据。
将所有车站的单向站性质取反。就是说,上行通过站变为下行通过站,反之亦然。
将所有车次的上下行车次交换。
!> 对于原来缺失对里程数据的站,反排后对里程和里程数据都是原来的里程数据。也就是说,连续两次反排得到的效果并不是原始运行图,而是可能多了一些对里程数据。
!> 系统上的行别和线路实际行别不同会导致一些反直觉的情况。因此,尽量让系统上的行别和实际线路行别保持一致。
拼接运行图
拼接运行图功能是将两运行图首尾连接成一张运行图。此功能见工具->运行图拼接,或者快捷键ctrl+J。操作界面如下图所示。

选择一运行图文件(可以是pyETRC文件或ETRC文件),用户可决定是否要反排所选运行图,以及将引入的运行图置于本运行图之前还是之后。
点击确定后执行拼接并重新铺画运行图。此过程的具体操作包含:
引入新线路,并调整(本线或者新线路的)里程数据。将新线路中,所有本线没有的站名对应车站信息引入本线。
!> 里程计算的算法要求新线路与本线路应当首尾相接,即有且仅有一个公共站点,并位于端点。否则将导致里程计算出错。
若没有勾选
仅导入线路(不导入车次),则引入所有的车次。对于本运行图中原来没有的车次,直接添加;对于两运行图都有的车次,删除两车次的非本线站点,然后根据端点行别连接运行图。!> 对于两运行图的公共车次,其非本线站点时刻信息将被删除。其中“本线”指的是导入车次之前,在各自的运行图中的站点信息。
引入所有标尺数据。对于存在同名标尺的新线路标尺,合并两标尺数据;否则新增标尺数据。
引入所有天窗数据。分别合并综合维修天窗、综合施工天窗的数据。
站名匹配规则及其调整
本部分介绍与站名匹配相关的调整。所谓站名匹配,是指将线路信息与列车时刻表联系起来的过程。在介绍相关调整方法之前,有必要先重点介绍匹配的逻辑。
站名匹配规则
本系统中主要存在两套站名,即线路信息中的站名和时刻表中的站名。两套系统中的站名,采用字符串匹配的方法来配合。也就是说,即使多一个空格,都将被认为不一样。
也正是因此,本系统不允许一条线路中有两个站名相同的车站。如果确实出现这种情况,则铺画运行线时,匹配到哪一个站,是不确定的。
站名域解析符
但有一种例外。本系统允许采用C++语言的域解析符(::,两个半角冒号)作为不严格匹配。域解析符的作用是分隔站名和场名,对于具有站名::场名格式的站点信息,在不能找到严格匹配的情况下,站名也可以作为合法匹配。例如,成都东::达成场和成都东::城际场都可以匹配到成都东;但成都东达成场不能匹配成都东。
?> 由于::是两个字符,显示时占用空间较多。为了美观,在运行图铺画时,站名中的::会被显示为*,这只是显示的优化,不会影响数据。
此功能的主要作用是处理一条线路中需处理同一站、不同方向或者不同列车径路带来的不同站场的情况。
我们举两个例子。这两个例子比较刁钻,一般情况下需求不会如此刁钻。初次阅读,可以跳过。但若遇到,可以作为参考。
【例1】对于成贵客专线(正线+进贵阳北站的联络线),在贵阳北站,有的车是停靠贵阳北成贵场,有的车停靠贵阳北沪昆场。
?> 严格说来,这应该是两种运行径路,属于线路有分岔的情况,不符合本系统的线性表数据结构要求。但是,从实用角度看,如果仅将贵阳北成贵场作为正线的一部分,则终到沪昆场的车次无法被显示出来,运行图完整性被破坏。
若按照以前的方案,将贵阳北成贵场和贵阳北沪昆场依次列在站表中,则安排标尺时会有问题,因为并不存在贵阳北成贵场->贵阳北沪昆场的区间运行标尺,这也就导致无法按照标尺排图。
?> 诚然,可以利用修改站名功能(见修改站名和批量调整站名)将二者都改成贵阳北,但这样就损失了一部分的信息。
我们推荐的解决方案是:利用批量站名映射功能(见修改站名和批量调整站名)把所有车次信息中的贵阳北成贵场改为贵阳北::成贵场,贵阳北沪昆场改为贵阳北::沪昆场,而线路信息中的站名就叫贵阳北。这样,两个场的车次都能匹配到线路上的贵阳北,铺画出运行线,且没有损失信息。
【例2】(原技巧提示中例2)涉及运行线端点的上下行分设情况
这个例子更加极端。宝成线西局、成局的分界口在宝成线冉家河-朝天区间的两组道岔上,这两组道岔属于广元西站,下行线是85号、上行线是87号。因此局界口也称为“广元西口”。
我们现在需要铺画宝成线宝广段运行图,时刻数据只有西局管内的数据,终止在85号、87号道岔;我们希望按标尺铺画运行图。
现在我们来分析已有的条件和各种可能的解决方案。
逻辑上,85#、87#道岔属于上下行分设站,即85#应设置为下行单向站,87#应设置为上行单向站。但是,本系统中不允许端点站是单向站。如果将87#设为双向站,则必然出现
85#->87#(或者反过来)的区间,但这个区间在事实上是不存在的。自然,也无法给出其标尺数据。标尺数据可以从既有车次读取。
可考虑将线路信息延拓一站到
广元兰渝宝成场。但既有车次中,没有85#道岔到广元兰渝宝成场的运行数据,因此无法获得标尺数据。
此时可以考虑用域解析符解决这个问题。考虑到两个道岔属于广元西站,使用修改站名功能(见修改站名和批量调整站名)将85号岔改为广元西::85#,将87号岔改为广元西::87#,而线路基础信息中只需要保留一个广元西即可。最后得到的效果如下图所示。

?> 最后需要说明,我们建议慎用域解析符功能,仅在必要的情况下才使用。在线路信息中,同一方向内,最好不要出现多个域解析符下,共用同一前缀能匹配到的站,例如南京东::客场 南京东::到达场同时放在线路信息中。否则匹配可能出现问题。
始发终到站匹配规则及其自动适配
在本系统中,始发站、终到站的数据是通过单独的字段来标注的,并不一定要求时刻表中第一站就是始发站、最后一站就是终到站。
始发、终到站的匹配通过字符串匹配实现。一般情况下,通过严格的字符串匹配;但在存在域解析符(::)的情况下,按照允许域解析符的标准来匹配。例如,若车次始发站为成都东,时刻表第一站为成都东::达成场,则第一站匹配到始发站。
始发终到站的匹配,对以下功能或者逻辑的实现会产生作用:
控制运行线端部标签。本系统的运行线端部标签设计参照了国铁标准,但没有完全照搬,主要是结束标签上想办法增加了车次显示。本系统的标签图例如下图所示:

与区间时分标准计算相关时,始发站无论有无停点,都在其后的区间里计入/扣除起步附加时分;终到站亦然。主要用于标尺对照、通过时刻推定(插值)。
与交路接续有关时,要求交路中前一车次的时刻表最后一站是终到站、后一车次的第一站是始发站,且是同一站时,才在能绘制交路图;此外,当这个站是本线的站时,才能进行端点运行线连接,才能在车站股道图分析时,判定此接续占用站台。
当自动设置营业站时,始发终到站无论有无停点,都设为营业。
在区间对数表功能中,会分别统计始发数量、终到数量、始发终到数量。
在其他分析表格(例如当前车次时刻表
ctrl+Y)中展示,作为提示。
始发终到站的调整
在当前车次设置停靠面板中,点击底部右侧的自动始发终到,或快捷键Alt+R,可将本车次始发站设为时刻表第一站、终到站设为时刻表最后一站。
使用工具->重置所有始发终到站,对所有车次执行上述操作。
!> 如果原来的始发终到站不是时刻表的首末站,则此功能导致原有数据丢失,且不能撤销。
使用工具->自动适配始发终到站可以按以下规则调整始发终到站。当且仅当以下条件同时成立时,将始发站改为时刻表中第一站:
该车次在本线的第一个车站是时刻表第一个站(即时刻表第一个站是入图点,或者入图点前面不存在其他站);
该车次在时刻表中第一站的站名符合格式:
{A}xx场。其中,{A}表示原来设定的始发站站名。
对终到站也是类似的。
例如,如果车次始发站是北京西,时刻表中第一站是北京西普速场,则将把车次的始发站也设为北京西普速场。
?> 对于这个例子,当然也可以用域解析符实现,将所有车次时刻表中站名改为北京西::普速场。
修改站名和批量调整站名
这个功能的设计正是为了解决本文档开头提出的问题。当运行图中已有一些车次时,要修改某个有车次经停的车站的站名,此时如果只是修改线路信息中的站名,则车次停点不再匹配,数据丢失;若逐个修改所有车次停点中的站名,又太过繁琐且容易出错。此外,这样直接修改还将导致标尺、天窗数据的问题。
单个站名修改
对于一般的、单个站名的修改,可通过调整->修改站名,或者快捷键ctrl+U来实现。为了防止站名冲突,此功能不允许将本线的一个站名修改为本线的另一个站名。在对话框中输入原站名、新站名即可。原站名既可在本线中,也可以不在本线中。此功能将完成以下操作:
修改线路信息表中的站点名称,由原站名修改为新站名。
同步修改所有车次时刻表中的该站名和始发终到站中的该站名。
同步修改标尺数据中涉及到的站名。
同步修改天窗数据中涉及到的站名。
此功能是针对一般情况下的站名修改。对于涉及域解析符的修改,更推荐采用下面的方案。
批量站名修改
站名修改功能有一种特殊的运用场景,即涉及到域解析符的情况,一般都是要把所有车次中的北京南普速场形式的站名改成北京南::普速场,同时把线路信息中的站名改为北京南。除此之外,每次需要执行的修改都是差不多的,因为全国铁路的站名体系是基本稳定的。为此,设计了这个功能。
使用调整->批量站名映射,或者快捷键ctrl+shift+U可调出此功能,界面如下。

表中的数据保存在系统启动目录下的stationMap.json文件中,每行是一个要执行的映射。在左侧表头(序号那一列)按ctrl或shift或直接点击并拖动鼠标,可以多选。点击应用,选中的映射会被执行。
此功能的逻辑与单个站名修改一致,唯一不同的是,线路信息中的广元兰渝宝成场不会被改为广元::兰渝宝成场,而是会被改为广元。
?> 启动本功能时,原名在本线站表中的行会被自动选中。