diff --git a/data/4!types.csv b/data/4!types.csv index d6f60ff6..ef3cf3e4 100644 --- a/data/4!types.csv +++ b/data/4!types.csv @@ -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 diff --git a/data/5!station_station_types.csv b/data/5!station_station_types.csv index 81344aa9..8e6d8711 100644 --- a/data/5!station_station_types.csv +++ b/data/5!station_station_types.csv @@ -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,高尾山口 diff --git a/data/route_service_rules.csv b/data/route_service_rules.csv index 0643f808..6068681b 100644 --- a/data/route_service_rules.csv +++ b/data/route_service_rules.csv @@ -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 diff --git a/data_validator/tests/keio_stopping_patterns.rs b/data_validator/tests/keio_stopping_patterns.rs index a4e052cb..0d773064 100644 --- a/data_validator/tests/keio_stopping_patterns.rs +++ b/data_validator/tests/keio_stopping_patterns.rs @@ -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)] } @@ -84,7 +84,7 @@ fn existing_keio_patterns_match_official_stops_and_complete_station_sequences() let audited: BTreeSet = [ 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(); diff --git a/data_validator/tests/keio_takao_liner.rs b/data_validator/tests/keio_takao_liner.rs new file mode 100644 index 00000000..7316f68d --- /dev/null +++ b/data_validator/tests/keio_takao_liner.rs @@ -0,0 +1,57 @@ +use std::path::Path; + +use csv::StringRecord; +use stationapi::domain::service_rules::service_rule; + +fn records(path: &Path) -> Vec { + csv::Reader::from_path(path) + .unwrap() + .records() + .collect::>() + .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 = std::iter::once(2400101) + .chain(2400104..=2400133) + .chain(2400301..=2400307) + .collect(); + let actual_stations: Vec = 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::().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); +} diff --git a/docs/keio-stopping-pattern-audit.md b/docs/keio-stopping-pattern-audit.md index c72aedc5..cb9c5688 100644 --- a/docs/keio-stopping-pattern-audit.md +++ b/docs/keio-stopping-pattern-audit.md @@ -26,5 +26,5 @@ - 京王八王子・高尾山口系統の特急は東府中を一部停車(`pass=5`)とし、競馬場線直通特急764は東府中の両路線IDで停車する。 - 相模原線の急行・特急、高尾線の急行・特急は各線の公式駅案内に従う。特急が高尾線内で各駅に停車しても急行の通過駅まで変更しない。 -本検査は既存の停車パターンと駅列を対象とする。新系統の収録網羅性、時刻指定検索、乗降制限の実装を保証するものではない。公式案内には高尾線の京王ライナーも掲載されているが、現行CSVには専用の路線グループがなく、系統追加は別途対応が必要。 +本検査は既存の停車パターンと駅列を対象とする。新系統の収録網羅性、時刻指定検索、乗降制限の実装を保証するものではない。監査時点で未収録だった高尾線の京王ライナーは、別PR #1724で種別413・路線グループ1188として追加する。追加後は同じ検査で新系統も照合する。 diff --git a/docs/route-service-audit.md b/docs/route-service-audit.md index 4e75fb39..3606a00a 100644 --- a/docs/route-service-audit.md +++ b/docs/route-service-audit.md @@ -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とは別種別 | @@ -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・時刻表必須ルールを検査する。