Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions data/4!types.csv
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,7 @@ DEFAULT,385,準急,ジュンキュウ,Semi Express,准急,준급,#0000FF,0,3,0,
DEFAULT,386,洛楽,ラクラク,Rakuraku,洛乐,라쿠라쿠,#DC143C,0,4,0,京阪用 快速特急,COMPLETE
DEFAULT,400,京王ライナー(京王八王子方面),ケイオウライナー,Keio Liner(for Keiō-hachiōji),京王Liner,게이오 라이너,#DD0077,0,2,0,,COMPLETE
DEFAULT,401,京王ライナー(橋本方面),ケイオウライナー,Keio Liner(for Hashimoto),京王Liner,게이오 라이너,#DD0078,0,2,0,,COMPLETE
DEFAULT,413,京王ライナー(高尾山口方面),ケイオウライナー,Keio Liner(for Takaosanguchi),京王Liner,게이오 라이너,#DD0077,0,2,0,,COMPLETE
DEFAULT,402,モーニングウィング号,モーニングウィングゴウ,"Morning Wing(Miurakaigan to Shinagawa, Sengakuji)",Morning Wing,모닝윙호,#379412,1,2,0,,COMPLETE
DEFAULT,403,イブニングウィング号,イブニングウィングゴウ,Evening Wing(Shinagawa to Misakiguchi),Evening Wing,이브닝윙호,#379412,2,2,0,,COMPLETE
DEFAULT,404,普通(方南町支線),フツウ,Local(Honancho Branch Line),慢车(方南町支线),보통(호난초 지선),#E60012,0,1,0,,COMPLETE
Expand Down
38 changes: 38 additions & 0 deletions data/5!station_station_types.csv
Original file line number Diff line number Diff line change
Expand Up @@ -41996,3 +41996,41 @@ DEFAULT,3200739,306,1186,1,上古沢
DEFAULT,3200740,306,1186,1,紀伊細川
DEFAULT,3200741,306,1186,1,紀伊神谷
DEFAULT,3200742,306,1186,0,極楽橋
DEFAULT,2400101,413,1188,0,新宿
DEFAULT,2400104,413,1188,1,笹塚
DEFAULT,2400105,413,1188,1,代田橋
DEFAULT,2400106,413,1188,0,明大前
DEFAULT,2400107,413,1188,1,下高井戸
DEFAULT,2400108,413,1188,1,桜上水
DEFAULT,2400109,413,1188,1,上北沢
DEFAULT,2400110,413,1188,1,八幡山
DEFAULT,2400111,413,1188,1,芦花公園
DEFAULT,2400112,413,1188,1,千歳烏山
DEFAULT,2400113,413,1188,1,仙川
DEFAULT,2400114,413,1188,1,つつじヶ丘
DEFAULT,2400115,413,1188,1,柴崎
DEFAULT,2400116,413,1188,1,国領
DEFAULT,2400117,413,1188,1,布田
DEFAULT,2400118,413,1188,1,調布
DEFAULT,2400119,413,1188,1,西調布
DEFAULT,2400120,413,1188,1,飛田給
DEFAULT,2400121,413,1188,1,武蔵野台
DEFAULT,2400122,413,1188,1,多磨霊園
DEFAULT,2400123,413,1188,1,東府中
DEFAULT,2400124,413,1188,0,府中
DEFAULT,2400125,413,1188,0,分倍河原
DEFAULT,2400126,413,1188,1,中河原
DEFAULT,2400127,413,1188,0,聖蹟桜ヶ丘
DEFAULT,2400128,413,1188,1,百草園
DEFAULT,2400129,413,1188,0,高幡不動
DEFAULT,2400130,413,1188,1,南平
DEFAULT,2400131,413,1188,1,平山城址公園
DEFAULT,2400132,413,1188,1,長沼
DEFAULT,2400133,413,1188,0,北野
DEFAULT,2400301,413,1188,0,北野
DEFAULT,2400302,413,1188,1,京王片倉
DEFAULT,2400303,413,1188,1,山田
DEFAULT,2400304,413,1188,0,めじろ台
DEFAULT,2400305,413,1188,1,狭間
DEFAULT,2400306,413,1188,0,高尾
DEFAULT,2400307,413,1188,0,高尾山口
1 change: 1 addition & 0 deletions data/route_service_rules.csv
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,4 @@ type_cd,line_group_id,requires_timetable,boarding_wait_seconds,source,type_name,
412,1019,true,,https://www.keihan.co.jp/traffic/liner/,ライナー,京阪ライナー・平日朝夕夜限定,2026-10-13
510,,true,,https://www.keio.co.jp/zasekishitei/index_mt.html,Mt.TAKAO,土休日・少数便・方向別乗降制限,2026-10-13
519,,true,,https://www.tobu.co.jp/railway/th/timetable/,THライナー,朝夕夜限定・方向別乗降制限,2026-10-13
413,,true,,https://www.keio.co.jp/zasekishitei/index_n.html,京王ライナー(高尾山口方面),時間帯限定・方向別乗降制限,2026-10-16
4 changes: 2 additions & 2 deletions data_validator/tests/keio_stopping_patterns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ fn sections(group: u32) -> Vec<(u32, u32, u32)> {
match group {
65 | 67..=71 => vec![(24001, 1, 34)],
66 | 252 | 416 | 760..=762 => vec![(24001, 1, 18), (24002, 18, 45)],
253 | 412..=415 | 758 | 759 => vec![(24001, 1, 33), (24003, 33, 53)],
253 | 412..=415 | 758 | 759 | 1188 => vec![(24001, 1, 33), (24003, 33, 53)],
254 | 285..=287 | 757 => {
vec![(24007, 1, 4), (24001, 4, 18), (24002, 18, 45)]
}
Expand Down Expand Up @@ -84,7 +84,7 @@ fn existing_keio_patterns_match_official_stops_and_complete_station_sequences()

let audited: BTreeSet<u32> = [
65, 66, 67, 68, 69, 70, 71, 252, 253, 254, 255, 285, 286, 287, 412, 413, 414, 415, 416,
756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767,
756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 1188,
]
.into_iter()
.collect();
Expand Down
57 changes: 57 additions & 0 deletions data_validator/tests/keio_takao_liner.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
use std::path::Path;

use csv::StringRecord;
use stationapi::domain::service_rules::service_rule;

fn records(path: &Path) -> Vec<StringRecord> {
csv::Reader::from_path(path)
.unwrap()
.records()
.collect::<Result<_, _>>()
.unwrap()
}

#[test]
fn takao_liner_has_its_own_complete_pattern_and_requires_timetable() {
let data = Path::new(env!("CARGO_MANIFEST_DIR")).join("../data");
let types = records(&data.join("4!types.csv"));
let liner_types: Vec<_> = types.iter().filter(|r| &r[1] == "413").collect();
assert_eq!(liner_types.len(), 1);
let liner = liner_types[0];
assert_eq!(&liner[2], "京王ライナー(高尾山口方面)");
assert_eq!(&liner[8], "0"); // Both directions, like the other Keio Liners.
assert_eq!(&liner[9], "2");

let all_rows = records(&data.join("5!station_station_types.csv"));
let rows: Vec<_> = all_rows.iter().filter(|r| &r[3] == "1188").collect();
let expected_stations: Vec<u32> = std::iter::once(2400101)
.chain(2400104..=2400133)
.chain(2400301..=2400307)
.collect();
let actual_stations: Vec<u32> = rows.iter().map(|r| r[1].parse().unwrap()).collect();
assert_eq!(actual_stations, expected_stations);

// Official up/down stopping lists, checked 2026-10-16:
// https://www.keio.co.jp/zasekishitei/
// https://www.keio.co.jp/zasekishitei/index_n.html
// Both Kitano IDs are intentional; Katakura, Yamada and Hazama pass.
let stops = [
2400101, 2400106, 2400124, 2400125, 2400127, 2400129, 2400133, 2400301, 2400304, 2400306,
2400307,
];
for row in rows {
let station: u32 = row[1].parse().unwrap();
assert_eq!(&row[2], "413");
assert_eq!(
row[4].parse::<u32>().unwrap(),
u32::from(!stops.contains(&station))
);
}
assert!(all_rows
.iter()
.filter(|r| &r[2] == "413")
.all(|r| &r[3] == "1188"));
let rule = service_rule(Some(413), Some(1188)).expect("Takao Liner operating rule");
assert!(rule.requires_timetable);
assert_eq!(rule.boarding_wait_seconds, None);
}
2 changes: 1 addition & 1 deletion docs/keio-stopping-pattern-audit.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,5 @@
- 京王八王子・高尾山口系統の特急は東府中を一部停車(`pass=5`)とし、競馬場線直通特急764は東府中の両路線IDで停車する。
- 相模原線の急行・特急、高尾線の急行・特急は各線の公式駅案内に従う。特急が高尾線内で各駅に停車しても急行の通過駅まで変更しない。

本検査は既存の停車パターンと駅列を対象とする。新系統の収録網羅性、時刻指定検索、乗降制限の実装を保証するものではない。公式案内には高尾線の京王ライナーも掲載されているが、現行CSVには専用の路線グループがなく、系統追加は別途対応が必要。
本検査は既存の停車パターンと駅列を対象とする。新系統の収録網羅性、時刻指定検索、乗降制限の実装を保証するものではない。監査時点で未収録だった高尾線の京王ライナーは、別PR #1724で種別413・路線グループ1188として追加する。追加後は同じ検査で新系統も照合する。

12 changes: 11 additions & 1 deletion docs/route-service-audit.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ S-TRAINだけでなく、登録済みの全国の種別・系統を対象に、
| --- | --- | --- |
| S-TRAIN | 316・339 | [西武鉄道](https://www.seiburailway.jp/railway/reservedtrain/s-train/): 平日・土休日の別、限定時間帯、方向別乗降条件 |
| 池袋発着の西武快速 | 379 / 188・620 | [公式池袋時刻表](https://seibu.ekitan.com/norikae/timetable/station/235-0/d1): 該当系統の限定便。他の快速系統は対象外 |
| 京王ライナー | 400・401 | [京王電鉄](https://www.keio.co.jp/zasekishitei/): 限定時間帯、上りの途中駅の乗降制限 |
| 京王ライナー | 400・401・413 | [京王電鉄](https://www.keio.co.jp/zasekishitei/): 限定時間帯、上りの途中駅の乗降制限 |
| モーニング・イブニングウィング | 402・403 | [京急電鉄](https://www.keikyu.co.jp/ride/train/wing_detail.html): 平日朝・夕夜の片方向運転。ウィング・シート付き一般列車は対象外 |
| 拝島ライナー | 405 | [西武鉄道](https://www.seiburailway.jp/railway/reservedtrain/haijimaliner/): 朝夕の限定便、方向別乗降条件 |
| TJライナー | 406・407 | [東武鉄道](https://www.tobu.co.jp/railway/tj/timetable/): 上り朝、下り夕夜。快速急行341とは別種別 |
Expand Down Expand Up @@ -55,3 +55,13 @@ S-TRAINだけでなく、登録済みの全国の種別・系統を対象に、
手動選択用の一覧には残ることを検証します。
- 通常の快速・快速急行・通勤特急が巻き込まれないことと、到達判定と探索の網が
一致することを検証します。

## 高尾線の京王ライナー(2026-10-16確認)

種別413「京王ライナー(高尾山口方面)」・路線グループ1188として、新宿~高尾山口の両方向の停車パターンを登録する。
[上りの公式停車駅・時刻表](https://www.keio.co.jp/zasekishitei/)と[下りの公式停車駅・時刻表](https://www.keio.co.jp/zasekishitei/index_n.html)を照合した。
停車駅は新宿・明大前・府中・分倍河原・聖蹟桜ヶ丘・高幡不動・北野・めじろ台・高尾・高尾山口。北野は京王線2400133・高尾線2400301の両IDを保持する。京王片倉・山田・狭間は通過する。

既存の京王八王子・橋本系統と同様に方向0・kind=2を使用する。「方面」は系統を表し、下り限定ではない。Mt.TAKAO号とは独立した種別とする。上りは途中駅からの降車が明大前に限られ、運行時間帯も限定されるため、requires_timetable=trueを登録し、時刻を扱わないconnectedRoutes・到達可能性検索には採用しない。手動の種別選択・経路表示用の停車パターンとして提供する。

`cargo test -p data_validator --test keio_takao_liner` は種別メタデータ・全38行の駅順・全停車/通過・北野両ID・時刻表必須ルールを検査する。
Loading