diff --git a/.env b/.env index e5b4acb8..559b6535 100644 --- a/.env +++ b/.env @@ -1,6 +1,5 @@ ## API DATABASE_URL=postgresql://stationapi:stationapi@localhost/stationapi DISABLE_BUS_FEATURE=false -ENABLE_EXPERIMENTAL_BUS_FEATURE=false DISABLE_GRPC_WEB=false ODPT_ACCESS_TOKEN= \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..c4d3105b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +# 改行コードの正規化: リポジトリには常に LF で保存し、チェックアウト時も LF にする。 +# Windows 環境でのコミットによる CRLF 混入(ファイル全体が差分になる問題)を防ぐ。 +* text=auto eol=lf + +# バイナリファイルは変換しない。 +*.png binary diff --git a/.gitignore b/.gitignore index eb8ea9f0..d2839402 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ api_descriptor.pb tmp.sql .vscode/ data/ToeiBus-GTFS/ -scripts/.osm_cache/ \ No newline at end of file +scripts/.osm_cache/ +scripts/.gtfs_cache/ +__pycache__/ diff --git a/AGENTS.md b/AGENTS.md index 1fa3b945..f04add7e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,8 +20,7 @@ This guide explains how automation agents and human contributors should work wit - Environment variables: - `DATABASE_URL` – SQLx connection string (e.g., `postgres://stationapi:stationapi@localhost/stationapi`). - `DISABLE_GRPC_WEB` – `false` enables gRPC-Web; set to `true` for pure gRPC/HTTP2. - - `ODPT_ACCESS_TOKEN` – ODPT consumer key used to download authenticated GTFS feeds such as Seibu Bus when experimental bus feeds are enabled. - - `ENABLE_EXPERIMENTAL_BUS_FEATURE` – `true` imports every configured GTFS feed; unset or `false` imports only the stable Toei Bus feed. + - `ODPT_ACCESS_TOKEN` – ODPT consumer key used to download authenticated GTFS feeds such as Seibu Bus. - `HOST` and `PORT` – listen address (defaults to `[::1]:50051`; Docker uses `0.0.0.0:50051`). - `.env.test` exports `TEST_DATABASE_URL`, `RUST_LOG`, `RUST_BACKTRACE`, and `RUST_TEST_THREADS=1` for integration tests. - Recommended: keep shared defaults in `.env`, copy overrides to `.env.local`, and rely on startup loading both files. @@ -40,7 +39,7 @@ This guide explains how automation agents and human contributors should work wit ## Data Management - CSV import order depends on the numeric prefix (`1!`, `2!`, ...). When adding datasets, choose a prefix that preserves foreign-key dependencies. - `data/create_table.sql` drops and recreates tables, indexes, and foreign keys. Update this script alongside any schema or CSV column changes. -- `data_validator` currently verifies that `5!station_station_types.csv` references valid station and type IDs. Extend the validator when new cross-references are introduced and keep the process fail-fast (panic on invalid data). +- `data_validator` currently verifies that `5!station_station_types.csv` references valid station and type IDs, and that order-sensitive station sequences in `3!stations.csv` stay intact under `ORDER BY e_sort, station_cd` (e.g. the Toei Oedo Line's Tochomae rows, whose misordering silently drops the station from ETA estimation). Extend the validator when new cross-references or order-sensitive spots are introduced and keep the process fail-fast (panic on invalid data). ## Testing and Quality - **Unit tests** – `cargo test --lib --package stationapi` or `make test-unit`; focus on entities and repository mocks without a database. @@ -55,7 +54,7 @@ This guide explains how automation agents and human contributors should work wit - **Lines** – `GetLineById`, `GetLinesByIdList`, `GetLinesByName`. Results include company data and computed line symbols based on repository helpers. - **Routes** – `GetRoutes`, `GetRoutesMinimal`. The minimal variant returns `RouteMinimalResponse` with deduplicated `LineMinimal` data; paging tokens are currently empty (pagination not implemented). - **Train types** – `GetTrainTypesByStationId`, `GetRouteTypes`. Train types aggregate by line group and include related lines plus optional train type metadata. Rail variants use `TrainTypeKind::{Default, Branch, Rapid, Express, LimitedExpress, HighSpeedRapid, CommuterRapid}` (0-6); bus variants use `BusRoute` (7), which represents a `(route_id, shape_id)` operation pattern (e.g. 循環 / 短ターン / 支線) generated automatically from the Toei Bus GTFS feed. -- **GTFS bus integration** – At startup, `src/import.rs::integrate_gtfs_to_stations()` ingests GTFS feeds into `gtfs_*` tables and then projects them onto the shared `stations` / `lines` / `types` / `station_station_types` tables. By default only the stable Toei Bus feed is imported; set `ENABLE_EXPERIMENTAL_BUS_FEATURE=true` to import every configured feed, including Seibu Bus (downloaded from ODPT with `ODPT_ACCESS_TOKEN`). `transport_type` (0: rail, 1: bus) on both `stations` and `lines` keeps the two worlds queryable side by side. GTFS IDs are namespaced per feed before import to avoid cross-operator collisions. `line_cd` (100,000,000+), `station_cd` / `station_g_cd` (200,000,000+), and bus `type_cd` / `line_group_cd` (100,000,000+) are all deterministic fnv1a hashes that stay clear of the rail data ranges. Disable the entire bus pipeline with `DISABLE_BUS_FEATURE=true`. +- **GTFS bus integration** – At startup, `src/import.rs::integrate_gtfs_to_stations()` ingests GTFS feeds into `gtfs_*` tables and then projects them onto the shared `stations` / `lines` / `types` / `station_station_types` tables. Every configured feed is imported, including Seibu Bus (downloaded from ODPT with `ODPT_ACCESS_TOKEN`). `transport_type` (0: rail, 1: bus) on both `stations` and `lines` keeps the two worlds queryable side by side. GTFS IDs are namespaced per feed before import to avoid cross-operator collisions. `line_cd` (100,000,000+), `station_cd` / `station_g_cd` (200,000,000+), and bus `type_cd` / `line_group_cd` (100,000,000+) are all deterministic fnv1a hashes that stay clear of the rail data ranges. Disable the entire bus pipeline with `DISABLE_BUS_FEATURE=true`. - **TTS metadata** – `Station`, `StationMinimal`, `Line`, and `TrainType` expose `name_ipa` / `name_roman_ipa` plus `name_tts_segments` for multi-segment pronunciation output. Use `name_tts_segments` when clients need per-token SSML construction for mixed-language names such as `Kasai-Rinkai Park`. - **Connected routes** – `GetConnectedRoutes`. `QueryInteractor::get_connected_stations` is not implemented yet and returns an empty vector; update the use-case and infrastructure layers together when adding real logic. - Changes to the service contract require coordinated updates to `proto/stationapi.proto`, regenerated code via `tonic-build`, and corresponding adjustments in both presentation and use-case layers. diff --git a/README.md b/README.md index 4b3fab2c..31f9bc5c 100644 --- a/README.md +++ b/README.md @@ -110,4 +110,7 @@ We follow Rust best practices for testing: ## Data Sources - Bus-related data provided by [Tokyo Metropolitan Bureau of Transportation (Toei)](https://www.kotsu.metro.tokyo.jp/), licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) +- Bus-related data provided by [Seibu Bus Co., Ltd. (西武バス)](https://www.seibubus.co.jp/) via the [Public Transportation Open Data Center](https://ckan.odpt.org/), licensed under the [Public Transportation Open Data Basic License](https://developer.odpt.org/terms) - Station data provided by [駅データ.jp](https://www.ekidata.jp/) +- Speed calibration data (`speed_table.rs`) derived from GTFS timetables provided by Kyoto City Transportation Bureau (京都市交通局), Yokohama City Transportation Bureau (横浜市交通局), Tokyo Metro (東京メトロ), Metropolitan Intercity Railway (首都圏新都市鉄道), Tokyo Tama Intercity Monorail (多摩都市モノレール), and Tokyo Waterfront Area Rapid Transit (東京臨海高速鉄道) via the [Public Transportation Open Data Center](https://ckan.odpt.org/), licensed under the [Public Transportation Open Data Basic License](https://developer.odpt.org/terms); by [Tokyo Metropolitan Bureau of Transportation (Toei)](https://www.kotsu.metro.tokyo.jp/), licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); and by Hakodate City Enterprise Bureau Transportation Department (函館市企業局交通部), licensed under [GTFS-RUL (ODPT)](https://gtfs-jp.org/GTFS-RUL(ODPT).pdf) +- Average inter-station distances (`average_distance`) computed from railway track geometry © [OpenStreetMap contributors](https://www.openstreetmap.org/copyright), licensed under [ODbL](https://opendatacommons.org/licenses/odbl/) diff --git a/data/2!lines.csv b/data/2!lines.csv index 77efdbd5..283b2967 100644 --- a/data/2!lines.csv +++ b/data/2!lines.csv @@ -1,625 +1,625 @@ -line_cd,company_cd,line_name,line_name_k,line_name_h,line_name_r,line_name_rn,line_name_zh,line_name_ko,line_color_c,line_type,line_symbol1,line_symbol2,line_symbol3,line_symbol4,line_symbol1_color,line_symbol2_color,line_symbol3_color,line_symbol4_color,line_symbol1_shape,line_symbol2_shape,line_symbol3_shape,line_symbol4_shape,e_status,e_sort,average_distance -1001,3,中央新幹線,チュウオウシンカンセン,中央新幹線,Chuo Shinkansen,Chuo Shinkansen,中央新干线,주오 신칸센,#000000,1,,,,,,,,,NOOP,,,,1,1001,0 -1002,3,東海道新幹線,トウカイドウシンカンセン,東海道新幹線,Tokaido Shinkansen,Tokaido Shinkansen,东海道新干线,도카이도 신칸센,#0000FF,1,,,,,,,,,NOOP,,,,0,1002,31664.84112 -1003,4,山陽新幹線,サンヨウシンカンセン,山陽新幹線,Sanyo Shinkansen,Sanyo Shinkansen,山阳新干线,산요 신칸센,#0000FF,1,,,,,,,,,NOOP,,,,0,1003,30686.38868 -1004,2,東北新幹線,トウホクシンカンセン,東北新幹線,Tōhoku Shinkansen,Tohoku Shinkansen,东北新干线,도호쿠 신칸센,#008000,1,,,,,,,,,NOOP,,,,0,1004,30711.08884 -1005,2,上越新幹線,ジョウエツシンカンセン,上越新幹線,Joetsu Shinkansen,Joetsu Shinkansen,上越新干线,조에쓰 신칸센,#008000,1,,,,,,,,,NOOP,,,,0,1005,27350.8261 -1006,2,上越新幹線(ガーラ湯沢支線),ジョウエツシンカンセン,上越新幹線(ガーラ湯沢支線),Joetsu Shinkansen,Joetsu Shinkansen,上越新干线,조에쓰 신칸센,#008000,1,,,,,,,,,NOOP,,,,0,1006,1883.81759 -1007,2,山形新幹線,ヤマガタシンカンセン,山形新幹線,Yamagata Shinkansen,Yamagata Shinkansen,山形新干线,야마가타 신칸센,#FFA030,1,,,,,,,,,NOOP,,,,0,1007,14868.12368 -1008,2,秋田新幹線,アキタシンカンセン,秋田新幹線,Akita Shinkansen,Akita Shinkansen,秋田新干线,아키타 신칸센,#FF0080,1,,,,,,,,,NOOP,,,,0,1008,25377.10815 -1009,2,北陸新幹線,ホクリクシンカンセン,北陸新幹線,Hokuriku Shinkansen,Hokuriku Shinkansen,北陆新干线,호쿠리쿠 신칸센,#008000,1,,,,,,,,,NOOP,,,,0,1009,25170.74968 -1010,6,九州新幹線,キュウシュウシンカンセン,九州新幹線,Kyushu Shinkansen,Kyushu Shinkansen,九州新干线,규슈 신칸센,#FF0000,1,,,,,,,,,NOOP,,,,0,1010,23348.86657 -1011,1,北海道新幹線,ホッカイドウシンカンセン,北海道新幹線,Hokkaido Shinkansen,Hokkaido Shinkansen,北海道新干线,홋카이도 신칸센,#6E5CA5,1,,,,,,,,,NOOP,,,,0,1011,49638.47771 -1012,6,西九州新幹線,ニシキュウシュウシンカンセン,西九州新幹線,Nishi-Kyushu Shinkansen,Nishi-Kyushu Shinkansen,西九州新干线,니시큐슈 신칸센,#E10017,1,,,,,,,,,NOOP,,,,0,1012,16460.66246 -11101,1,函館本線,ハコダテホンセン,函館本線,Hakodate Main Line,Hakodate Main Line,函馆本线,하코다테 본선,#0072BC,2,H,N,,,#0072BC,#0072BC,,,ROUND,ROUND,,,0,11101,5751.21755 -11102,1,函館本線,ハコダテホンセン,函館本線,Hakodate Main Line,Hakodate Main Line,函馆本线,하코다테 본선,#ED1C23,2,S,H,,,#ED1C23,#0072BC,,,ROUND,ROUND,,,0,11102,8706.85948 -11103,1,函館本線,ハコダテホンセン,函館本線,Hakodate Main Line,Hakodate Main Line,函馆本线,하코다테 본선,#F7931D,2,A,H,,S,#F7931D,#0072BC,#F7931D,#ED1C23,ROUND,ROUND,MONOCHROME_ROUND,ROUND,0,11103,4242.70521 -11104,1,室蘭本線,ムロランホンセン,室蘭本線,Muroran Main Line,Muroran Main Line,室兰本线,무로란 본선,#0072BC,2,H,M,,,#0072BC,#0072BC,,,ROUND,ROUND,,,0,11104,4663.48446 -11105,1,室蘭本線,ムロランホンセン,室蘭本線,Muroran Main Line,Muroran Main Line,室兰本线,무로란 본선,#808080,2,H,K,A,,#0072BC,#8CC63E,#F7931D,,ROUND,ROUND,ROUND,,0,11105,5799.95676 -11106,1,根室本線,ネムロホンセン,根室本線,Nemuro Main Line,Nemuro Main Line,根室本线,네무로 본선,#F6989D,2,T,K,A,,#F6989D,#8CC63E,#F7931D,,ROUND,ROUND,ROUND,,0,11106,7771.24051 -11107,1,根室本線,ネムロホンセン,根室本線,Nemuro Main Line,Nemuro Main Line,根室本线,네무로 본선,#8CC63E,2,K,,,,#8CC63E,,,,ROUND,,,,0,11107,7120.01641 -11108,1,花咲線,ハナサキセン,根室本線,Hanasaki Line,Hanasaki Line,花咲线,하나사키선,#808080,2,K,B,,,#8CC63E,#EF59A1,,,ROUND,ROUND,,,0,11108,8394.29526 -11109,1,千歳線,チトセセン,千歳線,Chitose Line,Chitose Line,千岁线,지토세선,#00B2EB,2,H,AP,,,#0072BC,#00B2EB,#00B2EB,,ROUND,ROUND,MONOCHROME_ROUND,,0,11109,4658.0034 -11110,1,石勝線,セキショウセン,石勝線,Sekisho Main Line,Sekisho Main Line,石胜线,세키쇼선,#8CC63E,2,K,H,Y,,#8CC63E,#0072BC,#8CC63E,,ROUND,ROUND,ROUND,,0,11110,21622.86655 -11111,1,日高本線,ヒダカホンセン,日高本線,Hidaka Main Line,Hidaka Main Line,日高本线,히다카 본선,#808080,2,H,,,,#0072BC,,,,ROUND,,,,0,11111,10690.53366 -11112,1,札沼線,サッショウセン,札沼線,Sassho Line,Sassho Line,札沼线,삿쇼선,#00A54F,2,G,S,,,#00A54F,#ED1C23,#00A54F,,ROUND,ROUND,MONOCHROME_ROUND,,0,11112,2132.35164 -11113,1,留萌本線,ルモイホンセン,留萌本線,Rumoi Main Line,Rumoi Main Line,留萌本线,루모이 본선,#808080,2,,,,,,,,,,,,,2,11113,3301.27079 -11114,1,富良野線,フラノセン,富良野線,Furano Line,Furano Line,富良野线,후라노선,#AA5EA6,2,F,A,T,,#AA5EA6,#F7931D,#F6989D,,ROUND,ROUND,ROUND,,0,11114,3534.04987 -11115,1,宗谷本線,ソウヤホンセン,宗谷本線,Soya Main Line,Soya Main Line,宗谷本线,소야 본선,#954A35,2,W,A,,,#954A35,#F7931D,,,ROUND,ROUND,,,0,11115,7559.48998 -11116,1,石北本線,セキホクホンセン,石北本線,Sekihoku Main Line,Sekihoku Main Line,石北本线,세키호쿠 본선,#F7931D,2,A,,,,#F7931D,,,,ROUND,,,,0,11116,7365.37104 -11117,1,釧網本線,センモウホンセン,釧網本線,Senmo Main Line,Senmo Main Line,钏网本线,센모 본선,#EF59A1,2,B,A,K,,#EF59A1,#F7931D,#8CC63E,,ROUND,ROUND,ROUND,,0,11117,7458.97654 -11118,1,海峡線,カイキョウセン,海峡線,Kaikyo Line,Kaikyo Line,海峡线,가이쿄선,#808080,2,,,,,,,,,,,,,0,11118,41415.71645 -11119,1,江差線,エサシセン,江差線,Esashi Line,Esashi Line,江差线,에사시선,#808080,2,,,,,,,,,,,,,2,11119,4927.03676 -11201,2,東北本線,トウホクホンセン,東北本線,Tohoku Main Line,Tohoku Main Line,东北本线,도호쿠 본선,#3CB371,2,,,,,,,,,,,,,2,11201,0 -11202,2,奥羽本線,オウウホンセン,奥羽本線,Ou Main Line,Ou Main Line,奥羽本线,오우 본선,#FF6600,2,,,,,,,,,,,,,0,11202,5078.81003 -11231,2,東北本線,トウホクホンセン,東北本線,Tohoku Main Line,Tohoku Main Line,东北本线,도호쿠 본선,#3CB371,2,,,,,,,,,,,,,0,11202,4941.34332 -11203,2,はまなすベイライン大湊線,ハマナスベイラインオオミナトセン,大湊線,Ominato Line,Ominato Line,大凑线,오미나토선,#F1AA28,2,,,,,,,,,,,,,0,11203,5783.7144 -11204,2,五能線,ゴノウセン,五能線,Gono Line,Gono Line,五能线,고노선,#0000FF,2,,,,,,,,,,,,,0,11204,3709.8911 -11205,2,津軽線,ツガルセン,津軽線,Tsugaru Line,Tsugaru Line,津轻线,쓰가루선,#00B2E5,2,,,,,,,,,,,,,0,11205,3231.67465 -11206,2,八戸線,ハチノヘセン,八戸線,Hachinohe Line,Hachinohe Line,八户线,하치노헤선,#FF0000,2,,,,,,,,,,,,,0,11206,2775.18494 -11207,2,岩泉線,イワイズミセン,岩泉線,Iwaizumi Line,Iwaizumi Line,岩泉线,이와이즈미선,#808080,2,,,,,,,,,,,,,2,11207,5029.38286 -11208,2,ドラゴンレール大船渡線,ドラゴンレールオオフナトセン,大船渡線,Ofunato Line,Ofunato Line,大船渡线,오후나토선,#FF6600,2,,,,,,,,,,,,,0,11208,4676.41919 -11209,2,銀河ドリームライン釜石線,ギンガドリームラインカマイシセン,釜石線,Kamaishi Line,Kamaishi Line,釜石线,가마이시선,#3399FF,2,,,,,,,,,,,,,0,11209,3833.74466 -11210,2,北上線,キタカミセン,北上線,Kitakami Line,Kitakami Line,北上线,기타카미선,#9966FF,2,,,,,,,,,,,,,0,11210,4298.02779 -11211,2,田沢湖線,タザワコセン,田沢湖線,Tazawako Line,Tazawako Line,田泽湖线,다자와코선,#CC00CC,2,,,,,,,,,,,,,0,11211,4404.27879 -11212,2,十和田八幡平四季彩ライン,トワダハチマンタイシキサイライン,花輪線,Hanawa Line,Hanawa Line,花轮线,하나와선,#FF0000,2,,,,,,,,,,,,,0,11212,4057.91742 -11213,2,山田線,ヤマダセン,山田線,Yamada Line,Yamada Line,山田线,야마다선,#A52A2A,2,,,,,,,,,,,,,0,11213,7119.63504 -11214,2,羽越本線,ウエツホンセン,羽越本線,Uetsu Main Line,Uetsu Main Line,羽越本线,우에쓰 본선,#16C0E9,2,,,,,,,,,,,,,0,11214,4527.50896 -11215,2,男鹿線,オガセン,男鹿線,Oga Line,Oga Line,男鹿线,오가선,#008000,2,,,,,,,,,,,,,0,11215,3258.95101 -11216,2,山形線,ヤマガタセン,奥羽本線,Ou Main Line,Ou Main Line,奥羽本线,오우 본선,#FF6600,2,,,,,,,,,,,,,0,11216,4347.80555 -11217,2,仙山線,センザンセン,仙山線,Senzan Line,Senzan Line,仙山线,센잔선,#77DD00,2,,,,,,,,,,,,,0,11217,3260.49073 -11218,2,フルーツライン左沢線,フルーツラインアテラザワセン,左沢線,Aterazawa Line,Aterazawa Line,左泽线,아테라자와선,#87CEEB,2,,,,,,,,,,,,,0,11218,2342.45187 -11219,2,米坂線,ヨネサカセン,米坂線,Yonesaka Line,Yonesaka Line,米坂线,요네사카선,#9E7EB9,2,,,,,,,,,,,,,0,11219,4748.5509 -11220,2,奥の細道最上川ライン,オクノホソミチモガミガワライン,陸羽西線,Riku-West Line,Riku-West Line,陆羽西线,리쿠우사이선,#32CD32,2,,,,,,,,,,,,,0,11220,4722.99873 -11221,2,奥の細道湯けむりライン,オクノホソミチユケムリライン,陸羽東線,Riku-East Line,Riku-East Line,陆羽东线,리쿠우토선,#888888,2,,,,,,,,,,,,,0,11221,3579.42511 -11222,2,仙石線,センセキセン,仙石線,Senseki Line,Senseki Line,仙石线,센세키선,#00AAEE,2,,,,,,,,,,,,,0,11222,1540.61707 -11223,2,石巻線,イシノマキセン,石巻線,Ishinomaki Line,Ishinomaki Line,石卷线,이시노마키선,#FF8888,2,,,,,,,,,,,,,0,11223,3387.61695 -11224,2,気仙沼線,ケセンヌマセン,気仙沼線,Kesennuma Line,Kesennuma Line,气仙沼线,게센누마선,#6600CC,2,,,,,,,,,,,,,0,11224,3455.74637 -11225,2,磐越西線,バンエツサイセン,磐越西線,Ban-etsu-West Line,Ban-etsu-West Line,磐越西线,반에쓰사이선,#CB7B35,2,,,,,,,,,,,,,0,11225,4271.66886 -11226,2,森と水とロマンの鉄道,モリトミズトロマンノテツドウ,磐越西線,Ban-etsu-West Line,Ban-etsu-West Line,磐越西线,반에쓰사이선,#CB7B35,2,,,,,,,,,,,,,0,11226,4093.05313 -11227,2,只見線,タダミセン,只見線,Tadami Line,Tadami Line,只见线,다다미선,#008DD1,2,,,,,,,,,,,,,0,11227,3796.92669 -11228,2,ゆうゆうあぶくまライン,ユウユウアブクマライン,磐越東線,Ban-etsu-East Line,Ban-etsu-East Line,磐越东线,반에쓰토선,#C71585,2,,,,,,,,,,,,,0,11228,5641.37369 -11229,2,常磐線,ジョウバンセン,常磐線,Joban Line,Joban Line,常磐线,조반선,#007AC0,2,JJ,,,,#00B261,,,,SQUARE,,,,0,11229,5041.85031 -11230,2,常磐線,ジョウバンセン,常磐線,Joban Line,Joban Line,常磐线,조반선,#007AC0,2,,,,,,,,,,,,,0,11230,4422.90225 -11301,2,東海道線,トウカイドウセン,東海道本線,Tokaido Line,Tokaido Line,东海道线,도카이도선,#F68B1E,2,JT,,,,#F68B1E,,,,SQUARE,,,,0,11301,5164.31735 -11302,2,山手線,ヤマノテセン,山手線,Yamanote Line,Yamanote Line,山手线,야마노테선,#80C241,2,JY,,,,#80C241,,,,SQUARE,,,,0,11302,1093.73663 -11303,2,南武線,ナンブセン,南武線,Nambu Line,Nambu Line,南武线,난부선,#FFD400,2,JN,,,,#FFD400,,,,SQUARE,,,,0,11303,1476.10425 -11304,2,鶴見線,ツルミセン,鶴見線,Tsurumi Line,Tsurumi Line,鹤见线,쓰루미선,#FFD400,2,JI,,,,#FFD400,,,,SQUARE,,,,0,11304,938.19048 -11305,2,武蔵野線,ムサシノセン,武蔵野線,Musashino Line,Musashino Line,武藏野线,무사시노선,#F15A22,2,JM,,,,#F15A22,,,,SQUARE,,,,0,11305,2846.26108 -11306,2,横浜線,ヨコハマセン,横浜線,Yokohama Line,Yokohama Line,横滨线,요코하마선,#80C241,2,JH,,,,#80C241,,,,SQUARE,,,,0,11306,2198.034 -11307,2,根岸線,ネギシセン,根岸線,Negishi Line,Negishi Line,根岸线,네기시선,#00B2E5,2,JK,,,,#00B2E5,,,,SQUARE,,,,0,11307,1900.95746 -11308,2,横須賀線,ヨコスカセン,横須賀線,Yokosuka Line,Yokosuka Line,横须贺线,요코스카선,#0067C0,2,JO,,,,#0067C0,,,,SQUARE,,,,0,11308,4353.0478 -11309,2,相模線,サガミセン,相模線,Sagami Line,Sagami Line,相模线,사가미선,#009793,2,,,,,,,,,,,,,0,11309,1898.70754 -11311,2,中央本線,チュウオウホンセン,中央本線,Chuo Line,Chuo Line,中央本线,주오 본선,#007AC0,2,JC,CO,,,#F15A22,#007AC0,,,SQUARE,SQUARE,,,0,11311,5007.67526 -11312,2,中央線(快速),チュウオウセン,中央線(快速),Chuo Line,Chuo Line,中央线,츄오선,#F15A22,2,JC,JB,,,#F15A22,,,,SQUARE,,,,0,11312,1691.40943 -11313,2,中央・総武線,チュウオウ・ソウブセン,中央・総武緩行線,Chuo-Sobu Line,Chuo-Sobu Line,中央・总武线,주오·소부선,#FFD400,2,JB,,,,#FFD400,,,,SQUARE,,,,0,11313,1565.82827 -11314,2,総武本線,ソウブホンセン,総武本線,Sobu Main Line,Sobu Main Line,总武本线,소부 본선,#0067C0,2,JO,,,,#0067C0,,,,SQUARE,,,,0,11314,3955.34259 -11315,2,青梅線,オウメセン,青梅線,Ome Line,Ome Line,青梅线,오메선,#F15A22,2,JC,,,,#F15A22,,,,SQUARE,,,,0,11315,1493.49082 -11316,2,五日市線,イツカイチセン,五日市線,Itsukaichi Line,Itsukaichi Line,五日市线,이쓰카이치선,#F15A22,2,JC,,,,#F15A22,,,,SQUARE,,,,0,11316,1820.96922 -11317,2,八高線,ハチコウセン,八高線,Hachiko Line,Hachiko Line,八高线,하치코선,#A8A39D,2,,,,,,,,,,,,,0,11317,3830.46342 -11318,2,八高線,ハチコウセン,八高線,Hachiko Line,Hachiko Line,八高线,하치코선,#A8A39D,2,,,,,,,,,,,,,0,11318,4296.49117 -11319,2,宇都宮線,ウツノミヤセン,東北本線,Utsunomiya Line,Utsunomiya Line,宇都宫线,우쓰노미야선,#F68B1E,2,JU,,,,#F68B1E,,,,SQUARE,,,,0,11319,4937.52562 -11320,2,常磐快速線,ジョウバンカイソクセン,常磐線,Joban Rapid Line,Joban Rapid Line,常磐快速线,조반 쾌속선,#00B261,2,JJ,JL,,,#00B261,#A2A9B1,,,SQUARE,SQUARE,,,0,11320,2164.62731 -11321,2,埼京線,サイキョウセン,埼京線,Saikyo Line,Saikyo Line,埼京线,사이쿄선,#00B48D,2,JA,,,,#00B48D,,,,SQUARE,,,,0,11321,2025.61314 -11322,2,川越線,カワゴエセン,川越線,Kawagoe Line,Kawagoe Line,川越线,가와고에선,#00B48D,2,JA,,,,#00B48D,,,,SQUARE,,,,0,11322,3030.1817 -11323,2,高崎線,タカサキセン,高崎線,Takasaki Line,Takasaki Line,高崎线,다카사키선,#F68B1E,2,JU,,,,#F68B1E,,,,SQUARE,,,,0,11323,4385.72588 -11324,2,外房線,ソトボウセン,外房線,Sotobo Line,Sotobo Line,外房线,소토보선,#DB4028,2,,,,,,,,,,,,,0,11324,3514.60159 -11325,2,内房線,ウチボウセン,内房線,Uchibo Line,Uchibo Line,内房线,우치보선,#00B9F1,2,,,,,,,,,,,,,0,11325,3926.9682 -11326,2,京葉線,ケイヨウセン,京葉線,Keiyo Line,Keiyo Line,京叶线,게이요선,#C9242F,2,JE,JM,,,#C9242F,#F15A22,,,SQUARE,SQUARE,,,0,11326,2857.30509 -11327,2,成田線,ナリタセン,成田線,Narita Line,Narita Line,成田线,나리타선,#00B261,2,JO,,,,#007AC0,,,,SQUARE,,,,0,11327,7886.443 -11328,2,成田エクスプレス,ナリタエクスプレス,成田エクスプレス,Narita Express,Narita Express,成田特快,나리타 익스프레스,#F61E21,2,,,,,,,,,,,,,3,11328,13509.35879 -11329,2,鹿島線,カシマセン,鹿島線,Kashima Line,Kashima Line,鹿岛线,가시마선,#C56E2E,2,,,,,,,,,,,,,0,11329,3447.19874 -11330,2,久留里線,クルリセン,久留里線,Kururi Line,Kururi Line,久留里线,구루리선,#00B5AD,2,,,,,,,,,,,,,0,11330,2414.17796 -11331,2,東金線,トウガネセン,東金線,Togane Line,Togane Line,东金线,도가네선,#F15A22,2,,,,,,,,,,,,,0,11331,3550.70015 -11332,2,京浜東北線,ケイヒントウホクセン,京浜東北線,Keihin-Tohoku Line,Keihin-Tohoku Line,京滨东北线,게이힌 도호쿠선,#00B2E5,2,JK,,,,#00B2E5,,,,SQUARE,,,,0,11332,1664.92567 -11333,2,湘南新宿ライン,ショウナンシンジュクライン,湘南新宿ライン,Shonan-Shinjuku Line,Shonan-Shinjuku Line,湘南新宿线,쇼난 신주쿠 라인,#F68B1E,2,JS,,,,#E31F26,,,,SQUARE,,,,0,11333,5629.19034 -11343,2,上野東京ライン,ウエノトウキョウライン,上野東京ライン,Ueno-Tokyo Line,Ueno-Tokyo Line,上野东京线,우에노 도쿄 라인,#F68B1E,2,JU,,,,#F68B1E,,,,SQUARE,,,,0,11333,3743.43366 -11334,2,烏山線,カラスヤマセン,烏山線,Karasuyama Line,Karasuyama Line,乌山线,가라스야마선,#008000,2,,,,,,,,,,,,,0,11334,2829.27266 -11335,2,吾妻線,アガツマセン,吾妻線,Agatsuma Line,Agatsuma Line,吾妻线,아가쓰마선,#0F5474,2,,,,,,,,,,,,,0,11335,3177.68477 -11337,2,信越本線,シンエツホンセン,信越本線,Shin’etsu Main Line,Shin’etsu Main Line,信越本线,신에쓰 본선,#9ACD32,2,,,,,,,,,,,,,0,11337,4071.18638 -11338,2,水郡線,スイグンセン,水郡線,Suigun Line,Suigun Line,水郡线,스이군선,#008000,2,,,,,,,,,,,,,0,11338,3667.0013 -11339,2,水戸線,ミトセン,水戸線,Mito Line,Mito Line,水户线,미토선,#3333FF,2,,,,,,,,,,,,,0,11339,3317.11634 -11340,2,日光線,ニッコウセン,日光線,Nikko Line,Nikko Line,日光线,닛코선,#880022,2,,,,,,,,,,,,,0,11340,6702.69079 -11341,2,両毛線,リョウモウセン,両毛線,Ryomo Line,Ryomo Line,两毛线,료모선,#FFD400,2,,,,,,,,,,,,,0,11341,4866.83608 -11342,2,上越線,ジョウエツセン,上越線,Joetsu Line,Joetsu Line,上越线,조에쓰선,#00B3E6,2,,,,,,,,,,,,,0,11342,4871.4962 -11344,2,常磐線,ジョウバンセン,常磐線(緩行線),Joban Line,Joban Line,常磐线,조반선,#A2A9B1,2,JL,,,,#A2A9B1,,,,SQUARE,,,,0,11345,2263.86009 -11345,100,ディズニーリゾートライン,ディズニーリゾートライン,ディズニーリゾートライン,Disney Resort Line,Disney Resort Line,迪士尼度假区线,디즈니 리조트 라인,#004499,5,,,,,,,,,,,,,0,11343,1389.03537 -11401,2,小海線,コウミセン,小海線,Koumi Line,Koumi Line,小海线,고우미선,#008000,2,,,,,,,,,,,,,0,11401,2560.68727 -11402,3,身延線,ミノブセン,身延線,Minobu Line,Minobu Line,身延线,미노부선,#6F2D98,2,CC,,,,#6F2D98,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11402,2271.65832 -11403,2,信越本線,シンエツホンセン,信越本線,Shin’etsu Main Line,Shin’etsu Main Line,信越本线,신에쓰 본선,#00B3E6,2,SE,,,,#00B3E6,,,,SQUARE,,,,0,11403,2304.32432 -11404,2,信越本線,シンエツホンセン,信越本線,Shin’etsu Main Line,Shin’etsu Main Line,信越本线,신에쓰 본선,#00B3E6,2,,,,,,,,,,,,,0,11404,3296.32902 -11405,4,北陸本線,ホクリクホンセン,北陸本線,Hokuriku Main Line,Hokuriku Main Line,北陆本线,호쿠리쿠 본선,#FFD400,2,,,,,,,,,,,,,2,11405,0 -11406,2,白新線,ハクシンセン,白新線,Hakushin Line,Hakushin Line,白新线,하쿠신선,#F387B7,2,,,,,,,,,,,,,0,11406,2999.90473 -11407,2,飯山線,イイヤマセン,飯山線,Iiyama Line,Iiyama Line,饭山线,이야마선,#7BC24B,2,,,,,,,,,,,,,0,11407,3491.78175 -11408,2,越後線,エチゴセン,越後線,Echigo Line,Echigo Line,越后线,에치고선,#40934D,2,,,,,,,,,,,,,0,11408,2582.39854 -11409,2,北アルプス線,キタアルプスセン,大糸線,Oito Line,Oito Line,大糸线,오이토선,#9370DB,2,,,,,,,,,,,,,0,11409,2603.83354 -11410,2,弥彦線,ヤヒコセン,弥彦線,Yahiko Line,Yahiko Line,弥彦线,야히코선,#922790,2,,,,,,,,,,,,,0,11410,2414.18702 -11411,3,中央本線,チュウオウホンセン,中央本線,Chuo Line,Chuo Line,中央线,주오선,#307097,2,CF,,,,#307097,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11411,4390.25074 -11412,2,篠ノ井線,シノノイセン,篠ノ井線,Shinonoi Line,Shinonoi Line,篠之井线,시노노이선,#F15A22,2,SN,,,,#F15A22,,,,SQUARE,,,,0,11412,4698.86967 -11413,3,飯田線,イイダセン,飯田線,Iida Line,Iida Line,饭田线,이다선,#6CA2D6,2,CD,,,,#6CA2D6,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11413,2262.93207 -11414,3,飯田線,イイダセン,飯田線,Iida Line,Iida Line,饭田线,이다선,#6CA2D6,2,CD,,,,#6CA2D6,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11414,1794.88663 -11415,4,北陸本線,ホクリクホンセン,北陸本線,Hokuriku Main Line,Hokuriku Main Line,北陆本线,호쿠리쿠 본선,#D60000,2,A,B,,,#0072BC,#00ACD1,,,REVERSED_SQUARE_WEST,REVERSED_SQUARE_WEST,,,0,11415,4185.95216 -11416,3,高山本線,タカヤマホンセン,高山本線,Takayama Line,Takayama Line,高山线,다카야마선,#9E1311,2,CG,,,,#9E1311,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11416,5090.65477 -11417,4,城端線,ジョウハナセン,城端線,Johana Line,Johana Line,城端线,조하나선,#846AA8,2,,,,,,,,,,,,,0,11417,2260.30908 -11418,4,氷見線,ヒミセン,氷見線,Himi Line,Himi Line,冰见线,히미선,#A646A6,2,,,,,,,,,,,,,0,11418,2309.26031 -11419,4,七尾線,ナナオセン,七尾線,Nanao Line,Nanao Line,七尾线,나나오선,#1DA5BD,2,,,,,,,,,,,,,0,11419,3502.62168 -11420,4,敦賀港線,ツルガコウセン,北陸本線,Tsurugaminato Line,Tsurugaminato Line,敦贺港线,츠루가미나토선,#FFCC00,2,,,,,,,,,,,,,2,11420,2396.90408 -11421,4,九頭竜線,クズリュウセン,越美北線,Kuzuryu Line,Kuzuryu Line,九头龙线,구즈류선,#3C9922,2,,,,,,,,,,,,,0,11421,2465.1632 -11422,4,小浜線,オバマセン,小浜線,Obama Line,Obama Line,小滨线,오바마선,#0072BC,2,,,,,,,,,,,,,0,11422,3616.65186 -11501,3,東海道本線,トウカイドウホンセン,東海道本線,Tokaido Line,Tokaido Line,东海道线,도카이도선,#F47921,2,CA,,,,#F47921,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11501,4441.12478 -11502,3,東海道本線,トウカイドウホンセン,東海道本線,Tokaido Line,Tokaido Line,东海道线,도카이도선,#F47921,2,CA,,,,#F47921,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11502,3454.94389 -11503,3,東海道本線,トウカイドウホンセン,東海道本線,Tokaido Line,Tokaido Line,东海道线,도카이도선,#F47921,2,CA,,,,#F47921,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11503,5008.52863 -11504,2,伊東線,イトウセン,伊東線,Ito Line,Ito Line,伊东线,이토선,#F68B1E,2,JT,,,,#F68B1E,,,,SQUARE,,,,0,11504,3293.87447 -11505,3,御殿場線,ゴテンバセン,御殿場線,Gotemba Line,Gotemba Line,御殿场线,고텐바선,#447442,2,CB,,,,#447442,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11505,3314.26909 -11506,3,武豊線,タケトヨセン,武豊線,Taketoyo Line,Taketoyo Line,武丰线,다케토요선,#83502F,2,CE,,,,#83502F,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11506,2143.85534 -11507,3,太多線,タイタセン,太多線,Taita Line,Taita Line,太多线,다이타선,#C7B944,2,CI,,,,#C7B944,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11507,2485.52984 -11508,3,関西本線,カンサイホンセン,関西本線,Kansai Line,Kansai Line,关西线,간사이선,#0FB68F,2,CJ,,,,#0FB68F,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11508,3521.88653 -11509,4,関西本線,カンサイホンセン,関西本線,Kansai Main Line,Kansai Main Line,关西本线,간사이 본선,#0FB68F,2,,,,,,,,,,,,,0,11509,5496.62858 -11510,3,紀勢本線,キセイホンセン,紀勢本線,Kisei Line,Kisei Line,纪势线,기세이선,#F80039,2,,,,,,,,,,,,,0,11510,4447.92245 -11511,4,草津線,クサツセン,草津線,Kusatsu Line,Kusatsu Line,草津线,구사쓰선,#CBCF10,2,C,,,,#CBCF10,,,,REVERSED_SQUARE_WEST,,,,0,11511,3617.10434 -11512,3,参宮線,サングウセン,参宮線,Sangu Line,Sangu Line,参宫线,산구선,#4D2E8C,2,,,,,,,,,,,,,0,11512,3162.76386 -11513,3,名松線,メイショウセン,名松線,Meisho Line,Meisho Line,名松线,메이쇼선,#E9E343,2,,,,,,,,,,,,,0,11513,3061.97516 -11601,4,琵琶湖線,ビワコセン,東海道本線,Biwako Line,Biwako Line,琵琶湖线,비와코선,#0072BC,2,A,,,,#0072BC,,,,REVERSED_SQUARE_WEST,,,,0,11601,3579.96107 -11602,4,JR京都線,ジェーアールキョウトセン,東海道本線,Kyoto Line,Kyoto Line,京都线,교토선,#0072BC,2,A,,,,#0072BC,,,,REVERSED_SQUARE_WEST,,,,0,11602,2641.99124 -11603,4,JR神戸線,ジェーアールコウベセン,東海道本線,Kobe Line,Kobe Line,神户线,고베선,#0072BC,2,A,,,,#0072BC,,,,REVERSED_SQUARE_WEST,,,,0,11603,2043.28501 -11605,4,湖西線,コセイセン,湖西線,Kosei Line,Kosei Line,湖西线,고세이선,#576290,2,B,,,,#00ACD1,,,,REVERSED_SQUARE_WEST,,,,0,11605,3797.95505 -11607,4,大和路線,ヤマトジセン,関西本線,Yamatoji Line,Yamatoji Line,大和路线,야마토지선,#009933,2,Q,,,,#009933,,,,REVERSED_SQUARE_WEST,,,,0,11607,2531.18147 -11608,4,JR神戸線,ジェーアールコウベセン,山陽本線,Kobe Line,Kobe Line,神户线,고베선,#0072BC,2,A,,,,#0072BC,,,,REVERSED_SQUARE_WEST,,,,0,11608,2474.54823 -11609,4,山陽本線,サンヨウホンセン,山陽本線,San’yo Main Line,San’yo Main Line,山阳本线,산요 본선,#0072BC,2,A,S,,,#0072BC,#C1D612,,,REVERSED_SQUARE_WEST,REVERSED_SQUARE_WEST,,,0,11609,4947.12435 -11610,4,山陽本線,サンヨウホンセン,山陽本線,San’yo Main Line,San’yo Main Line,山阳本线,산요 본선,#0072BC,2,W,X,,,#F5A200,#00A0E9,,,REVERSED_SQUARE_WEST,REVERSED_SQUARE_WEST,,,0,11610,5100.06466 -11611,4,山陽本線,サンヨウホンセン,山陽本線,San’yo Main Line,San’yo Main Line,山阳本线,산요 본선,#0072BC,2,G,R,,,#60AD3B,#CB342E,,,REVERSED_SQUARE_WEST,REVERSED_SQUARE_WEST,,,0,11611,3949.01628 -11612,4,山陽本線,サンヨウホンセン,山陽本線,San'yo Main Line,San'yo Main Line,山阳本线,산요 본선,#0072BC,2,JA,,,,#E24148,,,,HALF_SQUARE,,,,0,11612,5412.42792 -11613,4,山陽本線,サンヨウホンセン,山陽本線,San’yo Main Line,San’yo Main Line,山阳本线,산요 본선,#0072BC,2,,,,,,,,,,,,,0,11613,2142.977 -11614,4,嵯峨野線,サガノセン,山陰本線,Sagano Line,Sagano Line,嵯峨野线,사가노선,#9370DB,2,E,,,,#9370DB,,,,REVERSED_SQUARE_WEST,,,,0,11614,2226.44077 -11615,4,山陰本線,サンインホンセン,山陰本線,San'in Main Line,San'in Main Line,山阴本线,산인 본선,#669933,2,E,,,,#669933,,,,REVERSED_SQUARE_WEST,,,,0,11615,4894.43373 -11616,4,山陰本線,サンインホンセン,山陰本線,San’in Main Line,San’in Main Line,山阴本线,산인 본선,#669933,2,A,,,,#669933,,,,REVERSED_SQUARE_WEST,,,,0,11616,4389.45253 -11617,4,学研都市線,ガッケントシセン,片町線,Gakkentoshi Line,Gakkentoshi Line,学研都市线,갓켄토시선,#9ACD32,2,H,,,,#FF1493,,,,REVERSED_SQUARE_WEST,,,,0,11617,1900.74518 -11618,4,奈良線,ナラセン,奈良線,Nara Line,Nara Line,奈良线,나라선,#A52A2A,2,D,,,,#A52A2A,,,,REVERSED_SQUARE_WEST,,,,0,11618,2052.89697 -11622,4,舞鶴線,マイヅルセン,舞鶴線,Maizuru Line,Maizuru Line,舞鹤线,마이즈루선,#7BA1C5,2,L,,,,#7BA1C5,,,,REVERSED_SQUARE_WEST,,,,0,11622,5287.9216 -11623,4,大阪環状線,オオサカカンジョウセン,大阪環状線,Osaka Loop Line,Osaka Loop Line,大阪环状线,오사카 순환선,#FF0000,2,O,,,,#FF0000,,,,REVERSED_SQUARE_WEST,,,,0,11623,1128.80239 -11624,4,JRゆめ咲線,ジェーアールユメサキセン,桜島線,Yumesaki Line,Yumesaki Line,梦咲线,유메사키선,#0A318E,2,P,,,,#0A318E,,,,REVERSED_SQUARE_WEST,,,,0,11624,1373.1323 -11625,4,JR東西線,ジェーアールトウザイセン,JR東西線,Tozai Line,Tozai Line,东西线,도자이선,#FF1493,2,H,,,,#FF1493,,,,REVERSED_SQUARE_WEST,,,,0,11625,1505.55763 -11626,4,阪和線,ハンワセン,阪和線,Hanwa Line,Hanwa Line,阪和线,한와선,#FF6600,2,R,,,,#FF9600,,,,REVERSED_SQUARE_WEST_DARK_TEXT,,,,0,11626,1787.64739 -11627,4,羽衣線,ハゴロモセン,阪和線,Hagoromo Line,Hagoromo Line,羽衣线,하고로모선,#FF6600,2,,,,,,,,,,,,,0,11627,1504.3773 -11628,4,関西空港線,カンサイクウコウセン,関西空港線,Kansai Airport Line,Kansai Airport Line,关西机场线,간사이 공항선,#0000FF,2,S,,,,#0000FF,,,,REVERSED_SQUARE_WEST,,,,0,11628,5508.17333 -11629,4,JR宝塚線,ジェーアールタカラヅカセン,福知山線,Takarazuka Line,Takarazuka Line,宝冢线,다카라즈카선,#FFCC00,2,G,A,,,#FFBA00,#0072BC,,,REVERSED_SQUARE_WEST_DARK_TEXT,REVERSED_SQUARE_WEST,,,0,11629,2976.25397 -11630,4,福知山線,フクチヤマセン,福知山線,Fukuchiyama Line,Fukuchiyama Line,福知山线,후쿠치야마선,#FFCC00,2,G,,,,#FFBA00,,,,REVERSED_SQUARE_WEST_DARK_TEXT,,,,0,11630,5310.44885 -11631,4,赤穂線,アコウセン,赤穂線,Ako Line,Ako Line,赤穗线,아코선,#F16369,2,N,A,,,#F16369,#0072BC,,,REVERSED_SQUARE_WEST,REVERSED_SQUARE_WEST,,,0,11631,3334.25758 -11632,4,加古川線,カコガワセン,加古川線,Kakogawa Line,Kakogawa Line,加古川线,가코가와선,#3CB371,2,I,,,,#3CB371,,,,REVERSED_SQUARE_WEST,,,,0,11632,2371.85478 -11633,4,姫新線,キシンセン,姫新線,Kishin Line,Kishin Line,姬新线,기신선,#FF4500,2,K,,,,#FF4500,,,,REVERSED_SQUARE_WEST,,,,0,11633,4101.68686 -11634,4,姫新線,キシンセン,姫新線,Kishin Line,Kishin Line,姬新线,기신선,#800080,2,K,,,,#800080,,,,REVERSED_SQUARE_WEST,,,,0,11634,4608.22042 -11635,4,播但線,バンタンセン,播但線,Bantan Line,Bantan Line,播但线,반탄선,#A52A2A,2,J,,,,#A52A2A,,,,REVERSED_SQUARE_WEST,,,,0,11635,3834.08915 -11636,4,和歌山線,ワカヤマセン,和歌山線,Wakayama Line,Wakayama Line,和歌山线,와카야마선,#192375,2,T,,,,#192375,,,,REVERSED_SQUARE_WEST,,,,0,11636,2467.63838 -11637,4,万葉まほろば線,マンヨウマホロバセン,桜井線,Manyo Mahoroba Line,Manyo Mahoroba Line,万叶Mahoroba线,사쿠라이선,#EC64AB,2,U,,,,#EC64AB,,,,REVERSED_SQUARE_WEST,,,,0,11637,2220.88784 -11639,4,きのくに線,キノクニセン,紀勢本線,Kinokuni Line,Kinokuni Line,纪国线,기노쿠니선,#FE8525,2,W,,,,#FE8525,,,,REVERSED_SQUARE_WEST,,,,0,11639,3666.53002 -11640,4,紀勢本線,キセイホンセン,紀勢本線,Kisei Main Line,Kisei Main Line,纪势本线,기세이 본선,#192375,2,,,,,,,,,,,,,0,11640,1595.33951 -11641,4,おおさか東線,オオサカヒガシセン,おおさか東線,Osaka Higashi Line,Osaka Higashi Line,大阪东线,오사카히가시선,#347293,2,F,,,,#347293,,,,REVERSED_SQUARE_WEST,,,,0,11641,1703.58445 -11701,4,山陰本線,サンインホンセン,山陰本線,San’in Main Line,San’in Main Line,山阴本线,산인 본선,#BAE541,2,,,,,,,,,,,,,0,11701,4298.59562 -11702,4,山陰本線,サンインホンセン,山陰本線,San’in Main Line,San’in Main Line,山阴本线,산인 본선,#BAE541,2,,,,,,,,,,,,,0,11702,4464.27402 -11703,4,伯備線,ハクビセン,伯備線,Hakubi Line,Hakubi Line,伯备线,하쿠비선,#FF4500,2,,,,,,,,,,,,,0,11703,5078.99477 -11704,4,因美線,インビセン,因美線,Inbi Line,Inbi Line,因美线,인비선,#AA731C,2,B,,,,#AA731C,,,,REVERSED_SQUARE_WEST,,,,0,11704,4056.91816 -11705,4,境線,サカイセン,境線,Sakai Line,Sakai Line,境线,사카이선,#00FFFF,2,C,,,,#00FFFF,,,,REVERSED_SQUARE_WEST,,,,0,11705,1210.29083 -11706,4,木次線,キスキセン,木次線,Kisuki Line,Kisuki Line,木次线,기스키선,#339966,2,E,,,,#339966,,,,REVERSED_SQUARE_WEST,,,,0,11706,4446.78062 -11707,4,三江線,サンコウセン,三江線,Sanko Line,Sanko Line,三江线,산코선,#C9090B,2,,,,,,,,,,,,,2,11707,3143.03522 -11708,4,山口線,ヤマグチセン,山口線,Yamaguchi Line,Yamaguchi Line,山口线,야마구치선,#FF6600,2,,,,,,,,,,,,,0,11708,3423.51014 -11709,4,宇野線,ウノセン,宇野線,Uno Line,Uno Line,宇野线,우노선,#3333CC,2,M,,,,#63D2D3,,,,REVERSED_SQUARE_WEST_DARK_TEXT,,,,0,11709,2310.05384 -11710,4,瀬戸大橋線,セトオオハシセン,本四備讃線,Honshi-Bisan Line,Honshi-Bisan Line,本四备赞线,혼시비산선,#0072BC,2,M,Y,,,#0072BC,#FBAF18,,,REVERSED_SQUARE_WEST,ROUND,,,0,11710,6198.50829 -11713,4,吉備線,キビセン,吉備線,Kibi Line,Kibi Line,吉备线,기비선,#FFA500,2,,,,,,,,,,,,,0,11713,2236.12757 -11714,4,芸備線,ゲイビセン,芸備線,Geibi Line,Geibi Line,艺备线,게이비선,#00CED1,2,P,,,,#00CED1,,,,REVERSED_SQUARE_WEST,,,,0,11714,3716.98172 -11715,4,津山線,ツヤマセン,津山線,Tsuyama Line,Tsuyama Line,津山线,쓰야마선,#FF69B4,2,T,,,,#FF69B4,,,,REVERSED_SQUARE_WEST,,,,0,11715,3604.41501 -11716,4,呉線,クレセン,呉線,Kure Line,Kure Line,吴线,구레선,#33C033,2,Y,,,,#33C033,,,,REVERSED_SQUARE_WEST,,,,0,11716,3129.18662 -11717,4,可部線,カベセン,可部線,Kabe Line,Kabe Line,可部线,가베선,#A020F0,2,B,,,,#A020F0,,,,REVERSED_SQUARE_WEST,,,,0,11717,1201.80796 -11720,4,福塩線,フクエンセン,福塩線,Fukuen Line,Fukuen Line,福盐线,후쿠엔선,#FF1493,2,Z,,,,#FF1493,,,,REVERSED_SQUARE_WEST,,,,0,11720,3006.43876 -11721,4,宇部線,ウベセン,宇部線,Ube Line,Ube Line,宇部线,우베선,#990066,2,,,,,,,,,,,,,0,11721,1923.31896 -11722,4,美祢線,ミネセン,美祢線,Mine Line,Mine Line,美祢线,미네선,#CC0066,2,,,,,,,,,,,,,0,11722,3957.07753 -11723,4,小野田線,オノダセン,小野田線,Onoda Line,Onoda Line,小野田线,오노다선,#666699,2,,,,,,,,,,,,,0,11723,1992.42011 -11724,4,岩徳線,ガントクセン,岩徳線,Gantoku Line,Gantoku Line,岩德线,간토쿠선,#008056,2,,,,,,,,,,,,,0,11724,3423.3195 -11801,5,土讃線,ドサンセン,土讃線,Dosan Line,Dosan Line,土赞线,도산선,#E25885,2,D,K,,,#DC4586,#DC4586,,,ROUND,ROUND,,,0,11801,3235.86542 -11802,5,高徳線,コウトクセン,高徳線,Kotoku Line,Kotoku Line,高德线,고토쿠선,#99CC00,2,T,,,,#87CA3B,,,,ROUND,,,,0,11802,2606.83126 -11803,5,よしの川ブルーライン,ヨシノガワブルーライン,徳島線,Tokushima Line,Tokushima Line,德岛线,도쿠시마선,#008080,2,B,,,,#366481,,,,ROUND,,,,0,11803,2904.33283 -11804,5,牟岐線,ムギセン,牟岐線,Mugi Line,Mugi Line,牟岐线,무기선,#00FFFF,2,M,,,,#2EBDB1,,,,ROUND,,,,0,11804,2708.87394 -11805,5,鳴門線,ナルトセン,鳴門線,Naruto Line,Naruto Line,鸣门线,나루토선,#993366,2,N,,,,#881F61,,,,ROUND,,,,0,11805,1347.57908 -11806,5,予讃線,ヨサンセン,予讃線,Yosan Line,Yosan Line,予赞线,요산선,#FF9900,2,Y,,,,#F5AC13,,,,ROUND,,,,0,11806,3418.15462 -11807,5,予讃・内子線,ヨサン・ウチコセン,予讃・内子線,Yosan/Uchiko Line,Yosan/Uchiko Line,予赞・内子线,요산선・우치코선,#FF9900,2,U,S,,,#F5AC13,#9AA7D7,,,ROUND,ROUND,,,0,11807,3962.36461 -11808,5,しまんとグリーンライン,シマントグリーンライン,予土線,Yodo Line,Yodo Line,予土线,요도선,#339966,2,G,,,,#339966,,,,ROUND,,,,0,11808,3815.26923 -11901,4,博多南線,ハカタミナミセン,博多南線,Hakata-Minami Line,Hakata-Minami Line,博多南线,하카타미나미선,#22B04F,2,,,,,,,,,,,,,0,11901,9376.75481 -11902,6,鹿児島本線,カゴシマホンセン,鹿児島本線,Kagoshima Main Line,Kagoshima Main Line,鹿儿岛本线,가고시마 본선,#E24148,2,JA,,,,#E24148,,,,HALF_SQUARE,,,,0,11902,2788.52108 -11903,6,鹿児島本線,カゴシマホンセン,鹿児島本線,Kagoshima Main Line,Kagoshima Main Line,鹿儿岛本线,가고시마 본선,#E24148,2,JB,,,,#E24148,,,,HALF_SQUARE,,,,0,11903,3037.07214 -11904,6,鹿児島本線,カゴシマホンセン,鹿児島本線,Kagoshima Main Line,Kagoshima Main Line,鹿儿岛本线,가고시마 본선,#E24148,2,,,,,,,,,,,,,0,11904,3693.15389 -11905,6,長崎本線,ナガサキホンセン,長崎本線,Nagasaki Main Line,Nagasaki Main Line,长崎本线,나가사키 본선,#E6B040,2,JH,,,,#E6B040,,,,HALF_SQUARE_DARK_TEXT,,,,0,11905,3539.30824 -11906,6,日豊本線,ニッポウホンセン,日豊本線,Nippo Main Line,Nippo Main Line,日丰本线,닛포 본선,#4ABACD,2,JF,,,,#4ABACD,,,,HALF_SQUARE,,,,0,11906,3769.80768 -11907,6,日豊本線,ニッポウホンセン,日豊本線,Nippo Main Line,Nippo Main Line,日丰本线,닛포 본선,#4ABACD,2,,,,,,,,,,,,,0,11907,4783.87629 -11908,6,福北ゆたか線,フクホクユタカセン,篠栗線,Fukuhoku Yutaka Line,Fukuhoku Yutaka Line,福北丰线,후쿠호쿠유타카선,#FAAF18,2,JC,,,,#FAAF18,,,,HALF_SQUARE_DARK_TEXT,,,,0,11908,2397.33676 -11909,6,筑肥線,チクヒセン,筑肥線,Chikuhi Line,Chikuhi Line,筑肥线,지쿠히선,#8F3E97,2,JK,,,,#8F3E97,,,,HALF_SQUARE,,,,0,11909,2195.8741 -11910,6,若松線,ワカマツセン,筑豊本線,Wakamatsu Line,Wakamatsu Line,若松线,와카마쓰선,#0095D9,2,JE,,,,#0095D9,,,,HALF_SQUARE,,,,0,11910,2099.50323 -11911,6,福北ゆたか線,フクホクユタカセン,筑豊本線,Fukuhoku Yutaka Line,Fukuhoku Yutaka Line,福北丰线,후쿠호쿠유타카선,#FAAF18,2,JC,,,,#FAAF18,,,,HALF_SQUARE_DARK_TEXT,,,,0,11911,2280.68241 -11912,6,原田線,ハルダセン,筑豊本線,Haruda Line,Haruda Line,原田线,하루다선,#36B558,2,JG,,,,#36B558,,,,HALF_SQUARE,,,,0,11912,5133.01193 -11913,6,ゆふ高原線,ユフコウゲンセン,久大本線,Kyūdai Main Line,Kyūdai Main Line,久大本线,규다이 본선,#36B558,2,,,,,,,,,,,,,0,11913,3843.50595 -11914,6,日田彦山線,ヒタヒコサンセン,日田彦山線,Hitahikosan Line,Hitahikosan Line,日田彦山线,히타히코산선,#B96F30,2,JI,,,,#B96F30,,,,HALF_SQUARE,,,,0,11914,2853.35332 -11915,6,後藤寺線,ゴトウジセン,後藤寺線,Gotoji Line,Gotoji Line,后藤寺线,고토지선,#8F3E97,2,JJ,,,,#8F3E97,,,,HALF_SQUARE,,,,0,11915,2547.05013 -11916,6,海の中道線,ウミノナカミチセン,香椎線,Kashii Line,Kashii Line,香椎线,가시선,#3A268F,2,,,,,,,,,,,,,0,11916,2435.9513 -11917,6,香椎線,カシイセン,香椎線,Kashii Line,Kashii Line,香椎线,가시선,#0095D9,2,JD,,,,#0095D9,,,,HALF_SQUARE,,,,0,11917,1214.8027 -11918,6,佐世保線,サセボセン,佐世保線,Sasebo Line,Sasebo Line,佐世保线,사세보선,#36B558,2,,,,,,,,,,,,,0,11918,3720.00573 -11920,6,筑肥線,チクヒセン,筑肥線,Chikuhi Line,Chikuhi Line,筑肥线,지쿠히선,#8F3E97,2,,,,,,,,,,,,,0,11920,2637.30264 -11921,6,唐津線,カラツセン,唐津線,Karatsu Line,Karatsu Line,唐津线,가라쓰선,#0095D9,2,,,,,,,,,,,,,0,11921,3201.2036 -11922,6,大村線,オオムラセン,大村線,Omura Line,Omura Line,大村线,오무라선,#0095D9,2,,,,,,,,,,,,,0,11922,3363.01247 -11923,6,豊肥本線,ホウヒホンセン,豊肥本線,Hohi Main Line,Hohi Main Line,丰肥本线,호히 본선,#B96F30,2,,,,,,,,,,,,,0,11923,4060.20788 -11924,6,三角線(あまくさみすみ線),アマクサミスミセン,三角線,Misumi Line,Misumi Line,三角线,미스미선,#0095D9,2,,,,,,,,,,,,,0,11924,3270.08844 -11925,6,えびの高原線,エビノコウゲンセン,肥薩線,Hisatsu Line,Hisatsu Line,肥萨线,히사쓰선,#8F3E97,2,,,,,,,,,,,,,0,11925,4713.83221 -11926,6,肥薩線,ヒサツセン,肥薩線,Hisatsu Line,Hisatsu Line,肥萨线,히사쓰선,#8F3E97,2,,,,,,,,,,,,,0,11926,4078.25274 -11927,6,宮崎空港線,ミヤザキクウコウセン,宮崎空港線,Miyazaki Airport Line,Miyazaki Airport Line,宫崎机场线,미야자키쿠코선,#36B558,2,,,,,,,,,,,,,0,11927,1938.07464 -11928,6,日南線,ニチナンセン,日南線,Nichinan Line,Nichinan Line,日南线,니치난선,#FAAF18,2,,,,,,,,,,,,,0,11928,3348.76242 -11929,6,えびの高原線,エビノコウゲンセン,吉都線,Kitto Line,Kitto Line,吉都线,깃토선,#36B558,2,,,,,,,,,,,,,0,11929,3795.96536 -11930,6,指宿枕崎線,イブスキマクラザキセン,指宿枕崎線,Ibusuki Makurazaki Line,Ibusuki Makurazaki Line,指宿枕崎线,이부스키마쿠라자키선,#FAAF18,2,,,,,,,,,,,,,0,11930,2445.33683 -21001,11,東武東上線,トウブトウジョウセン,東武東上線,Tobu Tojo Line,Tobu Tojo Line,东武东上线,도부 도조선,#004098,2,TJ,,,,#014099,,,,SQUARE,,,,0,21001,1943.6609 -21002,11,東武伊勢崎線,トウブイセサキセン,東武伊勢崎線,Tobu Isesaki Line,Tobu Isesaki Line,东武伊势崎线,도부 이세사키선,#ED1A3D,2,TI,TS,,,#B50033,#0067C0,,,SQUARE,SQUARE,,,0,21002,2370.8542 -21003,11,東武日光線,トウブニッコウセン,東武日光線,Tobu Nikko Line,Tobu Nikko Line,东武日光线,도부 닛코선,#FFA500,2,TN,TS,,,#F08200,#0067C0,,,SQUARE,SQUARE,,,0,21003,3736.18408 -21004,11,東武アーバンパークライン,トウブアーバンパークライン,東武野田線,Tobu Urban Park Line,Tobu Urban Park Line,东武都市公园线,도부 어반 파크 라인,#00BFFF,2,TD,,,,#00A1E9,,,,SQUARE,,,,0,21004,1817.1716 -21005,11,東武亀戸線,トウブカメイドセン,東武亀戸線,Tobu Kameido Line,Tobu Kameido Line,东武龟户线,도부 가메이도선,#004098,2,TS,,,,#0067C0,,,,SQUARE,,,,0,21005,854.1278 -21006,11,東武大師線,トウブダイシセン,東武大師線,Tobu Daishi Line,Tobu Daishi Line,东武大师线,도부 다이시선,#004098,2,TS,,,,#0067C0,,,,SQUARE,,,,0,21006,808.59735 -21007,11,東武越生線,トウブオゴセセン,東武越生線,Tobu Ogose Line,Tobu Ogose Line,东武越生线,도부 오고세선,#004098,2,TJ,,,,#014099,,,,SQUARE,,,,0,21007,1542.24657 -21008,11,東武宇都宮線,トウブウツノミヤセン,東武宇都宮線,Tobu Utsunomiya Line,Tobu Utsunomiya Line,东武宇都宫线,도부 우쓰노미야선,#FFA500,2,TN,,,,#F08200,,,,SQUARE,,,,0,21008,2694.53691 -21009,11,東武鬼怒川線,トウブキヌガワセン,東武鬼怒川線,Tobu Kinugawa Line,Tobu Kinugawa Line,东武鬼怒川线,도부 기누가와선,#FFA500,2,TN,,,,#F08200,,,,SQUARE,,,,0,21009,1964.12 -21010,11,東武佐野線,トウブサノセン,東武佐野線,Tobu Sano Line,Tobu Sano Line,东武佐野线,도부 사노선,#ED1A3D,2,TI,,,,#B50033,,,,SQUARE,,,,0,21010,2389.76109 -21011,11,東武桐生線,トウブキリュウセン,東武桐生線,Tobu Kiryu Line,Tobu Kiryu Line,东武桐生线,도부 기류선,#ED1A3D,2,TI,,,,#B50033,,,,SQUARE,,,,0,21011,2835.1253 -21012,11,東武小泉線,トウブコイズミセン,東武小泉線,Tobu Koizumi Line,Tobu Koizumi Line,东武小泉线,도부 고이즈미선,#ED1A3D,2,TI,,,,#B50033,,,,SQUARE,,,,0,21012,2725.22052 -22001,12,西武池袋線,セイブイケブクロセン,西武池袋線,Seibu Ikebukuro Line,Seibu Ikebukuro Line,西武池袋线,세이부 이케부쿠로선,#F17900,2,SI,,,,#F17900,,,,HALF_SQUARE_DARK_TEXT,,,,0,22001,2041.41825 -22002,12,西武秩父線,セイブチチブセン,西武秩父線,Seibu Chichibu Line,Seibu Chichibu Line,西武秩父线,세이부 지치부선,#F17900,2,SI,,,,#F17900,,,,HALF_SQUARE_DARK_TEXT,,,,0,22002,3156.95666 -22003,12,西武有楽町線,セイブユウラクチョウセン,西武有楽町線,Seibu Yurakucho Line,Seibu Yurakucho Line,西武有乐町线,세이부 유라쿠초선,#F17901,2,SI,,,,#F17900,,,,HALF_SQUARE_DARK_TEXT,,,,0,22003,1192.33408 -22004,12,西武豊島線,セイブトシマセン,西武豊島線,Seibu Toshima Line,Seibu Toshima Line,西武丰岛线,세이부 도시마선,#F17900,2,SI,,,,#F17900,,,,HALF_SQUARE_DARK_TEXT,,,,0,22004,903.87278 -22005,12,西武狭山線,セイブサヤマセン,西武狭山線,Seibu Sayama Line,Seibu Sayama Line,西武狭山线,세이부 사야마선,#F17900,2,SI,,,,#F17900,,,,HALF_SQUARE_DARK_TEXT,,,,0,22005,2026.49521 -22006,12,レオライナー,レオライナー,西武山口線,Seibu Yamaguchi Line,Seibu Yamaguchi Line,西武山口线,세이부 야마구치선,#FF69B4,5,SY,,,,#FF3333,,,,HALF_SQUARE_DARK_TEXT,,,,0,22006,1384.74496 -22007,12,西武新宿線,セイブシンジュクセン,西武新宿線,Seibu Shinjuku Line,Seibu Shinjuku Line,西武新宿线,세이부 신주쿠선,#00A6C0,2,SS,,,,#00A6C0,,,,HALF_SQUARE_DARK_TEXT,,,,0,22007,1681.79404 -22008,12,西武拝島線,セイブハイジマセン,西武拝島線,Seibu Haijima Line,Seibu Haijima Line,西武拜岛线,세이부 하이지마선,#00A6C0,2,SS,,,,#00A6C0,,,,HALF_SQUARE_DARK_TEXT,,,,0,22008,2011.14468 -22009,12,西武西武園線,セイブセイブエンセン,西武西武園線,Seibu Seibuen Line,Seibu Seibuen Line,西武西武园线,세이부 세이부엔선,#00A6C0,2,SK,,,,#00A6C0,,,,HALF_SQUARE_DARK_TEXT,,,,0,22009,2432.68591 -22010,12,西武国分寺線,セイブコクブンジセン,西武国分寺線,Seibu Kokubunji Line,Seibu Kokubunji Line,西武国分寺线,세이부 고쿠분지선,#00BB00,2,SK,,,,#00BB00,,,,HALF_SQUARE_DARK_TEXT,,,,0,22010,1911.94322 -22011,12,西武多摩湖線,セイブタマコセン,西武多摩湖線,Seibu Tamako Line,Seibu Tamako Line,西武多摩湖线,세이부 다마코선,#FFA500,2,ST,,,,#FFA500,,,,HALF_SQUARE_DARK_TEXT,,,,0,22011,1497.83003 -22012,12,西武多摩川線,セイブタマガワセン,西武多摩川線,Seibu Tamagawa Line,Seibu Tamagawa Line,西武多摩川线,세이부 다마가와선,#F17900,2,SW,,,,#F17900,,,,HALF_SQUARE_DARK_TEXT,,,,0,22012,1556.25362 -23001,13,京成本線,ケイセイホンセン,京成本線,Keisei Main Line,Keisei Main Line,京成本线,게이세이 본선,#005AAA,2,KS,,,,#005AAA,,,,KEISEI,,,,0,23001,1640.0498 -23002,13,京成押上線,ケイセイオシアゲセン,京成押上線,Keisei Oshiage Line,Keisei Oshiage Line,京成押上线,게이세이 오시아게선,#005AAA,2,KS,A,,,#005AAA,#E85298,,,KEISEI,ROUND,,,0,23002,1120.25622 -23003,13,京成金町線,ケイセイカナマチセン,京成金町線,Keisei Kanamachi Line,Keisei Kanamachi Line,京成金町线,게이세이 가나마치선,#005AAA,2,KS,,,,#005AAA,,,,KEISEI,,,,0,23003,1261.42049 -23004,13,京成千葉線,ケイセイチバセン,京成千葉線,Keisei Chiba Line,Keisei Chiba Line,京成千叶线,게이세이 지바선,#005AAA,2,KS,,,,#005AAA,,,,KEISEI,,,,0,23004,1394.3923 -23005,13,京成千原線,ケイセイチハラセン,京成千原線,Keisei Chihara Line,Keisei Chihara Line,京成千原线,게이세이 지하라선,#005AAA,2,KS,,,,#005AAA,,,,KEISEI,,,,0,23005,2123.10699 -23006,13,成田スカイアクセス線,ナリタスカイアクセスセン,京成成田空港線,Keisei Narita Airport Line,Keisei Narita Airport Line,京成成田机场线,게이세이 나리타 공항선,#FF6600,2,KS,HS,,,#005AAA,#3333FF,,,KEISEI,KEISEI,,,0,23006,7555.64232 -24001,14,京王線,ケイオウセン,京王線,Keio Line,Keio Line,京王线,게이오선,#CA0073,2,KO,,,,#CA0073,,,,KEIO,,,,0,24001,1199.29758 -24002,14,京王相模原線,ケイオウサガミハラセン,京王相模原線,Keio Sagamihara Line,Keio Sagamihara Line,京王相模原线,게이오 사가미하라선,#CA0073,2,KO,,,,#CA0073,,,,KEIO,,,,0,24002,1995.06796 -24003,14,京王高尾線,ケイオウタカオセン,京王高尾線,Keio Takao Line,Keio Takao Line,京王高尾线,게이오 다카오선,#CA0073,2,KO,,,,#CA0073,,,,KEIO,,,,0,24003,1403.25349 -24004,14,京王競馬場線,ケイオウケイバジョウセン,京王競馬場線,Keio Keibajo Line,Keio Keibajo Line,京王竞马场线,게이오 게이바조선,#CA0073,2,KO,,,,#CA0073,,,,KEIO,,,,0,24004,926.37779 -24005,14,京王動物園線,ケイオウドウブツエンセン,京王動物園線,Keio Dobutsuen Line,Keio Dobutsuen Line,京王动物园线,게이오 도부쓰엔선,#CA0073,2,KO,,,,#CA0073,,,,KEIO,,,,0,24005,1947.7838 -24006,14,京王井の頭線,ケイオウイノガシラセン,京王井の頭線,Keio Inokashira Line,Keio Inokashira Line,京王井之头线,게이오 이노카시라선,#000088,2,IN,,,,#000088,,,,KEIO,,,,0,24006,802.89748 -24007,14,京王新線,ケイオウシンセン,京王新線,Keio New Line,Keio New Line,京王新线,게이오 신선,#CA0073,2,KO,,,,#CA0073,,,,KEIO,,,,0,24007,1104.45578 -25001,15,小田急線,オダキュウセン,小田急小田原線,Odakyu Line,Odakyu Line,小田急线,오다큐선,#2F79BC,2,OH,,,,#2F79BC,,,,ODAKYU,,,,0,25001,1771.38549 -25002,15,小田急江ノ島線,オダキュウエノシマセン,小田急江ノ島線,Odakyu Enoshima Line,Odakyu Enoshima Line,小田急江之岛线,오다큐 에노시마선,#2D8BD0,2,OE,OH,,,#2F79BC,#2F79BC,,,ODAKYU,ODAKYU,,,0,25002,1685.25136 -25003,15,小田急多摩線,オダキュウタマセン,小田急多摩線,Odakyu Tama Line,Odakyu Tama Line,小田急多摩线,오다큐 다마선,#2D8BD0,2,OT,OH,,,#2F79BC,#2F79BC,,,ODAKYU,ODAKYU,,,0,25003,1494.74821 -26001,16,東急東横線,トウキュウトウヨコセン,東急東横線,Tokyu Toyoko Line,Tokyu Toyoko Line,东急东横线,도큐 도요코선,#EE0011,2,TY,,,,#EE0011,,,,REVERSED_SQUARE,,,,0,26001,1189.02738 -26002,16,東急目黒線,トウキュウメグロセン,東急目黒線,Tokyu Meguro Line,Tokyu Meguro Line,东急目黑线,도큐 메구로선,#2C94B6,2,MG,,,,#2C94B6,,,,REVERSED_SQUARE,,,,0,26002,985.08403 -26003,16,東急田園都市線,トウキュウデンエントシセン,東急田園都市線,Tokyu Den-en-toshi Line,Tokyu Den-en-toshi Line,东急田园都市线,도큐 덴엔토시선,#018D54,2,DT,,,,#018D54,,,,REVERSED_SQUARE,,,,0,26003,1191.38645 -26004,16,東急大井町線,トウキュウオオイマチセン,東急大井町線,Tokyu Oimachi Line,Tokyu Oimachi Line,东急大井町线,도큐 오이마치선,#FD9A3D,2,OM,,,,#FD9A3D,,,,REVERSED_SQUARE,,,,0,26004,722.37423 -26005,16,東急池上線,トウキュウイケガミセン,東急池上線,Tokyu Ikegami Line,Tokyu Ikegami Line,东急池上线,도큐 이케가미선,#DE65B0,2,IK,,,,#DE65B0,,,,REVERSED_SQUARE,,,,0,26005,761.78481 -26006,16,東急多摩川線,トウキュウタマガワセン,東急多摩川線,Tokyu Tamagawa Line,Tokyu Tamagawa Line,东急多摩川线,도큐 다마가와선,#A3016E,2,TM,,,,#A3016E,,,,REVERSED_SQUARE,,,,0,26006,919.05782 -26007,16,東急世田谷線,トウキュウセタガヤセン,東急世田谷線,Tokyu Setagaya Line,Tokyu Setagaya Line,东急世田谷线,도큐 세타가야선,#FCC70D,4,SG,,,,#FCC70D,,,,REVERSED_SQUARE_DARK_TEXT,,,,0,26007,679.48258 -26008,16,東急こどもの国線,トウキュウコドモノクニセン,東急こどもの国線,Tokyu Kodomonokuni Line,Tokyu Kodomonokuni Line,东急子供之国线,도큐 고도모노쿠니선,#0068B7,2,KD,,,,#0068B7,,,,REVERSED_SQUARE,,,,0,26008,1536.1571 -26009,16,東急新横浜線,トウキュウシンヨコハマセン,東急新横浜線,Tokyu Shin-yokohama Line,Tokyu Shin-yokohama Line,东急新横滨线,도큐 신요코하마선,#890D84,2,SH,,,,#890D84,,,,REVERSED_SQUARE,,,,0,26009,2873.29633 -27001,17,京急本線,ケイキュウホンセン,京急本線,Keikyu Main Line,Keikyu Main Line,京急本线,게이큐 본선,#00CCFF,2,KK,A,,,#00CCFF,#EC6E65,,,KEIKYU,ROUND,,,0,27001,1137.89949 -27002,17,京急空港線,ケイキュウクウコウセン,京急空港線,Keikyu Airport Line,Keikyu Airport Line,京急机场线,게이큐 공항선,#00CCFF,2,KK,,,,#00CCFF,,,,KEIKYU,,,,0,27002,1041.9296 -27003,17,京急大師線,ケイキュウダイシセン,京急大師線,Keikyu Daishi Line,Keikyu Daishi Line,京急大师线,게이큐 다이시선,#00CCFF,2,KK,,,,#00CCFF,,,,KEIKYU,,,,0,27003,727.04466 -27004,17,京急逗子線,ケイキュウズシセン,京急逗子線,Keikyu Zushi Line,Keikyu Zushi Line,京急逗子线,게이큐 즈시선,#00CCFF,2,KK,,,,#00CCFF,,,,KEIKYU,,,,0,27004,1900.49399 -27005,17,京急久里浜線,ケイキュウクリハマセン,京急久里浜線,Keikyu Kurihama Line,Keikyu Kurihama Line,京急久里滨线,게이큐 구리하마선,#00CCFF,2,KK,,,,#00CCFF,,,,KEIKYU,,,,0,27005,1634.45156 -28001,18,東京メトロ銀座線,トウキョウメトロギンザセン,東京メトロ銀座線,Tokyo Metro Ginza Line,Tokyo Metro Ginza Line,银座线,긴자선,#F39700,3,G,,,,#F39700,,,,ROUND,,,,0,28001,780.46154 -28002,18,東京メトロ丸ノ内線,トウキョウメトロマルノウチセン,東京メトロ丸ノ内線,Tokyo Metro Marunouchi Line,Tokyo Metro Marunouchi Line,丸之内线,마루노우치선,#E60012,3,M,Mb,,,#E60012,#E60012,,,ROUND,ROUND,,,0,28002,1232.26083 -28003,18,東京メトロ日比谷線,トウキョウメトロヒビヤセン,東京メトロ日比谷線,Tokyo Metro Hibiya Line,Tokyo Metro Hibiya Line,日比谷线,히비야선,#9CAEB7,3,H,,,,#9CAEB7,,,,ROUND,,,,0,28003,927.06703 -28004,18,東京メトロ東西線,トウキョウメトロトウザイセン,東京メトロ東西線,Tokyo Metro Tozai Line,Tokyo Metro Tozai Line,东西线,도자이선,#00A7DB,3,T,,,,#00A7DB,,,,ROUND,,,,0,28004,1376.11236 -28005,18,東京メトロ千代田線,トウキョウメトロチヨダセン,東京メトロ千代田線,Tokyo Metro Chiyoda Line,Tokyo Metro Chiyoda Line,千代田线,지요다선,#009944,3,C,,,,#009944,,,,ROUND,,,,0,28005,1292.70369 -28006,18,東京メトロ有楽町線,トウキョウメトロユウラクチョウセン,東京メトロ有楽町線,Tokyo Metro Yurakucho Line,Tokyo Metro Yurakucho Line,有乐町线,유라쿠초선,#C1A470,3,Y,,,,#C1A470,,,,ROUND,,,,0,28006,1208.42847 -28008,18,東京メトロ半蔵門線,トウキョウメトロハンゾウモンセン,東京メトロ半蔵門線,Tokyo Metro Hanzomon Line,Tokyo Metro Hanzomon Line,半藏门线,한조몬선,#9B7CB6,3,Z,,,,#9B7CB6,,,,ROUND,,,,0,28008,1283.41956 -28009,18,東京メトロ南北線,トウキョウメトロナンボクセン,東京メトロ南北線,Tokyo Metro Namboku Line,Tokyo Metro Namboku Line,南北线,난보쿠선,#00ADA9,3,N,,,,#00ADA9,,,,ROUND,,,,0,28009,1144.78154 -28010,18,東京メトロ副都心線,トウキョウメトロフクトシンセン,東京メトロ副都心線,Tokyo Metro Fukutoshin Line,Tokyo Metro Fukutoshin Line,副都心线,후쿠토신선,#BB641D,3,F,,,,#BB641D,,,,ROUND,,,,0,28010,1327.77135 -29001,19,相鉄本線,ソウテツホンセン,相鉄本線,Sotetsu Main Line,Sotetsu Main Line,相铁本线,소테쓰 본선,#000080,2,SO,,,,#0967B4,,,,REVERSED_SQUARE,,,,0,29001,1417.12757 -29002,19,相鉄いずみ野線,ソウテツイズミノセン,相鉄いずみ野線,Sotetsu Izumino Line,Sotetsu Izumino Line,相铁泉野线,소테쓰 이즈미노선,#000080,2,SO,,,,#0967B4,,,,REVERSED_SQUARE,,,,0,29002,1555.09015 -29003,19,相鉄・JR直通線,ソウテツ・ジェイアールチョクツウセン,相鉄・JR直通線,Sotetsu-JR Link Line,Sotetsu-JR Link Line,相铁·JR直通线,소테츠·JR직통선,#000080,2,SO,JS,JA,,#0967B4,#E31F26,#00B48D,,REVERSED_SQUARE,SQUARE,SQUARE,,0,29003,3270.97376 -29004,19,相鉄新横浜線,ソウテツシンヨコハマセン,相鉄新横浜線,Sotetsu Shin-yokohama Line,Sotetsu Shin-yokohama Line,相铁新横滨线,소테츠 신요코하마선,#000080,2,SO,,,,#0967B4,,,,REVERSED_SQUARE,,,,0,29004,3065.75393 -30001,20,名鉄名古屋本線,メイテツナゴヤホンセン,名鉄名古屋本線,Nagoya Line,Nagoya Line,名古屋本线,나고야 본선,#D12027,2,NH,,,,#D12027,,,,HALF_SQUARE,,,,0,30001,1662.80435 -30002,20,名鉄豊川線,メイテツトヨカワセン,名鉄豊川線,Toyokawa Line,Toyokawa Line,丰川线,도요카와 선,#D12027,2,TK,NH,,,#D12027,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30002,1731.21241 -30003,20,名鉄西尾線,メイテツニシオセン,名鉄西尾線,Nishio Line,Nishio Line,西尾线,니시오 선,#654E9E,2,GN,NH,,,#654E9E,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30003,1864.89715 -30004,20,名鉄蒲郡線,メイテツガマゴオリセン,名鉄蒲郡線,Gamagori Line,Gamagori Line,蒲郡线,가마고리 선,#654E9E,2,GN,NH,,,#654E9E,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30004,1890.88623 -30005,20,名鉄三河線,メイテツミカワセン,名鉄三河線,Mikawa Line,Mikawa Line,三河线,미카와 선,#9EB03A,2,MY,NH,MU,,#9EB03A,#D12027,#654E9E,,HALF_SQUARE,HALF_SQUARE,HALF_SQUARE,,0,30005,1770.04093 -30006,20,名鉄豊田線,メイテツトヨタセン,名鉄豊田線,Toyota Line,Toyota Line,丰田线,도요타 선,#9EB03A,2,TT,MY,,,#9EB03A,#9EB03A,,,HALF_SQUARE,HALF_SQUARE,,,0,30006,2044.5201 -30007,20,名鉄常滑・空港線,メイテツトコナメクウコウセン,名鉄空港線,Airport Line,Airport Line,机场线,쿠코 선,#1065AB,2,TA,NH,,,#1065AB,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30007,2261.47887 -30008,20,名鉄常滑線,メイテツトコナメセン,名鉄常滑線,Tokoname Line,Tokoname Line,常滑线,도코나메 선,#1065AB,2,TA,NH,,,#1065AB,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30008,1381.83694 -30009,20,名鉄河和線,メイテツコウワセン,名鉄河和線,Kowa Line,Kowa Line,河和线,고와 선,#2A9DD8,2,KC,TA,,,#2A9DD8,#1065AB,,,HALF_SQUARE,HALF_SQUARE,,,0,30009,1495.95881 -30010,20,名鉄知多新線,メイテツチタシンセン,名鉄知多新線,Chita Line,Chita Line,知多新线,지타 신선,#2A9DD8,2,KC,TA,,,#2A9DD8,#1065AB,,,HALF_SQUARE,HALF_SQUARE,,,0,30010,2739.0839 -30011,20,名鉄築港線,メイテツチッコウセン,名鉄築港線,Chikko Line,Chikko Line,筑港线,짓코 선,#727171,2,CH,TA,,,#727171,#1065AB,,,HALF_SQUARE,HALF_SQUARE,,,0,30011,1313.02814 -30012,20,名鉄瀬戸線,メイテツセトセン,名鉄瀬戸線,Seto Line,Seto Line,濑户线,세토 선,#990099,2,ST,,,,#7C2982,,,,HALF_SQUARE,,,,0,30012,1050.07891 -30013,20,名鉄津島線,メイテツツシマセン,名鉄津島線,Tsushima Line,Tsushima Line,津岛线,쓰시마 선,#E85624,2,TB,NH,,,#E85624,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30013,1669.75524 -30014,20,名鉄尾西線,メイテツビサイセン,名鉄尾西線,Bisai Line,Bisai Line,尾西线,비사이 선,#E85624,2,TB,BS,NH,,#E85624,#E85624,#D12027,,HALF_SQUARE,HALF_SQUARE,HALF_SQUARE,,0,30014,1451.99735 -30015,20,名鉄犬山線,メイテツイヌヤマセン,名鉄犬山線,Inuyama Line,Inuyama Line,犬山线,이누야마 선,#018B44,2,IY,NH,,,#018B44,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30015,1777.76181 -30016,20,名鉄各務原線,メイテツカカミガハラセン,名鉄各務原線,Kakamigahara Line,Kakamigahara Line,各务原线,가카미가하라 선,#018B44,2,KG,IY,,,#018B44,#018B44,,,HALF_SQUARE,HALF_SQUARE,,,0,30016,1021.66184 -30017,20,名鉄広見線,メイテツヒロミセン,名鉄広見線,Hiromi Line,Hiromi Line,广见线,히로미 선,#018B44,2,HM,IY,,,#018B44,#018B44,,,HALF_SQUARE,HALF_SQUARE,,,0,30017,2136.41769 -30018,20,名鉄小牧線,メイテツコマキセン,名鉄小牧線,Komaki Line,Komaki Line,小牧线,고마키 선,#DA5290,2,KM,IY,,,#DA5290,#018B44,,,HALF_SQUARE,HALF_SQUARE,,,0,30018,1558.11789 -30019,20,犬山モノレール,イヌヤマモノレール,名鉄モンキーパークモノレール線,Inuyama Monorail,Inuyama Monorail,犬山单轨电车,이누야마 모노레일,#808080,5,,,,,,,,,,,,,2,30019,617.56367 -30020,20,名鉄竹鼻線,メイテツタケハナセン,名鉄竹鼻線,Takehana Line,Takehana Line,竹鼻线,다케하나 선,#D7A629,2,TH,NH,,,#D7A629,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30020,1248.15533 -30021,20,名鉄羽島線,メイテツハシマセン,名鉄羽島線,Hashima Line,Hashima Line,羽岛线,하시마 선,#D7A629,2,TH,NH,,,#D7A629,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30021,1280.75978 -31001,21,近鉄難波線,キンテツナンバセン,近鉄難波線,Kintetsu Namba Line,Kintetsu Namba Line,近铁难波线,긴테쓰 난바선,#008000,2,A,,,,#D21644,,,,KINTETSU,,,,0,31001,1058.17493 -31002,21,近鉄橿原線,キンテツカシハラセン,近鉄橿原線,Kintetsu Kashihara Line,Kintetsu Kashihara Line,近铁橿原线,긴테쓰 가시하라선,#DEA83F,2,B,,,,#FAB202,,,,KINTETSU,,,,0,31002,1477.6481 -31003,21,近鉄南大阪線,キンテツミナミオオサカセン,近鉄南大阪線,Kintetsu Minami-Osaka Line,Kintetsu Minami-Osaka Line,近铁南大阪线,긴테쓰 미나미오사카선,#FF1493,2,F,,,,#028E46,,,,KINTETSU,,,,0,31003,1440.61933 -31004,21,近鉄養老線,キンテツヨウロウセン,近鉄養老線,Kintetsu Yoro Line,Kintetsu Yoro Line,近铁养老线,긴테쓰 요로선,#228B22,2,,,,,,,,,,,,,2,31004,2398.89369 -31005,21,近鉄大阪線,キンテツオオサカセン,近鉄大阪線,Kintetsu Osaka Line,Kintetsu Osaka Line,近铁大阪线,긴테쓰 오사카선,#B33249,2,D,,,,#4694D1,,,,KINTETSU,,,,0,31005,2250.1387 -31006,21,近鉄伊賀線,キンテツイガセン,近鉄伊賀線,Kintetsu Iga Line,Kintetsu Iga Line,近铁伊贺线,긴테쓰 이가선,#808080,2,,,,,,,,,,,,,2,31006,1351.96836 -31007,21,近鉄吉野線,キンテツヨシノセン,近鉄吉野線,Kintetsu Yoshino Line,Kintetsu Yoshino Line,近铁吉野线,긴테쓰 요시노선,#339932,2,F,,,,#028E46,,,,KINTETSU,,,,0,31007,1630.97696 -31008,21,近鉄湯の山線,キンテツユノヤマセン,近鉄湯の山線,Kintetsu Yunoyama Line,Kintetsu Yunoyama Line,近铁汤之山线,긴테쓰 유노야마선,#339932,2,K,,,,#153F97,,,,KINTETSU,,,,0,31008,1656.83316 -31009,21,近鉄山田線,キンテツヤマダセン,近鉄山田線,Kintetsu Yamada Line,Kintetsu Yamada Line,近铁山田线,긴테쓰 야마다선,#003399,2,M,,,,#00B3C1,,,,KINTETSU,,,,0,31009,2153.37624 -31010,21,近鉄鳥羽線,キンテツトバセン,近鉄鳥羽線,Kintetsu Toba Line,Kintetsu Toba Line,近铁鸟羽线,긴테쓰 도바선,#339932,2,M,,,,#00B3C1,,,,KINTETSU,,,,0,31010,3248.65164 -31011,21,近鉄天理線,キンテツテンリセン,近鉄天理線,Kintetsu Tenri Line,Kintetsu Tenri Line,近铁天理线,긴테쓰 덴리선,#339932,2,H,,,,#FAB202,,,,KINTETSU,,,,0,31011,1463.19789 -31012,21,近鉄道明寺線,キンテツドウミョウジセン,近鉄道明寺線,Kintetsu Domyoji Line,Kintetsu Domyoji Line,近铁道明寺线,긴테쓰 도묘지선,#1B904A,2,N,,,,#028E46,,,,KINTETSU,,,,0,31012,1057.87702 -31013,247,内部線,ウツベセン,内部線,Utsube Line,Utsube Line,内部线,우쓰베선,#003399,2,,,,,,,,,,,,,0,31013,799.46359 -31014,247,八王子線,ハチオウジセン,八王子線,Hachioji Line,Hachioji Line,八王子线,하치오지선,#003399,2,,,,,,,,,,,,,0,31014,999.00665 -31015,21,近鉄志摩線,キンテツシマセン,近鉄志摩線,Kintetsu Shima Line,Kintetsu Shima Line,近铁志摩线,긴테쓰 시마선,#FF00FF,2,M,,,,#00B3C1,,,,KINTETSU,,,,0,31015,1557.69034 -31016,21,近鉄生駒線,キンテツイコマセン,近鉄生駒線,Kintetsu Ikoma Line,Kintetsu Ikoma Line,近铁生驹线,긴테쓰 이코마선,#F6160D,2,G,,,,#D21644,,,,KINTETSU,,,,0,31016,1081.18343 -31017,21,近鉄田原本線,キンテツタワラモトセン,近鉄田原本線,Kintetsu Tawaramoto Line,Kintetsu Tawaramoto Line,近铁田原本线,긴테쓰 다와라모토선,#003399,2,I,,,,#FAB202,,,,KINTETSU,,,,0,31017,1407.31079 -31018,21,近鉄御所線,キンテツゴセセン,近鉄御所線,Kintetsu Gose Line,Kintetsu Gose Line,近铁御所线,긴테쓰 고세선,#F6160D,2,P,,,,#028E46,,,,KINTETSU,,,,0,31018,1730.13383 -31019,21,近鉄鈴鹿線,キンテツスズカセン,近鉄鈴鹿線,Kintetsu Suzuka Line,Kintetsu Suzuka Line,近铁铃鹿线,긴테쓰 스즈카선,#FF9900,2,L,,,,#153F97,,,,KINTETSU,,,,0,31019,1991.74931 -31020,21,近鉄奈良線,キンテツナラセン,近鉄奈良線,Kintetsu Nara Line,Kintetsu Nara Line,近铁奈良线,긴테쓰 나라선,#B33249,2,A,,,,#D21644,,,,KINTETSU,,,,0,31020,2902.78939 -31021,21,近鉄信貴線,キンテツシギセン,近鉄信貴線,Kintetsu Shigi Line,Kintetsu Shigi Line,近铁信贵线,긴테쓰 시기선,#339932,2,J,,,,#4694D1,,,,KINTETSU,,,,0,31021,1364.86409 -31022,21,近鉄長野線,キンテツナガノセン,近鉄長野線,Kintetsu Nagano Line,Kintetsu Nagano Line,近铁长野线,긴테쓰 나가노선,#003399,2,O,,,,#028E46,,,,KINTETSU,,,,0,31022,1755.60208 -31023,21,近鉄けいはんな線,キンテツケイハンナセン,近鉄けいはんな線,Kintetsu Keihanna Line,Kintetsu Keihanna Line,近铁京阪奈线,긴테쓰 게이한나선,#019A66,2,C,,,,#32CD32,,,,KINTETSU,,,,0,31023,2657.72168 -31024,21,西信貴ケーブル,ニシシギケーブル,近鉄西信貴鋼索線,Nishishigi Cable,Nishishigi Cable,西信贵缆车,니시시기 케이블,#DDDDDD,0,Z,,,,#DD9966,,,,KINTETSU,,,,0,31024,1468.4481 -31025,21,近鉄京都線,キンテツキョウトセン,近鉄京都線,Kintestu Kyoto Line,Kintestu Kyoto Line,近铁京都线,긴테쓰 교토선,#DEA83F,2,B,,,,#FAB202,,,,KINTETSU,,,,0,31025,1414.08952 -31026,21,生駒ケーブル,イコマケーブル,近鉄生駒鋼索線,Ikoma Cable,Ikoma Cable,生驹缆车,이코마 케이블,#AA8861,0,Y,,,,#DD9966,,,,KINTETSU,,,,0,31026,586.83434 -31027,21,近鉄名古屋線,キンテツナゴヤセン,近鉄名古屋線,Kintetsu Nagoya Line,Kintetsu Nagoya Line,近铁名古屋线,긴테쓰 나고야선,#5E34F8,2,E,,,,#153F97,,,,KINTETSU,,,,0,31027,1808.75107 -32001,22,南海本線,ナンカイホンセン,南海本線,Nankai Main Line,Nankai Main Line,南海本线,난카이 본선,#3366CC,2,NK,,,,#000000,,,,NANKAI,,,,0,32001,1583.85625 -32002,22,南海空港線,ナンカイクウコウセン,南海空港線,Nankai Airport Line,Nankai Airport Line,南海机场线,난카이 공항선,#996699,2,NK,,,,#000000,,,,NANKAI,,,,0,32002,4277.22275 -32003,22,南海和歌山港線,ナンカイワカヤマコウセン,南海和歌山港線,Nankai Wakayamako Line,Nankai Wakayamako Line,南海和歌山港线,난카이 와카야마코선,#3366CC,2,NK,,,,#000000,,,,NANKAI,,,,0,32003,2854.7759 -32004,22,南海高師浜線,ナンカイタカシノハマセン,南海高師浜線,Nankai Takashinohama Line,Nankai Takashinohama Line,南海高师浜线,난카이 다카시노하마선,#3366CC,2,NK,,,,#000000,,,,NANKAI,,,,0,32004,713.94106 -32005,22,南海加太線,ナンカイカダセン,南海加太線,Nankai Kada Line,Nankai Kada Line,南海加太线,난카이 가다선,#3366CC,2,NK,,,,#000000,,,,NANKAI,,,,0,32005,1468.18212 -32006,22,南海多奈川線,ナンカイタナガワセン,南海多奈川線,Nankai Tanagawa Line,Nankai Tanagawa Line,南海多奈川线,난카이 다나가와선,#3366CC,2,NK,,,,#000000,,,,NANKAI,,,,0,32006,801.73389 -32007,22,南海高野線,ナンカイコウヤセン,南海高野線,Nankai Koya Line,Nankai Koya Line,南海高野线,난카이 고야선,#009900,2,NK,,,,#000000,,,,NANKAI,,,,0,32007,1508.08877 -32008,22,南海高野山ケーブル,ナンカイコウヤサンケーブル,南海高野山ケーブル,Nankai Koyasan Cable,Nankai Koyasan Cable,南海高野山缆车,난카이 고야산 케이블,#009900,0,NK,,,,#000000,,,,NANKAI,,,,0,32008,962.35557 -32009,22,南海汐見橋線,ナンカイシオミバシセン,南海汐見橋線,Nankai Shiomibashi Line,Nankai Shiomibashi Line,南海汐见桥线,난카이 시오미바시선,#009900,2,NK,,,,#000000,,,,NANKAI,,,,0,32009,936.41681 -33001,23,京阪本線,ケイハンホンセン,京阪本線,Keihan Main Line,Keihan Main Line,京阪本线,게이한 본선,#66CC33,2,KH,,,,#1D2088,,,,KEIHAN,,,,0,33001,1238.09532 -33002,23,京阪宇治線,ケイハンウジセン,京阪宇治線,Keihan Uji Line,Keihan Uji Line,京阪宇治线,게이한 우지선,#00AE00,2,KH,,,,#1D2089,,,,KEIHAN,,,,0,33002,1073.40383 -33003,23,京阪交野線,ケイハンカタノセン,京阪交野線,Keihan Katano Line,Keihan Katano Line,京阪交野线,게이한 가타노선,#00AE00,2,KH,,,,#1D2090,,,,KEIHAN,,,,0,33003,951.2774 -33004,23,京阪鴨東線,ケイハンオウトウセン,京阪鴨東線,Keihan Oto Line,Keihan Oto Line,京阪鸭东线,게이한 오토선,#00AE00,2,KH,,,,#1D2091,,,,KEIHAN,,,,0,33004,1142.05789 -33005,23,石清水八幡宮参道ケーブル,イワシミズハチマングウサンドウケーブル,京阪鋼索線,Iwashimizuhachiman Sando Cable,Iwashimizuhachiman Sando Cable,石清水八幡宫参道缆车,이와시미즈하치만구 산도 케이블,#DBA75A,0,,,,,,,,,,,,,0,33005,445.1874 -33006,23,京阪石山坂本線,ケイハンイシヤマサカモトセン,京阪石山坂本線,Keihan Ishiyama Sakamoto Line,Keihan Ishiyama Sakamoto Line,京阪石山坂本线,게이한 이시야마사카모토선,#009933,4,OT,,,,#1D2091,,,,KEIHAN,,,,0,33006,718.51102 -33007,23,京阪京津線,ケイハンケイシンセン,京阪京津線,Keihan Keishin Line,Keihan Keishin Line,京阪京津线,게이한 게이신선,#FFCC00,4,OT,T,,,#1D2091,#FF4500,,,KEIHAN,REVERSED_ROUND,,,0,33007,1195.90325 -33008,23,京阪中之島線,ケイハンナカノシマセン,京阪中之島線,Keihan Nakanoshima Line,Keihan Nakanoshima Line,京阪中之岛线,게이한 나카노시마선,#00AE00,2,KH,,,,#1D2088,,,,KEIHAN,,,,0,33008,751.54697 -34001,24,阪急神戸本線,ハンキュウコウベホンセン,阪急神戸本線,Hankyu Kobe Main Line,Hankyu Kobe Main Line,阪急神户本线,한큐 고베 본선,#0000FF,2,HK,,,,#007AC4,,,,HANKYU,,,,0,34001,2117.44985 -34002,24,阪急宝塚本線,ハンキュウタカラヅカホンセン,阪急宝塚本線,Hankyu Takarazuka Main Line,Hankyu Takarazuka Main Line,阪急宝塚本线,한큐 다카라즈카 본선,#FF00CC,2,HK,,,,#F26627,,,,HANKYU,,,,0,34002,1322.49263 -34003,24,阪急京都本線,ハンキュウキョウトホンセン,阪急京都本線,Hankyu Kyoto Main Line,Hankyu Kyoto Main Line,阪急京都本线,한큐 교토 본선,#33CC00,2,HK,,,,#2A9B50,,,,HANKYU,,,,0,34003,1740.94577 -34004,24,阪急今津線,ハンキュウイマヅセン,阪急今津線,Hankyu Imazu Line,Hankyu Imazu Line,阪急今津线,한큐 이마즈선,#0000FF,2,HK,,,,#007AC4,,,,HANKYU,,,,0,34004,1034.3153 -34005,24,阪急甲陽線,ハンキュウコウヨウセン,阪急甲陽線,Hankyu Koyo Line,Hankyu Koyo Line,阪急甲阳线,한큐 고요선,#0000FF,2,HK,,,,#007AC4,,,,HANKYU,,,,0,34005,1067.57925 -34006,24,阪急伊丹線,ハンキュウイタミセン,阪急伊丹線,Hankyu Itami Line,Hankyu Itami Line,阪急伊丹线,한큐 이타미선,#0000FF,2,HK,,,,#007AC4,,,,HANKYU,,,,0,34006,1008.54806 -34007,24,阪急箕面線,ハンキュウミノオセン,阪急箕面線,Hankyu Mino Line,Hankyu Mino Line,阪急箕面线,한큐 미노오선,#FF00CC,2,HK,,,,#F26627,,,,HANKYU,,,,0,34007,1300.92808 -34008,24,阪急千里線,ハンキュウセンリセン,阪急千里線,Hankyu Senri Line,Hankyu Senri Line,阪急千里线,한큐 센리선,#33CC00,2,HK,K,,,#2A9B50,#814721,,,HANKYU,REVERSED_ROUND,,,0,34008,1308.95808 -34009,24,阪急嵐山線,ハンキュウアラシヤマセン,阪急嵐山線,Hankyu Arashiyama Line,Hankyu Arashiyama Line,阪急岚山线,한큐 아라시야마선,#33CC00,2,HK,,,,#2A9B50,,,,HANKYU,,,,0,34009,1331.78071 -35001,25,阪神本線,ハンシンホンセン,阪神本線,Hanshin Main Line,Hanshin Main Line,阪神本线,한신 본선,#FFA00E,2,HS,,,,#1F64B1,,,,HANSHIN,,,,0,35001,986.45703 -35002,25,阪神なんば線,ハンシンナンバセン,阪神なんば線,Hanshin Namba Line,Hanshin Namba Line,阪神难波线,한신 난바선,#6BB5E6,2,HS,,,,#1F64B1,,,,HANSHIN,,,,0,35002,994.11761 -35003,25,阪神武庫川線,ハンシンムコガワセン,阪神武庫川線,Hanshin Mukogawa Line,Hanshin Mukogawa Line,阪神武库川线,한신 무코가와선,#4A74B0,2,HS,,,,#1F64B1,,,,HANSHIN,,,,0,35003,568.11583 -36001,26,西鉄天神大牟田線,ニシテツテンジンオオムタセン,西鉄天神大牟田線,Nishitetsu Tenjin Omuta Line,Nishitetsu Tenjin Omuta Line,西铁天神大牟田线,니시테쓰 덴진오무타선,#1065AB,2,T,,,,#1065AB,,,,NISHITETSU,,,,0,36001,1518.43874 -36002,26,西鉄太宰府線,ニシテツダザイフセン,西鉄太宰府線,Nishitetsu Dazaifu Line,Nishitetsu Dazaifu Line,西铁太宰府线,니시테쓰 다자이후선,#FD8A02,2,D,T,,,#1065AB,#1065AB,,,NISHITETSU,NISHITETSU,,,0,36002,1189.57765 -36003,26,西鉄甘木線,ニシテツアマギセン,西鉄甘木線,Nishitetsu Amagi Line,Nishitetsu Amagi Line,西铁甘木线,니시테쓰 아마기선,#1065AB,2,A,T,,,#1065AB,,,,NISHITETSU,,,,0,36003,1576.97881 -36004,26,西鉄貝塚線,ニシテツカイヅカセン,西鉄貝塚線,Nishitetsu Kaizuka Line,Nishitetsu Kaizuka Line,西铁贝冢线,니시테쓰 가이즈카선,#1065AB,2,NK,,,,#1065AB,,,,NISHITETSU,,,,0,36004,1190.996 -99101,101,札幌市営地下鉄東西線,サッポロシエイチカテツトウザイセン,札幌市営地下鉄東西線,Sapporo Municipal Subway Tozai Line,Sapporo Municipal Subway Tozai Line,札幌市营地铁东西线,삿포로 시영 지하철 도자이선,#FFA500,3,T,,,,#FFA500,,,,ROUND,,,,0,99101,1110.60862 -99102,101,札幌市営地下鉄南北線,サッポロシエイチカテツナンボクセン,札幌市営地下鉄南北線,Sapporo Municipal Subway Namboku Line,Sapporo Municipal Subway Namboku Line,札幌市营地铁南北线,삿포로 시영 지하철 난보쿠선,#008000,3,N,,,,#008000,,,,ROUND,,,,0,99102,947.50386 -99103,101,札幌市営地下鉄東豊線,サッポロシエイチカテツトウホウセン,札幌市営地下鉄東豊線,Sapporo Municipal Subway Toho Line,Sapporo Municipal Subway Toho Line,札幌市营地铁东丰线,삿포로 시영 지하철 도호선,#0080FF,3,H,,,,#0080FF,,,,ROUND,,,,0,99103,1113.91678 -99104,252,札幌市電,サッポロシデン,札幌市電 一条・山鼻軌道線,Yamahana Streetcar Line,Yamahana Streetcar Line,札幌市电,삿포로 시덴,#2A74BC,4,SC,,,,#2A74BC,,,,ROUND,,,,0,99104,458.55484 -99105,102,函館市電2系統,ハコダテシデンニケイトウ,函館市電2系統,Hakodate Streetcar Route 2,Hakodate Streetcar Route 2,函馆市电2系统,하코다테 시덴 2계통,#004896,4,DY,Y,,,#004896,,,,ROUND,,,,0,99105,452.62201 -99106,102,函館市電5系統,ハコダテシデンゴケイトウ,函館市電5系統,Hakodate Streetcar Route 5,Hakodate Streetcar Route 5,函馆市电5系统,하코다테 시덴 5계통,#004896,4,DY,D,,,#004896,,,,ROUND,,,,0,99106,467.86281 -99107,103,ふるさと銀河線,フルサトギンガセン,北海道ちほく高原鉄道ふるさと銀河線,Furusato Ginga Line,Furusato Ginga Line,故乡银河线,후루사토 긴가선,#B63238,2,,,,,,,,,,,,,2,99107,4695.94041 -99108,248,道南いさりび鉄道線,ドウナンイサリビテツドウセン,道南いさりび鉄道線,South Hokkaido Railway Line,South Hokkaido Railway Line,道南渔火铁道线,도난이사리비 철도선,#246DAC,2,sh,H,,,#246DAC,#0072BC,,,REVERSED_ROUND,ROUND,,,0,99108,3386.87637 -99201,104,津軽鉄道線,ツガルテツドウセン,津軽鉄道線,Tsugaru Railway Line,Tsugaru Railway Line,津轻铁道线,쓰가루 철도선,#8D8335,2,,,,,,,,,,,,,0,99201,1815.8183 -99202,105,弘南鉄道弘南線,コウナンテツドウコウナンセン,弘南鉄道弘南線,Konan Railway Konan Line,Konan Railway Konan Line,弘南铁道弘南线,고난 철도 고난선,#1E9B49,2,KK,,,,#231816,,,,REVERSED_ROUND,,,,0,99202,1360.44342 -99203,105,弘南鉄道大鰐線,コウナンテツドウオオワニセン,弘南鉄道大鰐線,Konan Railway Owani Line,Konan Railway Owani Line,弘南铁道大鳄线,고난 철도 오와니선,#F39918,2,KW,,,,#D80C18,,,,REVERSED_ROUND,,,,0,99203,1043.47334 -99204,106,十和田観光電鉄線,トワダカンコウデンテツセン,十和田観光電鉄線,Towada Kanko Electric Railway Line,Towada Kanko Electric Railway Line,十和田观光电铁线,도와다 관광 전철선,#2826FE,2,,,,,,,,,,,,,2,99204,1581.06990 -99205,107,いわて銀河鉄道線,イワテギンガテツドウセン,いわて銀河鉄道線,Iwate Galaxy Railway Line,Iwate Galaxy Railway Line,岩手银河铁道线,이와테 긴가 철도선,#003399,2,,,,,,,,,,,,,0,99205,4773.70355 -99206,108,青い森鉄道線,アオイモリテツドウセン,青い森鉄道線,Aoimori Railway Line,Aoimori Railway Line,青森铁道线,아오이모리 철도선,#00FFFF,2,,,,,,,,,,,,,0,99206,4646.29433 -99207,109,三陸鉄道北リアス線,サンリクテツドウキタリアスセン,三陸鉄道北リアス線,Sanriku Railway North Rias Line,Sanriku Railway North Rias Line,三陆铁道北里亚斯线,산리쿠 철도 기타리아스선,#EC6821,2,,,,,,,,,,,,,2,99207,0 -99208,109,三陸鉄道リアス線,サンリクテツドウリアスセン,三陸鉄道リアス線,Sanriku Railway Rias Line,Sanriku Railway Rias Line,三陆铁道里亚斯线,산리쿠 철도 리아스선,#EC6821,2,,,,,,,,,,,,,0,99208,4007.72176 -99209,110,秋田内陸線,アキタナイリクセン,秋田内陸縦貫鉄道秋田内陸線,Akita Nairiku Line,Akita Nairiku Line,秋田内陆线,아키타 나이리쿠선,#990000,2,,,,,,,,,,,,,0,99209,3317.10338 -99210,111,鳥海山ろく線,チョウカイサンロクセン,由利高原鉄道鳥海山ろく線,Chokai Sanroku Line,Chokai Sanroku Line,鸟海山麓线,조카이산로쿠선,#B5E61D,2,,,,,,,,,,,,,0,99210,2051.2472 -99211,112,フラワー長井線,ヤマガタテツドウフラワーナガイセン,山形鉄道フラワー長井線,Flower Nagai Line,Flower Nagai Line,花长井线,플라워 나가이선,#F892F4,2,,,,,,,,,,,,,0,99211,1882.55335 -99212,113,くりはら田園鉄道線,クリハラデンエンテツドウセン,くりはら田園鉄道線,Kurihara Den'en Railway Line,Kurihara Den'en Railway Line,栗原田园铁道线,구리하라 덴엔 철도선,#8E2229,2,,,,,,,,,,,,,2,99212,1907.17502 -99213,114,阿武隈急行線,アブクマキュウコウセン,阿武隈急行線,Abukuma Kyūkō Line,Abukuma Kyūkō Line,阿武隈急行线,아부쿠마 급행선,#37CB7F,2,,,,,,,,,,,,,0,99213,2369.63173 -99214,115,仙台市営地下鉄南北線,センダイシエイチカテツナンボクセン,仙台市営地下鉄南北線,Sendai Subway Namboku Line,Sendai Subway Namboku Line,仙台市营地铁南北线,센다이 시영 지하철 난보쿠선,#339966,3,N,,,,#339966,,,,ROUND,,,,0,99214,891.24713 -99218,115,仙台市営地下鉄東西線,センダイシエイチカテツトウザイセン,仙台市営地下鉄東西線,Sendai Subway Tozai Line,Sendai Subway Tozai Line,仙台市营地铁东西线,센다이 시영 지하철 도자이선,#00B1DD,3,T,,,,#00B1DD,,,,ROUND,,,,0,99214,1129.33276 -99215,116,福島交通飯坂線,フクシマシエイコウツウイイザカセン,福島交通飯坂線,Fukushima Kotsu Iizaka Line,Fukushima Kotsu Iizaka Line,福岛交通饭坂线,후쿠시마 교통 이이자카선,#BFBFFF,2,,,,,,,,,,,,,0,99215,855.93195 -99216,117,会津鉄道会津線,アイヅテツドウアイヅセン,会津鉄道会津線,Aizu Railway Aizu Line,Aizu Railway Aizu Line,会津铁道会津线,아이즈 철도 아이즈선,#265613,2,,,,,,,,,,,,,0,99216,2815.55776 -99217,118,仙台空港線,センダイクウコウセン,仙台空港鉄道仙台空港線,Sendai Airport Line,Sendai Airport Line,仙台机场线,센다이 공항선,#2A5CAA,2,,,,,,,,,,,,,0,99217,2316.47225 -99301,119,都営大江戸線,トエイオオエドセン,都営大江戸線,Toei Oedo Line,Toei Oedo Line,都营大江户线,도에이 오에도선,#B6007A,3,E,,,,#B6007A,,,,ROUND,,,,0,99301,1066.83815 -99302,119,都営浅草線,トエイアサクサセン,都営浅草線,Toei Asakusa Line,Toei Asakusa Line,都营浅草线,도에이 아사쿠사선,#EC6E65,3,A,,,,#EC6E65,,,,ROUND,,,,0,99302,952.38538 -99303,119,都営三田線,トエイミタセン,都営三田線,Toei Mita Line,Toei Mita Line,都营三田线,도에이 미타선,#0079C2,3,I,,,,#0079C2,,,,ROUND,,,,0,99303,992.91929 -99304,119,都営新宿線,トエイシンジュクセン,都営新宿線,Toei Shinjuku Line,Toei Shinjuku Line,都营新宿线,도에이 신주쿠선,#B0BF1E,3,S,,,,#B0BF1E,,,,ROUND,,,,0,99304,1157.85443 -99305,119,東京さくらトラム(都電荒川線),トウキョウサクラトラム(トデンアラカワセン),都営都電荒川線,Tokyo Sakura Tram,Tokyo Sakura Tram,都电荒川线,도덴 아라카와선,#EE86A7,4,SA,,,,#EE86A7,,,,REVERSED_ROUND,,,,0,99305,437.36399 -99342,119,日暮里・舎人ライナー,ニッポリ・トネリライナー,日暮里・舎人ライナー,Nippori-Toneri Liner,Nippori-Toneri Liner,日暮里-舍人线,닛포리·도네리 라이너,#69B444,5,NT,,,,#69B444,,,,NTL,,,,0,99305,817.56071 -99306,120,秩父鉄道秩父本線,チチブテツドウチチブホンセン,秩父鉄道秩父本線,Chichibu Railway Chichibu Main Line,Chichibu Railway Chichibu Main Line,秩父铁道秩父本线,지치부 철도 지치부 본선,#0054A6,2,CR,,,,#0054A6,,,,ROUND,,,,0,99306,1959.10704 -99307,121,埼玉高速鉄道線,サイタマコウソクテツドウセン,埼玉高速鉄道線,Saitama Rapid Railway Line,Saitama Rapid Railway Line,埼玉高速铁道线,사이타마 고속 철도선,#3565AD,2,SR,,,,#3565AD,,,,ROUND,,,,0,99307,2047.79834 -99308,122,いすみ線,イスミセン,いすみ鉄道いすみ線,Isumi Line,Isumi Line,夷隅线,이스미선,#FFDC00,2,,,,,,,,,,,,,0,99308,2002.27441 -99309,123,つくばエクスプレス線,ツクバエクスプレスセン,首都圏新都市鉄道つくばエクスプレス,Tsukuba Express Line,Tsukuba Express Line,筑波快线,쓰쿠바 익스프레스,#273E6C,2,TX,,,,#273E6C,,,,REVERSED_SQUARE,,,,0,99309,3016.22347 -99310,124,みなとみらい線,ミナトミライセン,みなとみらい21線,Minatomirai Line,Minatomirai Line,港未来线,미나토미라이선,#013274,2,MM,,,,#013274,,,,REVERSED_SQUARE,,,,0,99310,793.27142 -99311,125,ゆりかもめ,ユリカモメ,ゆりかもめ東京臨海新交通臨海線,Yurikamome,Yurikamome,百合鸥,유리카모메,#00418E,5,U,,,,#00418E,,,,REVERSED_ROUND,,,,0,99311,936.45551 -99312,126,わたらせ渓谷線,ワタラセケイコクセン,わたらせ渓谷鐵道わたらせ渓谷線,Watarase Keikoku Line,Watarase Keikoku Line,渡良濑溪谷线,와타라세 계곡선,#5B1511,2,WK,,,,#5B1511,,,,ROUND,,,,0,99312,2683.8255 -99313,127,ユーカリが丘線,ユーガリガオカセン,山万ユーカリが丘線,Yukarigaoka Line,Yukarigaoka Line,有加利丘线,유카리가오카선,#30B474,5,,,,,#5B1511,,,,ROUND,,,,0,99313,681.93148 -99314,128,伊豆箱根鉄道大雄山線,イズハコネテツドウダイユウザンセン,伊豆箱根鉄道大雄山線,Izuhakone Railway Daiyuzan Line,Izuhakone Railway Daiyuzan Line,伊豆箱根铁道大雄山线,이즈하코네 철도 다이유잔선,#4086E5,2,ID,,,,#4086E5,,,,IZUHAKONE,,,,0,99314,861.50661 -99315,129,ひたちなか海浜鉄道湊線,ヒタチナカカイヒンテツドウミナトセン,ひたちなか海浜鉄道湊線,Hitachinaka Seaside Railway,Hitachinaka Seaside Railway,常陆那珂海滨铁道凑线,히타치나카 해안철도 미나토선,#A77718,2,,,,,,,,,,,,,0,99315,1390.85906 -99316,130,横浜市営地下鉄ブルーライン,ヨコハマシエイチカテツブルーライン,横浜市高速鉄道1号線・3号線,Yokohama Municipal Subway Blue Line,Yokohama Municipal Subway Blue Line,横滨市营地铁蓝线,요코하마 시영 지하철 블루 라인,#005BA5,3,B,,,,#005BA5,,,,REVERSED_ROUND,,,,0,99316,1273.71378 -99343,130,横浜市営地下鉄グリーンライン,ヨコハマシエイチカテツグリーンライン,横浜市高速鉄道4号線,Yokohama Municipal Subway Green Line,Yokohama Municipal Subway Green Line,横滨市营地铁绿线,요코하마 시영 지하철 그린 라인,#40CC40,3,G,,,,#40CC40,,,,REVERSED_ROUND,,,,0,99316,1391.75413 -99317,131,金沢シーサイドライン,カナザワシーサイドライン,横浜新都市交通金沢シーサイドライン,Kanazawa Seaside Line,Kanazawa Seaside Line,横滨海岸线,요코하마 시사이드라인,#F68B1E,5,,,,,#5466BC,,,,REVERSED_ROUND_HORIZONTAL,,,,0,99317,774.45917 -99318,132,関東鉄道常総線,カントウテツドウジョウソウセン,関東鉄道常総線,Kanto Railway Joso Line,Kanto Railway Joso Line,关东铁道常总线,간토 철도 조소선,#121892,2,,,,,,,,,,,,,0,99318,2131.01169 -99319,132,関東鉄道竜ヶ崎線,カントウテツドウリュウガサキセン,関東鉄道竜ヶ崎線,Kanto Railway Ryugasaki Line,Kanto Railway Ryugasaki Line,关东铁道龙崎线,간토 철도 류가사키선,#121892,2,,,,,,,,,,,,,0,99319,2173.64206 -99320,133,江ノ島電鉄線,エノシマデンテツセン,江ノ島電鉄線,Enoshima Electric Railway Line,Enoshima Electric Railway Line,江之岛电铁线,에노시마 전철선,#209A3F,2,EN,,,,#209A3F,,,,ENODEN,,,,0,99320,682.96003 -99321,134,ニューシャトル,ニューシャトル,埼玉新都市交通伊奈線,New Shuttle,New Shuttle,伊奈线,이나선,#339999,5,NS,,,,#339999,,,,NEW_SHUTTLE,,,,0,99321,1075.79739 -99322,135,鹿島鉄道線,カシマテツドウセン,鹿島鉄道線,Kashima Railway Line,Kashima Railway Line,鹿岛鉄道线,카시마 철도선,#CC0000,2,,,,,,,,,,,,,2,99322,1887.65696 -99323,136,鹿島臨海鉄道大洗鹿島線,カシマリンカイテツドウオオアライカシマセン,鹿島臨海鉄道大洗鹿島線,Oarai Kashima Line,Oarai Kashima Line,鹿岛临海铁道大洗鹿岛线,가시마 임해 철도 오아라이카시마선,#3260C0,2,,,,,,,,,,,,,0,99323,3711.69043 -99324,137,芝山鉄道線,シバヤマテツドウセン,芝山鉄道線,Shibayama Railway Line,Shibayama Railway Line,芝山铁道线,시바야마 철도선,#33CC33,2,SR,KS,,,#007F5A,#005AAA,,,KEISEI,KEISEI,,,0,99324,2107.62382 -99325,138,小湊鉄道線,コミナトテツドウセン,小湊鉄道線,Kominato Line,Kominato Line,小凑铁道线,코미나토 철도선,#DCBC9F,2,,,,,,,,,,,,,0,99325,2249.53509 -99326,139,湘南モノレール,ショウナンモノレール,江の島線,Shonan Monorail,Shonan Monorail,湘南单轨电车,쇼난 모노레일,#3E7AFF,5,SMR,,,,#000000,,,,SMR,,,,0,99326,895.55729 -99327,140,上信電鉄,ジョウシンデンテツ,上信電鉄,Joshin Dentetsu Line,Joshin Dentetsu Line,上信电铁,조신 전철,#457BC6,2,,,,,,,,,,,,,0,99327,1648.16489 -99328,141,上毛電気鉄道上毛線,ジョウモウデンキテツドウジョウモウセン,上毛電気鉄道上毛線,Jomo Line,Jomo Line,上毛电气铁道上毛线,조모 전기 철도 조모선,#40E0D0,2,JM,,,,#40E0D0,,,,ROUND,,,,0,99328,1118.88779 -99329,13,京成松戸線,ケイセイマツドセン,京成電鉄松戸線,Keisei Matsudo Line,Keisei Matsudo Line,京成松户线,게이세이 마쓰도선,#005AAA,2,KS,,,,#005AAA,,,,KEISEI,,,,0,99329,1112.85437 -99330,143,真岡鐵道真岡線,モオカテツドウモオカセン,真岡鐵道真岡線,Moka Line,Moka Line,真冈铁道真冈线,모카 철도 모카선,#EE5B5B,2,,,,,,,,,,,,,0,99330,2586.20889 -99331,144,千葉都市モノレール1号線,チバトシモノレールイチゴウセン,千葉都市モノレール1号線,Chiba Urban Monorail Line 1,Chiba Urban Monorail Line 1,千叶都市单轨电车1号线,지바 도시 모노레일 1호선,#192198,5,CM,,,,#3E8BAD,,,,ROUND,,,,0,99331,566.66594 -99332,144,千葉都市モノレール2号線,チバトシモノレールニゴウセン,千葉都市モノレール2号線,Chiba Urban Monorail Line 2,Chiba Urban Monorail Line 2,千叶都市单轨电车2号线,지바 도시 모노레일 2호선,#192198,5,CM,,,,#3E8BAD,,,,ROUND,,,,0,99332,916.35638 -99333,145,流鉄流山線,リュウテツナガレヤマセン,流鉄流山線,Ryutetsu Nagareyama Line,Ryutetsu Nagareyama Line,流铁流山线,류테츠나가레야마선,#B58429,2,RN,,,,#B58429,,,,ROUND,,,,0,99333,1090.40105 -99334,146,多摩モノレール,タマモノレール,多摩都市モノレール線,Tama Toshi Monorail Line,Tama Toshi Monorail Line,多摩都市单轨电车线,다마 도시 모노레일선,#FF6633,5,TT,,,,#37615E,,,,SQUARE,,,,0,99334,870.36393 -99335,147,銚子電鉄線,チョウシデンテツセン,銚子電気鉄道線,Choshi Electric Railway Line,Choshi Electric Railway Line,铫子电气铁道线,조시 전기철도선,#A52A2A,2,CD,,,,#333333,,,,SQUARE,,,,0,99335,723.60043 -99336,148,東京モノレール,トウキョウモノレール,東京モノレール羽田空港線,Tokyo Monorail,Tokyo Monorail,东京单轨电车,도쿄 모노레일,#003686,5,MO,,,,#003686,,,,SQUARE,,,,0,99336,1730.1195 -99337,149,りんかい線,リンカイセン,東京臨海高速鉄道りんかい線,Rinkai Line,Rinkai Line,临海线,린카이선,#00418E,2,R,,,,#00418E,,,,TWR,,,,0,99337,1739.57769 -99338,150,東葉高速線,トウヨウコウソクセン,東葉高速鉄道東葉高速線,Toyo Rapid Railway Line,Toyo Rapid Railway Line,东叶高速线,도요 고속선,#66CC00,2,TR,,,,#66CC00,,,,ROUND,,,,0,99338,2026.46605 -99339,151,箱根登山鉄道鉄道線,ハコネトザンテツドウテツドウセン,箱根登山鉄道鉄道線,Hakone Tozan Line,Hakone Tozan Line,箱根登山线,하코네 등산선,#F04A00,2,OH,,,,#F04A00,,,,HAKONE,,,,0,99339,1393.88661 -99340,152,北総鉄道北総線,ホクソウテツドウホクソウセン,北総鉄道北総線,Hokuso Line,Hokuso Line,北总铁道北总线,호쿠소 철도 호쿠소선,#3333FF,2,HS,KS,,,#3333FF,#005AAA,,,KEISEI,KEISEI,,,0,99340,2282.3843 -99341,153,ほっとスパ・ライン,ホットスパライン,野岩鉄道会津鬼怒川線,Yagan Railway Aizu Kinugawa Line,Yagan Railway Aizu Kinugawa Line,野岩铁道会津鬼怒川线,야간 철도 아이즈키누가와선,#00733C,2,,,,,,,,,,,,,0,99341,3792.83721 -99344,151,箱根登山ケーブルカー,ハコネトザンケーブルカー,箱根登山鉄道鋼索線,Hakone Tozan Cable Car,Hakone Tozan Cable Car,箱根登山缆车,하코네 등산 케이블카,#BE3C27,0,,,,,,,,,,,,,0,99344,285.33449 -99345,250,芳賀・宇都宮LRT,ウツノミヤハガライトレールセン,宇都宮芳賀ライトレール線,Haga Utsunomiya LRT,Haga Utsunomiya LRT,芳贺/宇都宫LRT,하가 · 우츠노미야 LRT,#F9BE00,4,,,,,#F9BE00,,,,MONOCHROME_ROUND,,,,0,99345,784.19167 -99401,154,富士急行線,フジキュウコウセン,富士急行線,Fujikyuko Line,Fujikyuko Line,富士急行线,후지큐코선,#E83917,2,FJ,,,,#000000,,,,ROUND,,,,0,99401,1488.82123 -99402,155,北越急行ほくほく線,ホクエツキュウコウホクホクセン,北越急行ほくほく線,Hokuhoku Line,Hokuhoku Line,北越急行北北线,호쿠에쓰 급행 호쿠호쿠선,#CC3366,2,,,,,,,,,,,,,0,99402,5366.7774 -99403,156,しなの鉄道線,シナノテツドウセン,しなの鉄道線,Shinano Railway Line,Shinano Railway Line,信浓铁道线,시나노 철도선,#F0A401,2,,,,,,,,,,,,,0,99403,3335.19718 -99427,156,北しなの線,キタシナノセン,北しなの線,Kita-Shinano Line,Kita-Shinano Line,北信浓线,기타시나노선,#FEC9FE,2,,,,,,,,,,,,,0,99403,5132.73044 -99404,157,上田電鉄別所線,ウエダデンテツベッショセン,上田電鉄別所線,Ueda Electric Railway Bessho Line,Ueda Electric Railway Bessho Line,上田电铁别所线,우에다 전철 벳쇼선,#0B2846,2,BE,,,,#0B2846,,,,REVERSED_ROUND,,,,0,99404,787.89761 -99405,158,長野電鉄長野線,ナガノデンテツナガノセン,長野電鉄長野線,Nagano Electric Railway Nagano Line,Nagano Electric Railway Nagano Line,长野电铁长野线,나가노 전철 나가노선,#E21919,2,N,,,,#E21919,,,,ROUND,,,,0,99405,1389.13664 -99406,158,長野電鉄屋代線,ナガノデンテツヤシロセン,長野電鉄屋代線,Nagano Electric Railway Yashiro Line,Nagano Electric Railway Yashiro Line,长野电铁屋代线,나가노 전철 야시로선,#E21919,2,Y,,,,#E21919,,,,ROUND,,,,2,99406,2195.43210 -99407,159,上高地線,カミコウチセン,アルピコ交通上高地線,Kamikochi Line,Kamikochi Line,上高地线,가미코치선,#465DAA,2,AK,,,,#465DAA,,,,ROUND,,,,0,99407,1084.96874 -99408,160,富山地鉄本線,トヤマチテツホンセン,富山地鉄本線,Toyama Chiho Railway Main Line,Toyama Chiho Railway Main Line,富山地铁本线,도야마 지방 철도 본선,#1D1686,2,T,,,,#1D1686,,,,SQUARE,,,,0,99408,1312.56347 -99409,160,富山地鉄立山線,トヤマチテツタテヤマセン,富山地鉄立山線,Toyama Chiho Railway Tateyama Line,Toyama Chiho Railway Tateyama Line,富山地铁立山线,도야마 지방 철도 다테야마선,#008000,2,T,,,,#008000,,,,SQUARE,,,,0,99409,1834.83282 -99410,160,富山地鉄不二越・上滝線,トヤマチテツフジコシ・カミダキセン,富山地鉄不二越・上滝線,Toyama Chiho Railway Fujikoshi-Kamidaki Line,Toyama Chiho Railway Fujikoshi-Kamidaki Line,富山地铁不二越・上泷线,도야마 지방 철도 후지코시·가미다키선,#7E490A,2,T,,,,#7E490A,,,,SQUARE,,,,0,99410,1139.17683 -99411,161,神岡鉄道神岡線,カミオカテツドウカミオカセン,神岡鉄道神岡線,Kamioka Railway Kamioka Line,Kamioka Railway Kamioka Line,神冈铁道神冈线,가미오카 철도 가미오카선,#DC4C14,2,,,,,,,,,,,,,2,99411,3068.94038 -99412,162,黒部峡谷鉄道本線,クロベキョウコクテツドウホンセン,黒部峡谷鉄道本線,Kurobe Gorge Main Line,Kurobe Gorge Main Line,黑部峡谷铁道本线,구로베 협곡 철도 본선,#EE7700,2,,,,,,,,,,,,,0,99412,5823.20369 -99413,160,富山地鉄市内線【1・2系統】,トヤマチテツシナイセン,富山地鉄市内線,Toyama City Tram Line Route 1/2,Toyama City Tram Line Route 1/2,富山地铁市内线【1・2系统】,도야마 지방 철도 시내선【1·2계통】,#EF1731,4,C,,,,#EF1731,,,,ROUND,,,,0,99413,390.42487 -99422,160,富山地鉄富山都心線【3系統(環状線)】,トヤマチテツトヤマトシンセン,富山地鉄富山都心線,Toyama City Tram Line Route 3,Toyama City Tram Line Route 3,富山地铁富山都心线【3系统(环状线)】,도야마 지방 철도 도야마 도심선【3계통(순환선)】,#4243BE,4,C,,,,#4243BE,,,,ROUND,,,,0,99413,316.9133 -99414,163,万葉線,マンヨウセン,万葉線,Manyo Line,Manyo Line,万叶线,만요선,#FF0B4B,4,,,,,,,,,,,,,0,99414,651.0786 -99415,160,富山港線,トヤマコウセン,富山港線,Toyamako line,Toyamako line,富山港线,도야마코선,#3698C4,4,C,,,,#3698C4,,,,ROUND,,,,0,99415,565.76659 -99416,165,北陸鉄道石川線,ホクリクテツドウイシカワセン,北陸鉄道石川線,Hokuriku Railroad Ishikawa Line,Hokuriku Railroad Ishikawa Line,北陆铁道石川线,호쿠리쿠 철도 이시카와선,#A9731E,2,I,,,,#008000,,,,ROUND,,,,0,99416,848.60776 -99417,165,北陸鉄道浅野川線,ホクリクテツドウアサノガワセン,北陸鉄道浅野川線,Hokuriku Railroad Asanogawa Line,Hokuriku Railroad Asanogawa Line,北陆铁道浅野川线,호쿠리쿠 철도 아사노가와선,#559652,2,A,,,,#0067C0,,,,ROUND,,,,0,99417,621.57908 -99423,244,日本海ひすいライン,ニホンカイヒスイライン,日本海ひすいライン,Nihonkai Hisui Line,Nihonkai Hisui Line,日本海翡翠线,니혼카이 히스이 라인,#3782BD,2,,,,,,,,,,,,,0,99417,4887.26227 -99424,244,妙高はねうまライン,ミョウコウハネウマライン,妙高はねうまライン,Myoko Haneuma Line,Myoko Haneuma Line,妙高跃马线,묘코 하네우마 라인,#35C98E,2,,,,,,,,,,,,,0,99417,4172.06803 -99425,245,あいの風とやま鉄道線,アイノカゼトヤマテツドウセン,あいの風とやま鉄道線,Ainokaze Toyama Railway Line,Ainokaze Toyama Railway Line,爱之风富山铁道线,아이노카제 도야마 철도선,#63C65E,2,,,,,,,,,,,,,0,99417,4573.88042 -99426,246,IRいしかわ鉄道線,アイアールイシカワテツドウセン,IRいしかわ鉄道株式会社,IR Ishikawa Railway Line,IR Ishikawa Railway Line,IR石川铁道线,IR이시카와 철도선,#25A6DF,2,,,,,,,,,,,,,0,99417,3553.1462 -99418,166,のと鉄道七尾線,ノトテツドウナナオセン,のと鉄道七尾線,Noto Railway Nanao Line,Noto Railway Nanao Line,能登铁道七尾线,노토 철도 나나오선,#1594EB,2,,,,,,,,,,,,,0,99418,4704.77949 -99419,167,えちぜん鉄道勝山永平寺線,エチゼンテツドウカツヤマエイヘイジセン,えちぜん鉄道勝山永平寺線,Echizen Railway Katsuyama Eiheiji Line,Echizen Railway Katsuyama Eiheiji Line,越前铁道胜山永平寺线,에치젠 철도 가쓰야마에이헤이지선,#FD6802,2,E,,,,#FD6802,,,,ROUND,,,,0,99419,1227.41572 -99420,167,えちぜん鉄道三国芦原線,エチゼンテツドウミクニアワラセン,えちぜん鉄道三国芦原線,Echizen Railway Mikuni Ashihara Line,Echizen Railway Mikuni Ashihara Line,越前铁道三国芦原线,에치젠 철도 미쿠니아와라선,#0069FF,2,E,,,,#0069FF,,,,ROUND,,,,0,99420,1148.51023 -99421,168,福井鉄道福武線,フクイテツドウフクブセン,福井鉄道福武線,Fukui Railway Fukutake Line,Fukui Railway Fukutake Line,福井铁道福武线,후쿠이 철도 후쿠타케선,#197A3D,4,F,,,,#197A3D,,,,ROUND,,,,0,99421,1071.15936 -99428,251,ハピラインふくい線,ハピラインフクイセン,ハピラインふくい線,Hapi-line Fukui,Hapi-line Fukui线,Hapi线福井线,하피라인 후쿠이선,#EC1C9C,2,,,,,,,,,,,,,0,99426,4390.58048 -99501,169,伊豆急行線,イズキュウコウセン,伊豆急行線,Izu Kyuko Line,Izu Kyuko Line,伊豆急行线,이즈 급행선,#0085CD,2,IZ,,,,#000000,,,,SQUARE,,,,0,99501,3006.10916 -99502,128,伊豆箱根鉄道駿豆線,イズハコネテツドウスンズセン,伊豆箱根鉄道駿豆線,Izuhakone Railway Sunzu Line,Izuhakone Railway Sunzu Line,伊豆箱根铁道骏豆线,이즈하코네 철도 순즈선,#4086E5,2,IS,,,,#4086E5,,,,IZUHAKONE,,,,0,99502,1608.83117 -99503,170,岳南鉄道線,ガクナンテツドウセン,岳南鉄道線,Gakunan Railway Line,Gakunan Railway Line,岳南铁道线,가쿠난 철도선,#6B0102,2,GD,,,,#6B0102,,,,MONOCHROME_ROUND,,,,0,99503,991.96997 -99504,171,静岡鉄道静岡清水線,シズオカテツドウシズオカシミズセン,静岡鉄道静岡清水線,Shizuoka Railway Shizuoka Shimizu Line,Shizuoka Railway Shizuoka Shimizu Line,静冈铁道静冈清水线,시즈오카 철도 시즈오카시미즈선,#0063B5,2,S,,,,#0094E2,,,,ROUND_HORIZONTAL,,,,0,99504,776.48074 -99505,172,天竜浜名湖線,テンリュウハマナコセン,天竜浜名湖鉄道天竜浜名湖線,Tenryu Hamanako Line,Tenryu Hamanako Line,天龙浜名湖线,덴류하마나코선,#95805A,2,,,,,,,,,,,,,0,99505,1739.51349 -99506,173,遠州鉄道鉄道線,エンシュウテツドウテツドウセン,遠州鉄道鉄道線,Enshu Railway Line,Enshu Railway Line,远州铁道铁道线,엔슈 철도선,#0672B0,2,ET,,,,#0672B0,,,,NUMBER_ONLY,,,,0,99506,1040.11028 -99507,174,大井川鐵道大井川本線,オオイガワテツドウオオイガワホンセン,大井川鐵道大井川本線,Oigawa Railway Oigawa Main Line,Oigawa Railway Oigawa Main Line,大井川铁道大井川本线,오이가와 철도 오이가와 본선,#F5F5F5,2,,,,,,,,,,,,,0,99507,2006.41977 -99508,174,南アルプスあぷとライン,ミナミアルプスアプトライン,大井川鐵道井川線,Oigawa Railway Ikawa Line,Oigawa Railway Ikawa Line,南阿尔卑斯阿普特线,미나미알프스 아프트 라인,#FFFFCC,2,,,,,,,,,,,,,0,99508,1871.28994 -99509,175,あおなみ線,アオナミセン,西名古屋港線,Aonami Line,Aonami Line,青波线,아오나미선,#464285,2,AN,,,,#464285,,,,ROUND,,,,0,99509,1494.42718 -99510,176,東海交通事業城北線,トウカイコウツウジギョウジョウホクセン,東海交通事業城北線,Tokai Transport Service Johoku Line,Tokai Transport Service Johoku Line,东海交通事业城北线,도카이 교통 사업 조호쿠선,#FF6600,2,,,,,,,,,,,,,0,99510,2210.03734 -99511,177,愛知環状鉄道線,アイチカンジョウテツドウセン,愛知環状鉄道線,Aichi Loop Line,Aichi Loop Line,爱知环状铁道线,아이치 간조 철도선,#2A359D,2,,,,,#2A359D,,,,MONOCHROME_ROUND,,,,0,99511,2022.52706 -99512,178,リニモ,リニモ,東部丘陵線,Linimo,Linimo,磁浮列车,리니모,#0D1F70,5,L,,,,#000000,,,,ROUND,,,,0,99512,1073.771 -99513,179,名古屋市営地下鉄東山線,ナゴヤシエイチカテツヒガシヤマセン,名古屋市営地下鉄東山線,Nagoya Municipal Subway Higashiyama Line,Nagoya Municipal Subway Higashiyama Line,名古屋市营地铁东山线,나고야 시영 지하철 히가시야마선,#FFCC00,3,H,,,,#FFCC00,,,,ROUND,,,,0,99513,966.08368 -99514,179,名古屋市営地下鉄名城線,ナゴヤシエイチカテツメイジョウセン,名古屋市営地下鉄名城線,Nagoya Municipal Subway Meijo Line,Nagoya Municipal Subway Meijo Line,名古屋市营地铁名城线,나고야 시영 지하철 메이조선,#9B74C1,3,M,,,,#9B74C1,,,,ROUND,,,,0,99514,917.56259 -99515,179,名古屋市営地下鉄名港線,ナゴヤシエイチカテツメイコウセン,名古屋市営地下鉄名港線,Nagoya Municipal Subway Meiko Line,Nagoya Municipal Subway Meiko Line,名古屋市营地铁名港线,나고야 시영 지하철 메이코선,#9B74C1,3,E,,,,#9B74C1,,,,ROUND,,,,0,99515,989.8734 -99516,179,名古屋市営地下鉄鶴舞線,ナゴヤシエイチカテツツルマイセン,名古屋市営地下鉄鶴舞線,Nagoya Municipal Subway Tsurumai Line,Nagoya Municipal Subway Tsurumai Line,名古屋市营地铁鹤舞线,나고야 시영 지하철 쓰루마이선,#04ACDD,3,T,,,,#04ACDD,,,,ROUND,,,,0,99516,1056.06986 -99517,179,名古屋市営地下鉄桜通線,ナゴヤシエイチカテツサクラドオリセン,名古屋市営地下鉄桜通線,Nagoya Municipal Subway Sakuradori Line,Nagoya Municipal Subway Sakuradori Line,名古屋市营地铁樱通线,나고야 시영 지하철 사쿠라도리선,#FF0000,3,S,,,,#FF0000,,,,ROUND,,,,0,99517,944.55051 -99518,179,名古屋市営地下鉄上飯田線,ナゴヤシエイチカテツカミイイダセン,名古屋市営地下鉄上飯田線,Nagoya Municipal Subway Kamiida Line,Nagoya Municipal Subway Kamiida Line,名古屋市营地铁上饭田线,나고야 시영 지하철 가미이다선,#FF66C4,3,K,,,,#FF66C4,,,,ROUND,,,,0,99518,879.75768 -99519,180,ピーチライナー,ピーチライナー,桃花台新交通,Peach Liner,Peach Liner,桃花快线,피치 라이너,#F9F9F9,5,,,,,,,,,,,,,2,99519,1220.51679 -99520,181,豊橋鉄道渥美線,トヨハシテツドウアツミセン,豊橋鉄道渥美線,Toyohashi Railroad Atsumi Line,Toyohashi Railroad Atsumi Line,丰桥铁道渥美线,도요하시 철도 아쓰미선,#1A9B96,4,,,,,,,,,,,,,0,99520,1164.54371 -99521,181,豊橋鉄道東田本線,トヨハシテツドウアヅマダホンセン,豊橋鉄道東田本線,Toyohashi Railroad Azumada Main Line,Toyohashi Railroad Azumada Main Line,丰桥铁道东田本线,도요하시 철도 아즈마다 본선,#1A9B96,4,,,,,,,,,,,,,0,99521,533.24363 -99522,181,豊橋鉄道運動公園前線,トヨハシテツドウウンドウコウエンマエセン,豊橋鉄道運動公園前線,Toyohashi Railroad Yagyu-bashi Branch Line,Toyohashi Railroad Yagyu-bashi Branch Line,丰桥铁道运动公园前线,도요하시 철도 야규바시 지선,#1A9B96,4,,,,,,,,,,,,,2,99522,805.15292 -99523,182,ゆとりーとライン,ユトリートライン,ガイドウェイバス志段味線,Yutorito Line,Yutorito Line,导向巴士志段味线,유토리토 라인,#3C459A,5,Y,,,,#3C459A,,,,ROUND,,,,0,99523,859.80651 -99524,183,明知鉄道明知線,アケチテツドウアケチセン,明知鉄道明知線,Akechi Railway Akechi Line,Akechi Railway Akechi Line,明知铁道明知线,아케치 철도 아케치선,#000000,2,,,,,#000000,,,,MONOCHROME_ROUND,,,,0,99524,2433.10424 -99525,184,長良川鉄道越美南線,ナガラガワテツドウエツミナンセン,長良川鉄道越美南線,Nagaragawa Railway Etsumi-Nan Line,Nagaragawa Railway Etsumi-Nan Line,长良川铁道越美南线,나가라가와 철도 에쓰미난선,#FF1493,2,,,,,#FF1493,,,,MONOCHROME_ROUND,,,,0,99525,1895.06044 -99526,185,樽見鉄道樽見線,タルミテツドウタルミセン,樽見鉄道樽見線,Tarumi Railway Tarumi Line,Tarumi Railway Tarumi Line,樽见铁道樽见线,다루미 철도 다루미선,#097AD6,2,TR,,,,#D50707,,,,REVERSED_ROUND_HORIZONTAL,,,,0,99526,1880.2054 -99528,186,三岐鉄道三岐線,サンギテツドウサンギセン,三岐鉄道三岐線,Sangi Railway Sanki Line,Sangi Railway Sanki Line,三岐铁道三岐线,산기 철도 산기선,#0D287C,2,,,,,,,,,,,,,0,99528,1855.04828 -99529,186,三岐鉄道北勢線,サンギテツドウホクセイセン,三岐鉄道北勢線,Sangi Railway Hokusei Line,Sangi Railway Hokusei Line,三岐铁道北势线,산기 철도 호쿠세이선,#0D287C,2,,,,,,,,,,,,,0,99529,1652.78385 -99530,187,伊勢鉄道伊勢線,イセテツドウイセセン,伊勢鉄道伊勢線,Ise Railway Ise Line,Ise Railway Ise Line,伊势铁道伊势线,이세 철도 이세선,#0300FA,2,,,,,,,,,,,,,0,99530,2449.10241 -99531,188,伊賀鉄道伊賀線,イガテツドウイガセン,伊賀鉄道伊賀線,Iga Railway Iga Line,Iga Railway Iga Line,伊贺铁道伊贺线,이가 철도 이가선,#895B8A,2,,,,,,,,,,,,,0,99531,1140.55469 -99532,189,養老鉄道養老線,ヨウロウテツドウヨウロウセン,養老鉄道養老線,Yoro Railway Yoro Line,Yoro Railway Yoro Line,养老铁道养老线,요로 철도 요로선,#ADDB8E,2,,,,,,,,,,,,,0,99532,2174.94449 -99601,190,近江鉄道本線,オウミテツドウホンセン,近江鉄道本線,Ohmi Railway Main Line,Ohmi Railway Main Line,近江铁道本线,오미 철도 본선,#DF8A28,2,OR,,,,#DF8A28,,,,ROUND,,,,0,99601,1965.32482 -99602,190,近江鉄道多賀線,オウミテツドウタガセン,近江鉄道多賀線,Ohmi Railway Taga Line,Ohmi Railway Taga Line,近江铁道多贺线,오미 철도 다가선,#DF8A28,2,OR,,,,#DF8A28,,,,ROUND,,,,0,99602,1201.19679 -99603,190,近江鉄道八日市線,オウミテツドウヨウカイチセン,近江鉄道八日市線,Ohmi Railway Yokaichi Line,Ohmi Railway Yokaichi Line,近江铁道八日市线,오미 철도 요카이치선,#DF8A28,2,OR,,,,#DF8A28,,,,ROUND,,,,0,99603,1507.40494 -99604,191,信楽高原鐵道信楽線,シガラキコウゲンテツドウシガラキセン,信楽高原鐵道信楽線,Shigaraki Kogen Railway Shigaraki Line,Shigaraki Kogen Railway Shigaraki Line,信乐高原铁道信乐线,시가라키 고원 철도 시가라키선,#FF6633,2,,,,,,,,,,,,,0,99604,2902.2727 -99605,192,嵯峨野観光線,サガノカンコウセン,嵯峨野観光線,Sagano Scenic Railway,Sagano Scenic Railway,嵯峨野观光线,사가노 관광선,#B22222,2,,,,,,,,,,,,,0,99605,2881.21078 -99606,193,叡山電鉄叡山本線,エイザンデンテツエイザンホンセン,叡山電鉄叡山本線,Eizan Electric Railway Eizan Main Line,Eizan Electric Railway Eizan Main Line,叡山电铁叡山本线,에이잔 전철 에이잔 본선,#007F00,2,E,,,,#007F00,,,,KEIHAN,,,,0,99606,776.34475 -99607,193,叡山電鉄鞍馬線,エイザンデンテツクラマセン,叡山電鉄鞍馬線,Eizan Electric Railway Kurama Line,Eizan Electric Railway Kurama Line,叡山电铁鞍马线,에이잔 전철 구라마선,#FF0000,2,E,,,,#007F00,,,,KEIHAN,,,,0,99607,920.4243 -99608,194,宮福線,ミヤフクセン,宮福線,Miyafuku Line,Miyafuku Line,宫福线,미야후쿠선,#429BE1,2,F,,,,#EA4F6F,,,,REVERSED_SQUARE,,,,0,99608,2310.20684 -99609,194,宮豊線,ミヤトヨセン,宮豊線,Miyatoyo Line,Miyatoyo Line,宫丰线,미야토요선,#FF4E6F,2,T,,,,#EA4F6F,,,,REVERSED_SQUARE,,,,0,99609,4782.36439 -99653,194,宮舞線,ミヤマイセン,宮舞線,Miyamai Line,Miyamai Line,宫舞线,미야마이선,#B230D1,0,M,,,,#EA4F6F,,,,REVERSED_SQUARE,,,,0,99609,4054.13143 -99610,195,京都市営地下鉄烏丸線,キョウトシエイチカテツカラスマセン,京都市営地下鉄烏丸線,Kyoto Municipal Subway Karasuma Line,Kyoto Municipal Subway Karasuma Line,京都市营地铁乌丸线,교토 시영 지하철 가라스마선,#66CC99,3,K,,,,#66CC99,,,,REVERSED_ROUND,,,,0,99610,971.61203 -99611,195,京都市営地下鉄東西線,キョウトシエイチカテツトウザイセン,京都市営地下鉄東西線,Kyoto Municipal Subway Tozai Line,Kyoto Municipal Subway Tozai Line,京都市营地铁东西线,교토 시영 지하철 도자이선,#FF6600,3,T,,,,#FF6600,,,,REVERSED_ROUND,,,,0,99611,1070.20956 -99612,196,京福電鉄嵐山本線,ケイフクデンテツアラシヤマホンセン,京福電鉄嵐山本線,Keifuku Electric Railway Arashiyama Main Line,Keifuku Electric Railway Arashiyama Main Line,京福电铁岚山本线,게이후쿠 전철 아라시야마 본선,#CC0033,4,A,,,,#CC0033,,,,REVERSED_ROUND_HORIZONTAL,,,,0,99612,625.336 -99613,196,京福電鉄北野線,ケイフクデンテツキタノセン,京福電鉄北野線,Keifuku Electric Railway Kitano Line,Keifuku Electric Railway Kitano Line,京福电铁北野线,게이후쿠 전철 기타노선,#6666CC,4,B,A,,,#6666CC,#CC0033,,,REVERSED_ROUND_HORIZONTAL,,,,0,99613,509.30112 -99614,197,北大阪急行電鉄,キタオオサカキュウコウデンテツ,北大阪急行電鉄,Kita Osaka Express Electric Railway,Kita Osaka Express Electric Railway,北大阪急行电铁,기타오사카 급행 전철,#DD5B5C,2,M,,,,#E5171F,,,,REVERSED_ROUND,,,,0,99614,1656.79284 -99616,22,南海泉北線,ナンカイセンボクセン,南海泉北線,Nankai Semboku Line,Nankai Semboku Line,南海泉北线,난카이 센보쿠선,#0099FF,2,NK,,,,#000000,,,,NANKAI,,,,0,99616,2819.48165 -99617,199,水間鉄道水間線,ミズマテツドウミズマセン,水間鉄道水間線,Mizuma Railway Mizuma Line,Mizuma Railway Mizuma Line,水间铁道水间线,미즈마 철도 미즈마선,#005CB1,2,,,,,,,,,,,,,0,99617,628.45348 -99618,249,Osaka Metro御堂筋線,オオサカメトロミドウスジセン,高速電気軌道第1号線,Osaka Metro Midosuji Line,Osaka Metro Midosuji Line,御堂筋线,미도스지선,#E5171F,3,M,,,,#E5171F,,,,REVERSED_ROUND,,,,0,99618,1280.32033 -99619,249,Osaka Metro谷町線,オオサカメトロタニマチセン,高速電気軌道第2号線,Osaka Metro Tanimachi Line,Osaka Metro Tanimachi Line,谷町线,다니마치선,#522886,3,T,,,,#522886,,,,REVERSED_ROUND,,,,0,99619,1088.54456 -99620,249,Osaka Metro四つ橋線,オオサカメトロヨツバシセン,高速電気軌道第3号線,Osaka Metro Yotsubashi Line,Osaka Metro Yotsubashi Line,四桥线,요쓰바시선,#0078BA,3,Y,,,,#0078BA,,,,REVERSED_ROUND,,,,0,99620,1119.92896 -99621,249,Osaka Metro中央線,オオサカメトロチュウオウセン,高速電気軌道第4号線,Osaka Metro Chuo Line,Osaka Metro Chuo Line,中央线,주오선,#019A66,3,C,,,,#019A66,,,,REVERSED_ROUND,,,,0,99621,1489.20988 -99622,249,Osaka Metro千日前線,オオサカメトロセンニチマエセン,高速電気軌道第5号線,Osaka Metro Sennichimae Line,Osaka Metro Sennichimae Line,千日前线,센니치마에선,#E44D93,3,S,,,,#E44D93,,,,REVERSED_ROUND,,,,0,99622,950.83706 -99623,249,Osaka Metro堺筋線,オオサカメトロサカイスジセン,高速電気軌道第6号線,Osaka Metro Sakaisuji Line,Osaka Metro Sakaisuji Line,堺筋线,사카이스지선,#814721,3,K,,,,#814721,,,,REVERSED_ROUND,,,,0,99623,940.76542 -99624,249,Osaka Metro長堀鶴見緑地線,オオサカメトロナガホリツルミリョクチセン,高速電気軌道第7号線,Osaka Metro Nagahori Tsurumi-ryokuchi Line,Osaka Metro Nagahori Tsurumi-ryokuchi Line,长堀鹤见绿地线,나가호리쓰루미료쿠치선,#A9CC51,3,N,,,,#A9CC51,,,,REVERSED_ROUND,,,,0,99624,908.75103 -99652,249,Osaka Metro今里筋線,オオサカメトロイマザトスジセン,高速電気軌道第8号線,Osaka Metro Imazatosuji Line,Osaka Metro Imazatosuji Line,今里筋线,이마자토스지선,#EE7B1A,3,I,,,,#EE7B1A,,,,REVERSED_ROUND,,,,0,99624,1270.47569 -99625,249,Osaka Metro南港ポートタウン線,オオサカメトロナンコウポートタウンセン,大阪市高速電気軌道南港ポートタウン線,Osaka Metro Nanko Port Town Line,Osaka Metro Nanko Port Town Line,南港港城线,포트타운선,#00A0DE,5,P,,,,#00A0DE,,,,REVERSED_ROUND,,,,0,99625,849.64254 -99626,201,大阪モノレール線,オオサカモノレールセン,大阪モノレール線,Osaka Monorail Main Line,Osaka Monorail Main Line,大阪单轨电车线,오사카 모노레일선,#5058C3,5,,,,,,,,,,,,,0,99626,1598.41043 -99627,201,大阪モノレール彩都線,オオサカモノレールサイトセン,国際文化公園都市線,Osaka Monorail Saito Line,Osaka Monorail Saito Line,大阪单轨电车彩都线,오사카 모노레일 사이토선,#5058C3,5,,,,,,,,,,,,,0,99627,1635.81889 -99628,202,阪堺電軌上町線,ハンカイデンキウエマチセン,阪堺電軌上町線,Hankai Uemachi Line,Hankai Uemachi Line,阪堺电轨上町线,한카이 우에마치선,#083388,4,HN,,,,#000000,,,,SQUARE,,,,0,99628,585.20252 -99629,202,阪堺電軌阪堺線,ハンカイデンキハンカイセン,阪堺電軌阪堺線,Hankai Line,Hankai Line,阪堺电轨阪堺线,한카이선,#008947,4,HN,,,,#000000,,,,SQUARE,,,,0,99629,488.59702 -99630,203,神戸高速東西線,コウベコウソクトウザイセン,神戸高速東西線,Kobe Rapid Transit Railway Tozai Line,Kobe Rapid Transit Railway Tozai Line,神户高速东西线,고베 고속 도자이선,#2560A8,2,HS,HK,SY,,#2560A8,#2560A8,#F45757,,HANSHIN,HANKYU,SANYO,,0,99630,875.00784 -99631,203,神戸高速南北線,コウベコウソクナンボクセン,神戸高速南北線,Kobe Rapid Transit Railway Namboku Line,Kobe Rapid Transit Railway Namboku Line,神户高速南北线,고베 고속 난보쿠선,#2560A8,2,KB,,,,#DD0033,,,,HANSHIN,,,,0,99631,439.36353 -99632,204,有馬線,アリマセン,神鉄有馬線,Arima Line,Arima Line,有马线,아리마선,#D53924,2,KB,,,,#DD0033,,,,HANSHIN,,,,0,99632,1532.09535 -99633,204,三田線,サンダセン,神鉄三田線,Sanda Line,Sanda Line,三田线,산다선,#D53924,2,KB,,,,#DD0033,,,,HANSHIN,,,,0,99633,1275.15137 -99634,204,公園都市線,コウエントシセン,神鉄公園都市線,Koen-Toshi Line,Koen-Toshi Line,公园都市线,고엔토시선,#D53924,2,KB,,,,#DD0033,,,,HANSHIN,,,,0,99634,1435.16656 -99635,204,粟生線,アオセン,神鉄粟生線,Ao Line,Ao Line,粟生线,아오선,#D53924,2,KB,,,,#DD0033,,,,HANSHIN,,,,0,99635,1512.8307 -99636,211,神戸市営地下鉄北神線,コウベシエイチカテツホクシンセン,神戸市営地下鉄北神線,Kobe Municipal Subway Hokushin Line,Kobe Municipal Subway Hokushin Line,神户市营地铁北神线,고베 시영 지하철 호쿠신선,#D59A00,2,S,S,,,#01AF98,#01AF98,,,SQUARE,REVERSED_SQUARE_WEST,,,0,99636,7328.54641 -99637,206,山陽電鉄本線,サンヨウデンテツホンセン,山陽電鉄本線,Sanyo Electric Railway Main Line,Sanyo Electric Railway Main Line,山阳电铁本线,산요 전철 본선,#F45757,2,SY,,,,#ED1A3D,,,,SANYO,,,,0,99637,1280.1745 -99638,206,山陽電鉄網干線,サンヨウデンテツアボシセン,山陽電鉄網干線,Sanyo Electric Railway Aboshi Line,Sanyo Electric Railway Aboshi Line,山阳电铁网干线,산요 전철 아보시선,#F45757,2,SY,,,,#ED1A3D,,,,SANYO,,,,0,99638,1444.82485 -99615,207,能勢電鉄妙見線,ノセデンテツミョウケンセン,能勢電鉄妙見線,Nose Electric Railway Myoken Line,Nose Electric Railway Myoken Line,能势电铁妙见线,노세 전철 묘켄선,#B72142,2,NS,,,,#B72142,,,,REVERSED_ROUND,,,,0,99640,902.44973 -99640,207,能勢電鉄日生線,ノセデンテツニッセイセン,能勢電鉄日生線,Nose Electric Railway Nissei Line,Nose Electric Railway Nissei Line,能势电铁日生线,노세 전철 닛세이선,#B72142,2,NS,,,,#B72142,,,,REVERSED_ROUND,,,,0,99640,2478.49816 -99642,208,三木鉄道三木線,ミキテツドウミキセン,三木鉄道三木線,Miki Railway Miki Line,Miki Railway Miki Line,三木铁道三木线,미키 철도 미키선,#009CFF,2,,,,,,,,,,,,,2,99642,948.45333 -99643,209,北条鉄道北条線,ホウジョウテツドウホウジョウセン,北条鉄道北条線,Hojo Line,Hojo Line,北条铁道北条线,호조 철도 호조선,#7564D3,2,,,,,,,,,,,,,0,99643,1919.58856 -99644,210,智頭急行智頭線,チズキュウコウチズセン,智頭急行智頭線,Chizu Express Chizu Line,Chizu Express Chizu Line,智头急行智头线,지즈 급행 지즈선,#000099,2,,,,,,,,,,,,,0,99644,4299.89441 -99645,211,神戸市営地下鉄西神線,コウベシエイチカテツセイシンセン,神戸市営地下鉄西神線,Kobe Municipal Subway Seishin Line,Kobe Municipal Subway Seishin Line,神户市营地铁西神线,고베 시영 지하철 세이신선,#01AF98,3,S,,,,#01AF98,,,,REVERSED_SQUARE_WEST,,,,0,99645,1844.9049 -99646,211,神戸市営地下鉄山手線,コウベシエイチカテツヤマテセン,神戸市営地下鉄山手線,Kobe Municipal Subway Yamate Line,Kobe Municipal Subway Yamate Line,神户市营地铁山手线,고베 시영 지하철 야마테선,#01AF98,3,S,,,,#01AF98,,,,REVERSED_SQUARE_WEST,,,,0,99646,1083.42685 -99647,211,神戸市営地下鉄海岸線,コウベシエイチカテツカイガンセン,神戸市営地下鉄海岸線,Kobe Municipal Subway Kaigan Line,Kobe Municipal Subway Kaigan Line,神户市营地铁海岸线,고베 시영 지하철 가이간선,#0388C0,3,K,,,,#0388C0,,,,REVERSED_SQUARE_WEST,,,,0,99647,864.59592 -99648,212,ポートライナー,ポートライナー,神戸新交通ポートアイランド線,Port Liner,Port Liner,港湾人工岛线,포트 라이너,#9686BD,5,P,PL,,,#9686BD,#9686BD,,,REVERSED_SQUARE,REVERSED_SQUARE,,,0,99648,1147.16066 -99649,212,六甲ライナー,ロッコウライナー,神戸新交通六甲アイランド線,Rokko Liner,Rokko Liner,六甲人工岛线,롯코 라이너,#9686BD,5,R,,,,#9686BD,,,,REVERSED_SQUARE,,,,0,99649,893.11205 -99650,213,紀州鉄道線,キシュウテツドウセン,紀州鉄道線,Kishu Railway Line,Kishu Railway Line,纪州铁道线,기슈 철도선,#081042,2,,,,,,,,,,,,,0,99650,659.45614 -99651,214,貴志川線,キシガワセン,和歌山電鐵貴志川線,Kishigawa Line,Kishigawa Line,贵志川线,기시가와선,#DA381B,2,,,,,,,,,,,,,0,99651,1064.09728 -99701,215,若桜線,ワカサセン,若桜鉄道若桜線,Wakasa Line,Wakasa Line,若樱线,와카사선,#FF2F1A,2,,,,,,,,,,,,,0,99701,2342.28838 -99702,216,北松江線,キタマツエセン,一畑電車北松江線,Kita-Matsue Line,Kita-Matsue Line,北松江线,기타마쓰에선,#EB5C02,2,,,,,#EB5C02,,,,REVERSED_ROUND,,,,0,99702,1576.127 -99703,216,大社線,タイシャセン,一畑電車大社線,Taisha Line,Taisha Line,大社线,다이샤선,#EB5C02,2,,,,,,,,,,,,,0,99703,2059.70786 -99704,217,水島本線,ミズシマホンセン,水島臨海鉄道水島本線,Mizushima Main Line,Mizushima Main Line,水岛本线,미즈시마 본선,#3B82C5,2,MR,,,,#3B82C5,,,,REVERSED_ROUND,,,,0,99704,1170.384 -99705,218,井原線,イバラセン,井原鉄道井原線,Ibara Line,Ibara Line,井原线,이바라선,#00AD66,2,,,,,,,,,,,,,0,99705,2963.58483 -99706,219,東山線,ヒガシヤマセン,岡山電軌東山本線,Higashiyama Line,Higashiyama Line,东山线,히가시야마선,#EF1731,4,H,,,,#EF1731,,,,ROUND,,,,0,99706,401.54121 -99707,219,清輝橋線,セイキバシセン,岡山電軌清輝橋線,Seikibashi Line,Seikibashi Line,清辉桥线,세이키바시선,#07502B,4,S,,,,#07502B,,,,ROUND,,,,0,99707,321.09156 -99708,220,スカイレールみどり坂線,スカイレールミドリザカセン,広島短距離交通瀬野線,Skyrail Midorizaka Line,Skyrail Midorizaka Line,空中铁道绿坂线,스카이레일 미도리자카선,#F9F9F9,5,,,,,,,,,,,,,2,99708,651.30282 -99709,221,アストラムライン,アストラムライン,広島高速交通広島新交通1号線,Astram Line,Astram Line,新交通系统,아스트람 라인,#FFA500,5,,,,,,,,,,,,,0,99709,856.37782 -99710,222,広電1号線(宇品線),ヒロデンイチゴウセン,広電1号線(宇品線),Hiroden Ujina Line,Hiroden Ujina Line,广电1号线(宇品线),히로덴 1호선(우지나선),#FF5900,4,M,U,,,#00A85F,#0092D7,,,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,,,0,99710,385.93525 -99711,222,広電2号線(宮島線),ヒロデンニゴウセン,広電2号線(宮島線),Hiroden Miyajima Line,Hiroden Miyajima Line,广电2号线(宫岛线),히로덴 2호선(미야지마선),#EF1731,4,M,,,,#00A85F,,,,REVERSED_ROUND_HORIZONTAL,,,,0,99711,672.49032 -99712,222,広電3号線,ヒロデンサンゴウセン,広電3号線,Hiroden Streetcar Route 3,Hiroden Streetcar Route 3,广电3号线,히로덴 3호선,#4243BE,4,U,M,,,#0092D7,#00A85F,,,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,,0,99712,383.85101 -99713,222,広電5号線(皆実線),ヒロデンゴゴウセン,広電5号線(皆実線),Hiroden Minami Line,Hiroden Minami Line,广电5号线(皆实线),히로덴 5호선(미나미선),#00CC66,4,M,H,U,,#00A85F,#7DBF4C,#0092D7,,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,,0,99713,437.72286 -99714,222,広電6号線(江波線),ヒロデンロクゴウセン,広電6号線(江波線),Hiroden Eba Line,Hiroden Eba Line,广电6号线(江波线),히로덴 6호선(에바선),#FFCC00,4,E,M,,,#FEDB4F,#008033,,,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,,,0,99714,413.23367 -99715,222,広電7号線,ヒロデンナナゴウセン,広電7号線,Hiroden Streetcar Route 7,Hiroden Streetcar Route 7,广电7号线,히로덴 7호선,#005A52,4,Y,M,U,,#ED8095,#00A85F,#0092D7,,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,,0,99715,405.20802 -99716,222,広電8号線(横川線),ヒロデンハチゴウセン,広電8号線(横川線),Hiroden Yokogawa Line,Hiroden Yokogawa Line,广电8号线(横川线),히로덴 8호선(요코가와선),#DF60AE,4,Y,M,E,,#ED8095,#00A85F,#FEDB4F,,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,,0,99716,494.20631 -99717,222,広電9号線(白島線),ヒロデンキュウゴウセン,広電9号線(白島線),Hiroden Hakushima Line,Hiroden Hakushima Line,广电9号线(白岛线),히로덴 9호선(하쿠시마선),#797878,4,W,,,,#797878,,,,REVERSED_ROUND_HORIZONTAL,,,,0,99717,380.00763 -99718,223,錦川清流線,ニシキガワセイリュウセン,錦川鉄道錦川清流線,Nishikigawa Seiryu Line,Nishikigawa Seiryu Line,锦川清流线,니시키가와 세이류선,#E60010,2,,,,,,,,,,,,,0,99718,2660.86581 -99801,224,阿波室戸シーサイドライン,アワムロトシーサイドライン,阿佐海岸鉄道阿佐東線,Awa-Muroto Seaside Line,Awa-Muroto Seaside Line,阿波室户海滨线,아와무로토 시사이드 라인,#A5AEB4,2,AK,,,,#A5AEB4,,,,ROUND,,,,0,99801,3291.48155 -99802,225,琴電琴平線,コトデンコトヒラセン,琴電琴平線,Kotoden Kotohira Line,Kotoden Kotohira Line,琴电琴平线,고토덴 고토히라선,#FFD400,2,K,,,,#FFD400,,,,ROUND,,,,0,99802,1462.64871 -99803,225,琴電長尾線,コトデンナガオセン,琴電長尾線,Kotoden Nagao Line,Kotoden Nagao Line,琴电长尾线,고토덴 나가오선,#009966,2,N,,,,#009966,,,,ROUND,,,,0,99803,933.5494 -99804,225,琴電志度線,コトデンシドセン,琴電志度線,Kotoden Shido Line,Kotoden Shido Line,琴电志度线,고토덴 시도선,#FF3366,2,S,,,,#FF3366,,,,ROUND,,,,0,99804,812.09522 -99805,226,伊予鉄道郡中線,イヨテツドウグンチュウセン,伊予鉄道郡中線,Iyotetsu Gunchu Line,Iyotetsu Gunchu Line,伊予铁道郡中线,이요 철도 군추선,#F15A22,2,IY,,,,#F15A22,,,,REVERSED_ROUND,,,,0,99805,1021.3182 -99806,226,伊予鉄道高浜線,イヨテツドウタカハマセン,伊予鉄道高浜線,Iyotetsu Takahama Line,Iyotetsu Takahama Line,伊予铁道高浜线,이요 철도 다카하마선,#9ACD32,2,IY,,,,#9ACD32,,,,REVERSED_ROUND,,,,0,99806,985.13285 -99807,226,伊予鉄道横河原線,イヨテツドウヨコガワラセン,伊予鉄道横河原線,Iyotetsu Yokogawara Line,Iyotetsu Yokogawara Line,伊予铁道横河原线,이요 철도 요코가와라선,#00BBEE,2,IY,,,,#00BBEE,,,,REVERSED_ROUND,,,,0,99807,940.73597 -99808,226,伊予鉄道環状線(1系統),イヨテツドウカンジョウセン,伊予鉄道1系統,Iyotetsu Route 1 Loop Line,Iyotetsu Route 1 Loop Line,伊予铁道环状线(1系统),이요 철도 순환선(1계통),#CD6803,4,IY,,,,#CD6803,,,,REVERSED_ROUND,,,,0,99808,391.19973 -99809,226,伊予鉄道環状線(2系統),イヨテツドウカンジョウセン,伊予鉄道2系統,Iyotetsu Route 2 Loop Line,Iyotetsu Route 2 Loop Line,伊予铁道环状线(2系统),이요 철도 순환선(2계통),#CD6803,4,IY,,,,#CD6803,,,,REVERSED_ROUND,,,,0,99809,391.65867 -99810,226,伊予鉄道市駅線(3系統),イヨテツドウシエキセン,伊予鉄道3系統,Iyotetsu Route 3,Iyotetsu Route 3,伊予铁道市站线(3系统),이요 철도 시에키선(3계통),#CD6803,4,IY,,,,#CD6803,,,,REVERSED_ROUND,,,,0,99810,413.44857 -99811,226,伊予鉄道松山駅前線(5系統),イヨテツドウマツヤマエキマエセン,伊予鉄道5系統,Iyotetsu Route 5,Iyotetsu Route 5,伊予铁道松山站前线(5系统),이요 철도 마쓰야마에키마에선(5계통),#CD6803,4,IY,,,,#CD6803,,,,REVERSED_ROUND,,,,0,99811,402.24475 -99812,226,伊予鉄道本町線(6系統),イヨテツドウホンマチセン,伊予鉄道6系統,Iyotetsu Route 6,Iyotetsu Route 6,伊予铁道本町线(6系统),이요 철도 혼마치선(6계통),#CD6803,4,IY,,,,#CD6803,,,,REVERSED_ROUND,,,,0,99812,389.88748 -99814,227,中村線,ナカムラセン,土佐くろしお鉄道中村線,Nakamura Line,Nakamura Line,中村线,나카무라선,#32455C,2,TK,,,,#32455C,,,,ROUND,,,,0,99814,3023.55505 -99815,227,宿毛線,スクモセン,土佐くろしお鉄道宿毛線,Sukumo Line,Sukumo Line,宿毛线,스쿠모선,#32455C,2,TK,,,,#32455C,,,,ROUND,,,,0,99815,3398.58428 -99816,227,ごめん・なはり線,ゴメン・ナハリセン,土佐くろしお鉄道ごめん・なはり線,Gomen-Nahari Line,Gomen-Nahari Line,后免・奈半利线,고멘·나하리선,#32455C,2,GN,,,,#A5AEB4,,,,ROUND,,,,0,99816,2077.70167 -99817,228,ごめん線,ゴメンセン,土佐電鉄ごめん線,Gomen Line,Gomen Line,后免线,고멘선,#2A9A38,4,,,,,,,,,,,,,0,99817,418.60311 -99818,228,伊野線,イノセン,土佐電鉄伊野線,Ino Line,Ino Line,伊野线,이노선,#2A9A38,4,,,,,,,,,,,,,0,99818,417.13513 -99819,228,桟橋線,サンバシセン,土佐電鉄桟橋線,Sambashi Line,Sambashi Line,栈桥线,산바시선,#2A9A38,4,,,,,,,,,,,,,0,99819,342.85359 -99901,229,甘木鉄道甘木線,アマギテツドウアマギセン,甘木鉄道甘木線,Amagi Railway,Amagi Railway,甘木铁道甘木线,아마기 철도 아마기선,#D43A2A,2,,,,,,,,,,,,,0,99901,1340.75892 -99902,230,伊田線,イダセン,平成筑豊鉄道伊田線,Ida Line,Ida Line,伊田线,이다선,#FF9900,2,HC,,,,#FF9900,,,,HALF_SQUARE,,,,0,99902,1118.3009 -99903,230,糸田線,イトダセン,平成筑豊鉄道糸田線,Itoda Line,Itoda Line,系田线,이토다선,#99CC00,2,HC,,,,#FF9900,,,,HALF_SQUARE,,,,0,99903,1349.80057 -99904,230,田川線,タガワセン,平成筑豊鉄道田川線,Tagawa Line,Tagawa Line,田川线,다가와선,#4DBBFF,2,,,,,,,,,,,,,0,99904,1608.54241 -99928,230,門司港レトロ観光線,モジコウレトロカンコウセン,平成筑豊鉄道門司港レトロ観光線,Mojiko Retro Scenic Line,Mojiko Retro Scenic Line,门司港怀旧观光线,모지코 레트로 관광선,#476FC1,2,,,,,,,,,,,,,0,99904,655.42319 -99905,231,福岡市営地下鉄空港線,フクオカシエイチカテツクウコウセン,福岡市営地下鉄空港線,Fukuoka City Subway Airport Line,Fukuoka City Subway Airport Line,福冈市营地铁机场线,후쿠오카 시영 지하철 공항선,#FFA500,3,K,,,,#FFA500,,,,ROUND,,,,0,99905,1056.94017 -99906,231,福岡市営地下鉄箱崎線,フクオカシエイチカテツハコザキセン,福岡市営地下鉄箱崎線,Fukuoka City Subway Hakozaki Line,Fukuoka City Subway Hakozaki Line,福冈市营地铁箱崎线,후쿠오카 시영 지하철 하코자키선,#00BFFF,3,H,,,,#00BFFF,,,,ROUND,,,,0,99906,811.72308 -99907,231,福岡市営地下鉄七隈線,フクオカシエイチカテツナナクマセン,福岡市営地下鉄七隈線,Fukuoka City Subway Nanakuma Line,Fukuoka City Subway Nanakuma Line,福冈市营地铁七隈线,후쿠오카 시영 지하철 나나쿠마선,#228B22,3,N,,,,#228B22,,,,ROUND,,,,0,99907,789.83764 -99908,232,北九州モノレール,キタキュウシュウモノレール,北九州高速鉄道,Kitakyushu Monorail,Kitakyushu Monorail,北九州单轨电车,기타큐슈 모노레일,#40BFE8,5,,,,,,,,,,,,,0,99908,729.89416 -99909,233,筑豊電気鉄道線,チクホウデンキテツドウセン,筑豊電気鉄道線,Chikuho Electric Railroad Line,Chikuho Electric Railroad Line,筑丰电气铁道线,지쿠호 전기 철도선,#E30075,2,CK,,,,#E30075,,,,HALF_SQUARE,,,,0,99909,791.53533 -99910,234,西九州線,ニシキュウシュウセン,松浦鉄道西九州線,Nishi-Kyushu Line,Nishi-Kyushu Line,西九州线,니시큐슈선,#0080FF,2,,,,,,,,,,,,,0,99910,1250.88679 -99911,234,西九州線,ニシキュウシュウセン,松浦鉄道西九州線,Nishi-Kyushu Line,Nishi-Kyushu Line,西九州线,니시큐슈선,#0080FF,2,,,,,,,,,,,,,0,99911,1695.1834 -99912,235,島原鉄道線,シマバラテツドウセン,島原鉄道線,Shimabara Railway Line,Shimabara Railway Line,岛原铁道线,시마바라 철도선,#FEE633,2,,,,,,,,,,,,,0,99912,1838.85554 -99913,236,長崎電軌1系統,ナガサキデンキイチゴウケイトウ,長崎電軌1系統,Nagasaki Electric Tramway Route 1,Nagasaki Electric Tramway Route 1,长崎电轨1系统,나가사키 전기궤도 1계통,#4243BE,4,,,,,,,,,,,,,0,99913,350.09157 -99914,236,長崎電軌3系統,ナガサキデンキサンゴウケイトウ,長崎電軌3系統,Nagasaki Electric Tramway Route 3,Nagasaki Electric Tramway Route 3,长崎电轨3系统,나가사키 전기궤도 3계통,#EF1731,4,,,,,,,,,,,,,0,99914,396.11844 -99915,236,長崎電軌4系統,ナガサキデンキヨンゴウケイトウ,長崎電軌4系統,Nagasaki Electric Tramway Route 4,Nagasaki Electric Tramway Route 4,长崎电轨4系统,나가사키 전기궤도 4계통,#FFCC00,4,,,,,,,,,,,,,0,99915,378.80477 -99916,236,長崎電軌5系統,ナガサキデンキゴゴウケイトウ,長崎電軌5系統,Nagasaki Electric Tramway Route 5,Nagasaki Electric Tramway Route 5,长崎电轨5系统,나가사키 전기궤도 5계통,#005A52,4,,,,,,,,,,,,,0,99916,364.66745 -99917,237,熊本電鉄本線,クマモトデンテツホンセン,熊本電鉄本線,Kumamoto Electric Railway Main Line,Kumamoto Electric Railway Main Line,熊本电铁本线,구마모토 전철 본선,#7B0D27,2,KD,,,,#BE302C,,,,SQUARE,,,,0,99917,785.60254 -99918,237,熊本電鉄上熊本線,クマモトデンテツカミクマモトセン,熊本電鉄上熊本線,Kumamoto Electric Railway Kami-Kumamoto Line,Kumamoto Electric Railway Kami-Kumamoto Line,熊本电铁上熊本线,구마모토 전철 가미쿠마모토선,#7B0D27,2,KD,,,,#BE302C,,,,SQUARE,,,,0,99918,655.3384 -99919,238,高森線,タカモリセン,南阿蘇鉄道高森線,Takamori Line,Takamori Line,高森线,다카모리선,#138068,2,,,,,,,,,,,,,0,99919,1923.0291 -99920,239,湯前線,ユノマエセン,くま川鉄道湯前線,Yunomae Line,Yunomae Line,汤前线,유노마에선,#153C36,2,,,,,,,,,,,,,0,99920,1872.97933 -99921,240,肥薩おれんじ鉄道線,ヒサツオレンジテツドウセン,肥薩おれんじ鉄道線,Hisatsu Orange Railway,Hisatsu Orange Railway,肥萨橙铁道线,히사쓰 오렌지 철도선,#FFA500,2,OR,,,,#FFA500,,,,ROUND,,,,0,99921,4285.529 -99922,241,熊本市電A系統,クマモトシデンエーライン,熊本市電A系統,Kumamoto City Tram Route A,Kumamoto City Tram Route A,熊本市电A系统,구마모토 시덴 A계통,#FF0000,4,A,,,,#FF0000,,,,REVERSED_SQUARE,,,,0,99922,444.53072 -99923,241,熊本市電B系統,クマモトシデンビーライン,熊本市電B系統,Kumamoto City Tram Route B,Kumamoto City Tram Route B,熊本市电B系统,구마모토 시덴 B계통,#0000FF,4,B,,,,#0000FF,,,,REVERSED_SQUARE,,,,0,99923,375.32687 -99925,242,鹿児島市電1系統,カゴシマシデンイチケイトウ,鹿児島市電1系統,Kagoshima City Tram Route 1,Kagoshima City Tram Route 1,鹿儿岛市电1系统,가고시마 시덴 1계통,#4243BE,4,I,,,,#4243BE,,,,REVERSED_ROUND,,,,0,99925,419.36632 -99926,242,鹿児島市電2系統,カゴシマシデンニケイトウ,鹿児島市電2系統,Kagoshima City Tram Route 2,Kagoshima City Tram Route 2,鹿儿岛市电2系统,가고시마 시덴 2계통,#EF1731,4,N,,,,#EF1731,,,,REVERSED_ROUND,,,,0,99926,367.48816 -99927,243,ゆいレール,ユイレール,沖縄都市モノレール線,Yui Rail,Yui Rail,冲绳都市单轨电车,유이레일,#CC0000,5,,,,,#CC0000,,,,MONOCHROME_ROUND,,,,0,99927,875.63476 +line_cd,company_cd,line_name,line_name_k,line_name_h,line_name_r,line_name_rn,line_name_zh,line_name_ko,line_color_c,line_type,line_symbol1,line_symbol2,line_symbol3,line_symbol4,line_symbol1_color,line_symbol2_color,line_symbol3_color,line_symbol4_color,line_symbol1_shape,line_symbol2_shape,line_symbol3_shape,line_symbol4_shape,e_status,e_sort,average_distance +1001,3,中央新幹線,チュウオウシンカンセン,中央新幹線,Chuo Shinkansen,Chuo Shinkansen,中央新干线,주오 신칸센,#000000,1,,,,,,,,,NOOP,,,,1,1001,0 +1002,3,東海道新幹線,トウカイドウシンカンセン,東海道新幹線,Tokaido Shinkansen,Tokaido Shinkansen,东海道新干线,도카이도 신칸센,#0000FF,1,,,,,,,,,NOOP,,,,0,1002,31664.84112 +1003,4,山陽新幹線,サンヨウシンカンセン,山陽新幹線,Sanyo Shinkansen,Sanyo Shinkansen,山阳新干线,산요 신칸센,#0000FF,1,,,,,,,,,NOOP,,,,0,1003,30686.38868 +1004,2,東北新幹線,トウホクシンカンセン,東北新幹線,Tōhoku Shinkansen,Tohoku Shinkansen,东北新干线,도호쿠 신칸센,#008000,1,,,,,,,,,NOOP,,,,0,1004,30711.08884 +1005,2,上越新幹線,ジョウエツシンカンセン,上越新幹線,Joetsu Shinkansen,Joetsu Shinkansen,上越新干线,조에쓰 신칸센,#008000,1,,,,,,,,,NOOP,,,,0,1005,27350.8261 +1006,2,上越新幹線(ガーラ湯沢支線),ジョウエツシンカンセン,上越新幹線(ガーラ湯沢支線),Joetsu Shinkansen,Joetsu Shinkansen,上越新干线,조에쓰 신칸센,#008000,1,,,,,,,,,NOOP,,,,0,1006,1883.81759 +1007,2,山形新幹線,ヤマガタシンカンセン,山形新幹線,Yamagata Shinkansen,Yamagata Shinkansen,山形新干线,야마가타 신칸센,#FFA030,1,,,,,,,,,NOOP,,,,0,1007,14868.12368 +1008,2,秋田新幹線,アキタシンカンセン,秋田新幹線,Akita Shinkansen,Akita Shinkansen,秋田新干线,아키타 신칸센,#FF0080,1,,,,,,,,,NOOP,,,,0,1008,25377.10815 +1009,2,北陸新幹線,ホクリクシンカンセン,北陸新幹線,Hokuriku Shinkansen,Hokuriku Shinkansen,北陆新干线,호쿠리쿠 신칸센,#008000,1,,,,,,,,,NOOP,,,,0,1009,25170.74968 +1010,6,九州新幹線,キュウシュウシンカンセン,九州新幹線,Kyushu Shinkansen,Kyushu Shinkansen,九州新干线,규슈 신칸센,#FF0000,1,,,,,,,,,NOOP,,,,0,1010,23348.86657 +1011,1,北海道新幹線,ホッカイドウシンカンセン,北海道新幹線,Hokkaido Shinkansen,Hokkaido Shinkansen,北海道新干线,홋카이도 신칸센,#6E5CA5,1,,,,,,,,,NOOP,,,,0,1011,49638.47771 +1012,6,西九州新幹線,ニシキュウシュウシンカンセン,西九州新幹線,Nishi-Kyushu Shinkansen,Nishi-Kyushu Shinkansen,西九州新干线,니시큐슈 신칸센,#E10017,1,,,,,,,,,NOOP,,,,0,1012,16460.66246 +11101,1,函館本線,ハコダテホンセン,函館本線,Hakodate Main Line,Hakodate Main Line,函馆本线,하코다테 본선,#0072BC,2,H,N,,,#0072BC,#0072BC,,,ROUND,ROUND,,,0,11101,5751.21755 +11102,1,函館本線,ハコダテホンセン,函館本線,Hakodate Main Line,Hakodate Main Line,函馆本线,하코다테 본선,#ED1C23,2,S,H,,,#ED1C23,#0072BC,,,ROUND,ROUND,,,0,11102,8706.85948 +11103,1,函館本線,ハコダテホンセン,函館本線,Hakodate Main Line,Hakodate Main Line,函馆本线,하코다테 본선,#F7931D,2,A,H,,S,#F7931D,#0072BC,#F7931D,#ED1C23,ROUND,ROUND,MONOCHROME_ROUND,ROUND,0,11103,4242.70521 +11104,1,室蘭本線,ムロランホンセン,室蘭本線,Muroran Main Line,Muroran Main Line,室兰本线,무로란 본선,#0072BC,2,H,M,,,#0072BC,#0072BC,,,ROUND,ROUND,,,0,11104,4663.48446 +11105,1,室蘭本線,ムロランホンセン,室蘭本線,Muroran Main Line,Muroran Main Line,室兰本线,무로란 본선,#808080,2,H,K,A,,#0072BC,#8CC63E,#F7931D,,ROUND,ROUND,ROUND,,0,11105,5799.95676 +11106,1,根室本線,ネムロホンセン,根室本線,Nemuro Main Line,Nemuro Main Line,根室本线,네무로 본선,#F6989D,2,T,K,A,,#F6989D,#8CC63E,#F7931D,,ROUND,ROUND,ROUND,,0,11106,7771.24051 +11107,1,根室本線,ネムロホンセン,根室本線,Nemuro Main Line,Nemuro Main Line,根室本线,네무로 본선,#8CC63E,2,K,,,,#8CC63E,,,,ROUND,,,,0,11107,7120.01641 +11108,1,花咲線,ハナサキセン,根室本線,Hanasaki Line,Hanasaki Line,花咲线,하나사키선,#808080,2,K,B,,,#8CC63E,#EF59A1,,,ROUND,ROUND,,,0,11108,8394.29526 +11109,1,千歳線,チトセセン,千歳線,Chitose Line,Chitose Line,千岁线,지토세선,#00B2EB,2,H,AP,,,#0072BC,#00B2EB,#00B2EB,,ROUND,ROUND,MONOCHROME_ROUND,,0,11109,4658.0034 +11110,1,石勝線,セキショウセン,石勝線,Sekisho Main Line,Sekisho Main Line,石胜线,세키쇼선,#8CC63E,2,K,H,Y,,#8CC63E,#0072BC,#8CC63E,,ROUND,ROUND,ROUND,,0,11110,21622.86655 +11111,1,日高本線,ヒダカホンセン,日高本線,Hidaka Main Line,Hidaka Main Line,日高本线,히다카 본선,#808080,2,H,,,,#0072BC,,,,ROUND,,,,0,11111,10690.53366 +11112,1,札沼線,サッショウセン,札沼線,Sassho Line,Sassho Line,札沼线,삿쇼선,#00A54F,2,G,S,,,#00A54F,#ED1C23,#00A54F,,ROUND,ROUND,MONOCHROME_ROUND,,0,11112,2132.35164 +11113,1,留萌本線,ルモイホンセン,留萌本線,Rumoi Main Line,Rumoi Main Line,留萌本线,루모이 본선,#808080,2,,,,,,,,,,,,,2,11113,3301.27079 +11114,1,富良野線,フラノセン,富良野線,Furano Line,Furano Line,富良野线,후라노선,#AA5EA6,2,F,A,T,,#AA5EA6,#F7931D,#F6989D,,ROUND,ROUND,ROUND,,0,11114,3534.04987 +11115,1,宗谷本線,ソウヤホンセン,宗谷本線,Soya Main Line,Soya Main Line,宗谷本线,소야 본선,#954A35,2,W,A,,,#954A35,#F7931D,,,ROUND,ROUND,,,0,11115,7559.48998 +11116,1,石北本線,セキホクホンセン,石北本線,Sekihoku Main Line,Sekihoku Main Line,石北本线,세키호쿠 본선,#F7931D,2,A,,,,#F7931D,,,,ROUND,,,,0,11116,7365.37104 +11117,1,釧網本線,センモウホンセン,釧網本線,Senmo Main Line,Senmo Main Line,钏网本线,센모 본선,#EF59A1,2,B,A,K,,#EF59A1,#F7931D,#8CC63E,,ROUND,ROUND,ROUND,,0,11117,7458.97654 +11118,1,海峡線,カイキョウセン,海峡線,Kaikyo Line,Kaikyo Line,海峡线,가이쿄선,#808080,2,,,,,,,,,,,,,0,11118,41415.71645 +11119,1,江差線,エサシセン,江差線,Esashi Line,Esashi Line,江差线,에사시선,#808080,2,,,,,,,,,,,,,2,11119,4927.03676 +11201,2,東北本線,トウホクホンセン,東北本線,Tohoku Main Line,Tohoku Main Line,东北本线,도호쿠 본선,#3CB371,2,,,,,,,,,,,,,2,11201,0 +11202,2,奥羽本線,オウウホンセン,奥羽本線,Ou Main Line,Ou Main Line,奥羽本线,오우 본선,#FF6600,2,,,,,,,,,,,,,0,11202,5078.81003 +11231,2,東北本線,トウホクホンセン,東北本線,Tohoku Main Line,Tohoku Main Line,东北本线,도호쿠 본선,#3CB371,2,,,,,,,,,,,,,0,11202,4941.34332 +11203,2,はまなすベイライン大湊線,ハマナスベイラインオオミナトセン,大湊線,Ominato Line,Ominato Line,大凑线,오미나토선,#F1AA28,2,,,,,,,,,,,,,0,11203,5783.7144 +11204,2,五能線,ゴノウセン,五能線,Gono Line,Gono Line,五能线,고노선,#0000FF,2,,,,,,,,,,,,,0,11204,3709.8911 +11205,2,津軽線,ツガルセン,津軽線,Tsugaru Line,Tsugaru Line,津轻线,쓰가루선,#00B2E5,2,,,,,,,,,,,,,0,11205,3231.67465 +11206,2,八戸線,ハチノヘセン,八戸線,Hachinohe Line,Hachinohe Line,八户线,하치노헤선,#FF0000,2,,,,,,,,,,,,,0,11206,2775.18494 +11207,2,岩泉線,イワイズミセン,岩泉線,Iwaizumi Line,Iwaizumi Line,岩泉线,이와이즈미선,#808080,2,,,,,,,,,,,,,2,11207,5029.38286 +11208,2,ドラゴンレール大船渡線,ドラゴンレールオオフナトセン,大船渡線,Ofunato Line,Ofunato Line,大船渡线,오후나토선,#FF6600,2,,,,,,,,,,,,,0,11208,4676.41919 +11209,2,銀河ドリームライン釜石線,ギンガドリームラインカマイシセン,釜石線,Kamaishi Line,Kamaishi Line,釜石线,가마이시선,#3399FF,2,,,,,,,,,,,,,0,11209,3833.74466 +11210,2,北上線,キタカミセン,北上線,Kitakami Line,Kitakami Line,北上线,기타카미선,#9966FF,2,,,,,,,,,,,,,0,11210,4298.02779 +11211,2,田沢湖線,タザワコセン,田沢湖線,Tazawako Line,Tazawako Line,田泽湖线,다자와코선,#CC00CC,2,,,,,,,,,,,,,0,11211,4404.27879 +11212,2,十和田八幡平四季彩ライン,トワダハチマンタイシキサイライン,花輪線,Hanawa Line,Hanawa Line,花轮线,하나와선,#FF0000,2,,,,,,,,,,,,,0,11212,4057.91742 +11213,2,山田線,ヤマダセン,山田線,Yamada Line,Yamada Line,山田线,야마다선,#A52A2A,2,,,,,,,,,,,,,0,11213,7119.63504 +11214,2,羽越本線,ウエツホンセン,羽越本線,Uetsu Main Line,Uetsu Main Line,羽越本线,우에쓰 본선,#16C0E9,2,,,,,,,,,,,,,0,11214,4527.50896 +11215,2,男鹿線,オガセン,男鹿線,Oga Line,Oga Line,男鹿线,오가선,#008000,2,,,,,,,,,,,,,0,11215,3258.95101 +11216,2,山形線,ヤマガタセン,奥羽本線,Ou Main Line,Ou Main Line,奥羽本线,오우 본선,#FF6600,2,,,,,,,,,,,,,0,11216,4347.80555 +11217,2,仙山線,センザンセン,仙山線,Senzan Line,Senzan Line,仙山线,센잔선,#77DD00,2,,,,,,,,,,,,,0,11217,3260.49073 +11218,2,フルーツライン左沢線,フルーツラインアテラザワセン,左沢線,Aterazawa Line,Aterazawa Line,左泽线,아테라자와선,#87CEEB,2,,,,,,,,,,,,,0,11218,2342.45187 +11219,2,米坂線,ヨネサカセン,米坂線,Yonesaka Line,Yonesaka Line,米坂线,요네사카선,#9E7EB9,2,,,,,,,,,,,,,0,11219,4748.5509 +11220,2,奥の細道最上川ライン,オクノホソミチモガミガワライン,陸羽西線,Riku-West Line,Riku-West Line,陆羽西线,리쿠우사이선,#32CD32,2,,,,,,,,,,,,,0,11220,4722.99873 +11221,2,奥の細道湯けむりライン,オクノホソミチユケムリライン,陸羽東線,Riku-East Line,Riku-East Line,陆羽东线,리쿠우토선,#888888,2,,,,,,,,,,,,,0,11221,3579.42511 +11222,2,仙石線,センセキセン,仙石線,Senseki Line,Senseki Line,仙石线,센세키선,#00AAEE,2,,,,,,,,,,,,,0,11222,1540.61707 +11223,2,石巻線,イシノマキセン,石巻線,Ishinomaki Line,Ishinomaki Line,石卷线,이시노마키선,#FF8888,2,,,,,,,,,,,,,0,11223,3387.61695 +11224,2,気仙沼線,ケセンヌマセン,気仙沼線,Kesennuma Line,Kesennuma Line,气仙沼线,게센누마선,#6600CC,2,,,,,,,,,,,,,0,11224,3455.74637 +11225,2,磐越西線,バンエツサイセン,磐越西線,Ban-etsu-West Line,Ban-etsu-West Line,磐越西线,반에쓰사이선,#CB7B35,2,,,,,,,,,,,,,0,11225,4271.66886 +11226,2,森と水とロマンの鉄道,モリトミズトロマンノテツドウ,磐越西線,Ban-etsu-West Line,Ban-etsu-West Line,磐越西线,반에쓰사이선,#CB7B35,2,,,,,,,,,,,,,0,11226,4093.05313 +11227,2,只見線,タダミセン,只見線,Tadami Line,Tadami Line,只见线,다다미선,#008DD1,2,,,,,,,,,,,,,0,11227,3796.92669 +11228,2,ゆうゆうあぶくまライン,ユウユウアブクマライン,磐越東線,Ban-etsu-East Line,Ban-etsu-East Line,磐越东线,반에쓰토선,#C71585,2,,,,,,,,,,,,,0,11228,5641.37369 +11229,2,常磐線,ジョウバンセン,常磐線,Joban Line,Joban Line,常磐线,조반선,#007AC0,2,JJ,,,,#00B261,,,,SQUARE,,,,0,11229,5041.85031 +11230,2,常磐線,ジョウバンセン,常磐線,Joban Line,Joban Line,常磐线,조반선,#007AC0,2,,,,,,,,,,,,,0,11230,4422.90225 +11301,2,東海道線,トウカイドウセン,東海道本線,Tokaido Line,Tokaido Line,东海道线,도카이도선,#F68B1E,2,JT,,,,#F68B1E,,,,SQUARE,,,,0,11301,5164.31735 +11302,2,山手線,ヤマノテセン,山手線,Yamanote Line,Yamanote Line,山手线,야마노테선,#80C241,2,JY,,,,#80C241,,,,SQUARE,,,,0,11302,1093.73663 +11303,2,南武線,ナンブセン,南武線,Nambu Line,Nambu Line,南武线,난부선,#FFD400,2,JN,,,,#FFD400,,,,SQUARE,,,,0,11303,1476.10425 +11304,2,鶴見線,ツルミセン,鶴見線,Tsurumi Line,Tsurumi Line,鹤见线,쓰루미선,#FFD400,2,JI,,,,#FFD400,,,,SQUARE,,,,0,11304,938.19048 +11305,2,武蔵野線,ムサシノセン,武蔵野線,Musashino Line,Musashino Line,武藏野线,무사시노선,#F15A22,2,JM,,,,#F15A22,,,,SQUARE,,,,0,11305,2846.26108 +11306,2,横浜線,ヨコハマセン,横浜線,Yokohama Line,Yokohama Line,横滨线,요코하마선,#80C241,2,JH,,,,#80C241,,,,SQUARE,,,,0,11306,2198.034 +11307,2,根岸線,ネギシセン,根岸線,Negishi Line,Negishi Line,根岸线,네기시선,#00B2E5,2,JK,,,,#00B2E5,,,,SQUARE,,,,0,11307,1900.95746 +11308,2,横須賀線,ヨコスカセン,横須賀線,Yokosuka Line,Yokosuka Line,横须贺线,요코스카선,#0067C0,2,JO,,,,#0067C0,,,,SQUARE,,,,0,11308,4353.0478 +11309,2,相模線,サガミセン,相模線,Sagami Line,Sagami Line,相模线,사가미선,#009793,2,,,,,,,,,,,,,0,11309,1898.70754 +11311,2,中央本線,チュウオウホンセン,中央本線,Chuo Line,Chuo Line,中央本线,주오 본선,#007AC0,2,JC,CO,,,#F15A22,#007AC0,,,SQUARE,SQUARE,,,0,11311,5007.67526 +11312,2,中央線(快速),チュウオウセン,中央線(快速),Chuo Line,Chuo Line,中央线,츄오선,#F15A22,2,JC,JB,,,#F15A22,,,,SQUARE,,,,0,11312,1691.40943 +11313,2,中央・総武線,チュウオウ・ソウブセン,中央・総武緩行線,Chuo-Sobu Line,Chuo-Sobu Line,中央・总武线,주오·소부선,#FFD400,2,JB,,,,#FFD400,,,,SQUARE,,,,0,11313,1565.82827 +11314,2,総武本線,ソウブホンセン,総武本線,Sobu Main Line,Sobu Main Line,总武本线,소부 본선,#0067C0,2,JO,,,,#0067C0,,,,SQUARE,,,,0,11314,3955.34259 +11315,2,青梅線,オウメセン,青梅線,Ome Line,Ome Line,青梅线,오메선,#F15A22,2,JC,,,,#F15A22,,,,SQUARE,,,,0,11315,1493.49082 +11316,2,五日市線,イツカイチセン,五日市線,Itsukaichi Line,Itsukaichi Line,五日市线,이쓰카이치선,#F15A22,2,JC,,,,#F15A22,,,,SQUARE,,,,0,11316,1820.96922 +11317,2,八高線,ハチコウセン,八高線,Hachiko Line,Hachiko Line,八高线,하치코선,#A8A39D,2,,,,,,,,,,,,,0,11317,3830.46342 +11318,2,八高線,ハチコウセン,八高線,Hachiko Line,Hachiko Line,八高线,하치코선,#A8A39D,2,,,,,,,,,,,,,0,11318,4296.49117 +11319,2,宇都宮線,ウツノミヤセン,東北本線,Utsunomiya Line,Utsunomiya Line,宇都宫线,우쓰노미야선,#F68B1E,2,JU,,,,#F68B1E,,,,SQUARE,,,,0,11319,4937.52562 +11320,2,常磐快速線,ジョウバンカイソクセン,常磐線,Joban Rapid Line,Joban Rapid Line,常磐快速线,조반 쾌속선,#00B261,2,JJ,JL,,,#00B261,#A2A9B1,,,SQUARE,SQUARE,,,0,11320,2164.62731 +11321,2,埼京線,サイキョウセン,埼京線,Saikyo Line,Saikyo Line,埼京线,사이쿄선,#00B48D,2,JA,,,,#00B48D,,,,SQUARE,,,,0,11321,2025.61314 +11322,2,川越線,カワゴエセン,川越線,Kawagoe Line,Kawagoe Line,川越线,가와고에선,#00B48D,2,JA,,,,#00B48D,,,,SQUARE,,,,0,11322,3030.1817 +11323,2,高崎線,タカサキセン,高崎線,Takasaki Line,Takasaki Line,高崎线,다카사키선,#F68B1E,2,JU,,,,#F68B1E,,,,SQUARE,,,,0,11323,4385.72588 +11324,2,外房線,ソトボウセン,外房線,Sotobo Line,Sotobo Line,外房线,소토보선,#DB4028,2,,,,,,,,,,,,,0,11324,3514.60159 +11325,2,内房線,ウチボウセン,内房線,Uchibo Line,Uchibo Line,内房线,우치보선,#00B9F1,2,,,,,,,,,,,,,0,11325,3926.9682 +11326,2,京葉線,ケイヨウセン,京葉線,Keiyo Line,Keiyo Line,京叶线,게이요선,#C9242F,2,JE,JM,,,#C9242F,#F15A22,,,SQUARE,SQUARE,,,0,11326,2857.30509 +11327,2,成田線,ナリタセン,成田線,Narita Line,Narita Line,成田线,나리타선,#00B261,2,JO,,,,#007AC0,,,,SQUARE,,,,0,11327,7886.443 +11328,2,成田エクスプレス,ナリタエクスプレス,成田エクスプレス,Narita Express,Narita Express,成田特快,나리타 익스프레스,#F61E21,2,,,,,,,,,,,,,3,11328,13509.35879 +11329,2,鹿島線,カシマセン,鹿島線,Kashima Line,Kashima Line,鹿岛线,가시마선,#C56E2E,2,,,,,,,,,,,,,0,11329,3447.19874 +11330,2,久留里線,クルリセン,久留里線,Kururi Line,Kururi Line,久留里线,구루리선,#00B5AD,2,,,,,,,,,,,,,0,11330,2414.17796 +11331,2,東金線,トウガネセン,東金線,Togane Line,Togane Line,东金线,도가네선,#F15A22,2,,,,,,,,,,,,,0,11331,3550.70015 +11332,2,京浜東北線,ケイヒントウホクセン,京浜東北線,Keihin-Tohoku Line,Keihin-Tohoku Line,京滨东北线,게이힌 도호쿠선,#00B2E5,2,JK,,,,#00B2E5,,,,SQUARE,,,,0,11332,1664.92567 +11333,2,湘南新宿ライン,ショウナンシンジュクライン,湘南新宿ライン,Shonan-Shinjuku Line,Shonan-Shinjuku Line,湘南新宿线,쇼난 신주쿠 라인,#F68B1E,2,JS,,,,#E31F26,,,,SQUARE,,,,0,11333,5629.19034 +11343,2,上野東京ライン,ウエノトウキョウライン,上野東京ライン,Ueno-Tokyo Line,Ueno-Tokyo Line,上野东京线,우에노 도쿄 라인,#F68B1E,2,JU,,,,#F68B1E,,,,SQUARE,,,,0,11333,3743.43366 +11334,2,烏山線,カラスヤマセン,烏山線,Karasuyama Line,Karasuyama Line,乌山线,가라스야마선,#008000,2,,,,,,,,,,,,,0,11334,2829.27266 +11335,2,吾妻線,アガツマセン,吾妻線,Agatsuma Line,Agatsuma Line,吾妻线,아가쓰마선,#0F5474,2,,,,,,,,,,,,,0,11335,3177.68477 +11337,2,信越本線,シンエツホンセン,信越本線,Shin’etsu Main Line,Shin’etsu Main Line,信越本线,신에쓰 본선,#9ACD32,2,,,,,,,,,,,,,0,11337,4071.18638 +11338,2,水郡線,スイグンセン,水郡線,Suigun Line,Suigun Line,水郡线,스이군선,#008000,2,,,,,,,,,,,,,0,11338,3667.0013 +11339,2,水戸線,ミトセン,水戸線,Mito Line,Mito Line,水户线,미토선,#3333FF,2,,,,,,,,,,,,,0,11339,3317.11634 +11340,2,日光線,ニッコウセン,日光線,Nikko Line,Nikko Line,日光线,닛코선,#880022,2,,,,,,,,,,,,,0,11340,6702.69079 +11341,2,両毛線,リョウモウセン,両毛線,Ryomo Line,Ryomo Line,两毛线,료모선,#FFD400,2,,,,,,,,,,,,,0,11341,4866.83608 +11342,2,上越線,ジョウエツセン,上越線,Joetsu Line,Joetsu Line,上越线,조에쓰선,#00B3E6,2,,,,,,,,,,,,,0,11342,4871.4962 +11344,2,常磐線,ジョウバンセン,常磐線(緩行線),Joban Line,Joban Line,常磐线,조반선,#A2A9B1,2,JL,,,,#A2A9B1,,,,SQUARE,,,,0,11345,2263.86009 +11345,100,ディズニーリゾートライン,ディズニーリゾートライン,ディズニーリゾートライン,Disney Resort Line,Disney Resort Line,迪士尼度假区线,디즈니 리조트 라인,#004499,5,,,,,,,,,,,,,0,11343,1389.03537 +11401,2,小海線,コウミセン,小海線,Koumi Line,Koumi Line,小海线,고우미선,#008000,2,,,,,,,,,,,,,0,11401,2560.68727 +11402,3,身延線,ミノブセン,身延線,Minobu Line,Minobu Line,身延线,미노부선,#6F2D98,2,CC,,,,#6F2D98,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11402,2271.65832 +11403,2,信越本線,シンエツホンセン,信越本線,Shin’etsu Main Line,Shin’etsu Main Line,信越本线,신에쓰 본선,#00B3E6,2,SE,,,,#00B3E6,,,,SQUARE,,,,0,11403,2304.32432 +11404,2,信越本線,シンエツホンセン,信越本線,Shin’etsu Main Line,Shin’etsu Main Line,信越本线,신에쓰 본선,#00B3E6,2,,,,,,,,,,,,,0,11404,3296.32902 +11405,4,北陸本線,ホクリクホンセン,北陸本線,Hokuriku Main Line,Hokuriku Main Line,北陆本线,호쿠리쿠 본선,#FFD400,2,,,,,,,,,,,,,2,11405,0 +11406,2,白新線,ハクシンセン,白新線,Hakushin Line,Hakushin Line,白新线,하쿠신선,#F387B7,2,,,,,,,,,,,,,0,11406,2999.90473 +11407,2,飯山線,イイヤマセン,飯山線,Iiyama Line,Iiyama Line,饭山线,이야마선,#7BC24B,2,,,,,,,,,,,,,0,11407,3491.78175 +11408,2,越後線,エチゴセン,越後線,Echigo Line,Echigo Line,越后线,에치고선,#40934D,2,,,,,,,,,,,,,0,11408,2582.39854 +11409,2,北アルプス線,キタアルプスセン,大糸線,Oito Line,Oito Line,大糸线,오이토선,#9370DB,2,,,,,,,,,,,,,0,11409,2603.83354 +11410,2,弥彦線,ヤヒコセン,弥彦線,Yahiko Line,Yahiko Line,弥彦线,야히코선,#922790,2,,,,,,,,,,,,,0,11410,2414.18702 +11411,3,中央本線,チュウオウホンセン,中央本線,Chuo Line,Chuo Line,中央线,주오선,#307097,2,CF,,,,#307097,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11411,4390.25074 +11412,2,篠ノ井線,シノノイセン,篠ノ井線,Shinonoi Line,Shinonoi Line,篠之井线,시노노이선,#F15A22,2,SN,,,,#F15A22,,,,SQUARE,,,,0,11412,4698.86967 +11413,3,飯田線,イイダセン,飯田線,Iida Line,Iida Line,饭田线,이다선,#6CA2D6,2,CD,,,,#6CA2D6,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11413,2262.93207 +11414,3,飯田線,イイダセン,飯田線,Iida Line,Iida Line,饭田线,이다선,#6CA2D6,2,CD,,,,#6CA2D6,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11414,1794.88663 +11415,4,北陸本線,ホクリクホンセン,北陸本線,Hokuriku Main Line,Hokuriku Main Line,北陆本线,호쿠리쿠 본선,#D60000,2,A,B,,,#0072BC,#00ACD1,,,REVERSED_SQUARE_WEST,REVERSED_SQUARE_WEST,,,0,11415,4185.95216 +11416,3,高山本線,タカヤマホンセン,高山本線,Takayama Line,Takayama Line,高山线,다카야마선,#9E1311,2,CG,,,,#9E1311,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11416,5090.65477 +11417,4,城端線,ジョウハナセン,城端線,Johana Line,Johana Line,城端线,조하나선,#846AA8,2,,,,,,,,,,,,,0,11417,2260.30908 +11418,4,氷見線,ヒミセン,氷見線,Himi Line,Himi Line,冰见线,히미선,#A646A6,2,,,,,,,,,,,,,0,11418,2309.26031 +11419,4,七尾線,ナナオセン,七尾線,Nanao Line,Nanao Line,七尾线,나나오선,#1DA5BD,2,,,,,,,,,,,,,0,11419,3502.62168 +11420,4,敦賀港線,ツルガコウセン,北陸本線,Tsurugaminato Line,Tsurugaminato Line,敦贺港线,츠루가미나토선,#FFCC00,2,,,,,,,,,,,,,2,11420,2396.90408 +11421,4,九頭竜線,クズリュウセン,越美北線,Kuzuryu Line,Kuzuryu Line,九头龙线,구즈류선,#3C9922,2,,,,,,,,,,,,,0,11421,2465.1632 +11422,4,小浜線,オバマセン,小浜線,Obama Line,Obama Line,小滨线,오바마선,#0072BC,2,,,,,,,,,,,,,0,11422,3616.65186 +11501,3,東海道本線,トウカイドウホンセン,東海道本線,Tokaido Line,Tokaido Line,东海道线,도카이도선,#F47921,2,CA,,,,#F47921,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11501,4441.12478 +11502,3,東海道本線,トウカイドウホンセン,東海道本線,Tokaido Line,Tokaido Line,东海道线,도카이도선,#F47921,2,CA,,,,#F47921,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11502,3454.94389 +11503,3,東海道本線,トウカイドウホンセン,東海道本線,Tokaido Line,Tokaido Line,东海道线,도카이도선,#F47921,2,CA,,,,#F47921,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11503,5008.52863 +11504,2,伊東線,イトウセン,伊東線,Ito Line,Ito Line,伊东线,이토선,#F68B1E,2,JT,,,,#F68B1E,,,,SQUARE,,,,0,11504,3293.87447 +11505,3,御殿場線,ゴテンバセン,御殿場線,Gotemba Line,Gotemba Line,御殿场线,고텐바선,#447442,2,CB,,,,#447442,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11505,3314.26909 +11506,3,武豊線,タケトヨセン,武豊線,Taketoyo Line,Taketoyo Line,武丰线,다케토요선,#83502F,2,CE,,,,#83502F,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11506,2143.85534 +11507,3,太多線,タイタセン,太多線,Taita Line,Taita Line,太多线,다이타선,#C7B944,2,CI,,,,#C7B944,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11507,2485.52984 +11508,3,関西本線,カンサイホンセン,関西本線,Kansai Line,Kansai Line,关西线,간사이선,#0FB68F,2,CJ,,,,#0FB68F,,,,HALF_SQUARE_WITHOUT_ROUND,,,,0,11508,3521.88653 +11509,4,関西本線,カンサイホンセン,関西本線,Kansai Main Line,Kansai Main Line,关西本线,간사이 본선,#0FB68F,2,,,,,,,,,,,,,0,11509,5496.62858 +11510,3,紀勢本線,キセイホンセン,紀勢本線,Kisei Line,Kisei Line,纪势线,기세이선,#F80039,2,,,,,,,,,,,,,0,11510,4447.92245 +11511,4,草津線,クサツセン,草津線,Kusatsu Line,Kusatsu Line,草津线,구사쓰선,#CBCF10,2,C,,,,#CBCF10,,,,REVERSED_SQUARE_WEST,,,,0,11511,3617.10434 +11512,3,参宮線,サングウセン,参宮線,Sangu Line,Sangu Line,参宫线,산구선,#4D2E8C,2,,,,,,,,,,,,,0,11512,3162.76386 +11513,3,名松線,メイショウセン,名松線,Meisho Line,Meisho Line,名松线,메이쇼선,#E9E343,2,,,,,,,,,,,,,0,11513,3061.97516 +11601,4,琵琶湖線,ビワコセン,東海道本線,Biwako Line,Biwako Line,琵琶湖线,비와코선,#0072BC,2,A,,,,#0072BC,,,,REVERSED_SQUARE_WEST,,,,0,11601,3579.96107 +11602,4,JR京都線,ジェーアールキョウトセン,東海道本線,Kyoto Line,Kyoto Line,京都线,교토선,#0072BC,2,A,,,,#0072BC,,,,REVERSED_SQUARE_WEST,,,,0,11602,2641.99124 +11603,4,JR神戸線,ジェーアールコウベセン,東海道本線,Kobe Line,Kobe Line,神户线,고베선,#0072BC,2,A,,,,#0072BC,,,,REVERSED_SQUARE_WEST,,,,0,11603,2043.28501 +11605,4,湖西線,コセイセン,湖西線,Kosei Line,Kosei Line,湖西线,고세이선,#576290,2,B,,,,#00ACD1,,,,REVERSED_SQUARE_WEST,,,,0,11605,3797.95505 +11607,4,大和路線,ヤマトジセン,関西本線,Yamatoji Line,Yamatoji Line,大和路线,야마토지선,#009933,2,Q,,,,#009933,,,,REVERSED_SQUARE_WEST,,,,0,11607,2531.18147 +11608,4,JR神戸線,ジェーアールコウベセン,山陽本線,Kobe Line,Kobe Line,神户线,고베선,#0072BC,2,A,,,,#0072BC,,,,REVERSED_SQUARE_WEST,,,,0,11608,2474.54823 +11609,4,山陽本線,サンヨウホンセン,山陽本線,San’yo Main Line,San’yo Main Line,山阳本线,산요 본선,#0072BC,2,A,S,,,#0072BC,#C1D612,,,REVERSED_SQUARE_WEST,REVERSED_SQUARE_WEST,,,0,11609,4947.12435 +11610,4,山陽本線,サンヨウホンセン,山陽本線,San’yo Main Line,San’yo Main Line,山阳本线,산요 본선,#0072BC,2,W,X,,,#F5A200,#00A0E9,,,REVERSED_SQUARE_WEST,REVERSED_SQUARE_WEST,,,0,11610,5100.06466 +11611,4,山陽本線,サンヨウホンセン,山陽本線,San’yo Main Line,San’yo Main Line,山阳本线,산요 본선,#0072BC,2,G,R,,,#60AD3B,#CB342E,,,REVERSED_SQUARE_WEST,REVERSED_SQUARE_WEST,,,0,11611,3949.01628 +11612,4,山陽本線,サンヨウホンセン,山陽本線,San'yo Main Line,San'yo Main Line,山阳本线,산요 본선,#0072BC,2,JA,,,,#E24148,,,,HALF_SQUARE,,,,0,11612,5412.42792 +11613,4,山陽本線,サンヨウホンセン,山陽本線,San’yo Main Line,San’yo Main Line,山阳本线,산요 본선,#0072BC,2,,,,,,,,,,,,,0,11613,2142.977 +11614,4,嵯峨野線,サガノセン,山陰本線,Sagano Line,Sagano Line,嵯峨野线,사가노선,#9370DB,2,E,,,,#9370DB,,,,REVERSED_SQUARE_WEST,,,,0,11614,2226.44077 +11615,4,山陰本線,サンインホンセン,山陰本線,San'in Main Line,San'in Main Line,山阴本线,산인 본선,#669933,2,E,,,,#669933,,,,REVERSED_SQUARE_WEST,,,,0,11615,4894.43373 +11616,4,山陰本線,サンインホンセン,山陰本線,San’in Main Line,San’in Main Line,山阴本线,산인 본선,#669933,2,A,,,,#669933,,,,REVERSED_SQUARE_WEST,,,,0,11616,4389.45253 +11617,4,学研都市線,ガッケントシセン,片町線,Gakkentoshi Line,Gakkentoshi Line,学研都市线,갓켄토시선,#9ACD32,2,H,,,,#FF1493,,,,REVERSED_SQUARE_WEST,,,,0,11617,1900.74518 +11618,4,奈良線,ナラセン,奈良線,Nara Line,Nara Line,奈良线,나라선,#A52A2A,2,D,,,,#A52A2A,,,,REVERSED_SQUARE_WEST,,,,0,11618,2052.89697 +11622,4,舞鶴線,マイヅルセン,舞鶴線,Maizuru Line,Maizuru Line,舞鹤线,마이즈루선,#7BA1C5,2,L,,,,#7BA1C5,,,,REVERSED_SQUARE_WEST,,,,0,11622,5287.9216 +11623,4,大阪環状線,オオサカカンジョウセン,大阪環状線,Osaka Loop Line,Osaka Loop Line,大阪环状线,오사카 순환선,#FF0000,2,O,,,,#FF0000,,,,REVERSED_SQUARE_WEST,,,,0,11623,1128.80239 +11624,4,JRゆめ咲線,ジェーアールユメサキセン,桜島線,Yumesaki Line,Yumesaki Line,梦咲线,유메사키선,#0A318E,2,P,,,,#0A318E,,,,REVERSED_SQUARE_WEST,,,,0,11624,1373.1323 +11625,4,JR東西線,ジェーアールトウザイセン,JR東西線,Tozai Line,Tozai Line,东西线,도자이선,#FF1493,2,H,,,,#FF1493,,,,REVERSED_SQUARE_WEST,,,,0,11625,1505.55763 +11626,4,阪和線,ハンワセン,阪和線,Hanwa Line,Hanwa Line,阪和线,한와선,#FF6600,2,R,,,,#FF9600,,,,REVERSED_SQUARE_WEST_DARK_TEXT,,,,0,11626,1787.64739 +11627,4,羽衣線,ハゴロモセン,阪和線,Hagoromo Line,Hagoromo Line,羽衣线,하고로모선,#FF6600,2,,,,,,,,,,,,,0,11627,1504.3773 +11628,4,関西空港線,カンサイクウコウセン,関西空港線,Kansai Airport Line,Kansai Airport Line,关西机场线,간사이 공항선,#0000FF,2,S,,,,#0000FF,,,,REVERSED_SQUARE_WEST,,,,0,11628,5508.17333 +11629,4,JR宝塚線,ジェーアールタカラヅカセン,福知山線,Takarazuka Line,Takarazuka Line,宝冢线,다카라즈카선,#FFCC00,2,G,A,,,#FFBA00,#0072BC,,,REVERSED_SQUARE_WEST_DARK_TEXT,REVERSED_SQUARE_WEST,,,0,11629,2976.25397 +11630,4,福知山線,フクチヤマセン,福知山線,Fukuchiyama Line,Fukuchiyama Line,福知山线,후쿠치야마선,#FFCC00,2,G,,,,#FFBA00,,,,REVERSED_SQUARE_WEST_DARK_TEXT,,,,0,11630,5310.44885 +11631,4,赤穂線,アコウセン,赤穂線,Ako Line,Ako Line,赤穗线,아코선,#F16369,2,N,A,,,#F16369,#0072BC,,,REVERSED_SQUARE_WEST,REVERSED_SQUARE_WEST,,,0,11631,3334.25758 +11632,4,加古川線,カコガワセン,加古川線,Kakogawa Line,Kakogawa Line,加古川线,가코가와선,#3CB371,2,I,,,,#3CB371,,,,REVERSED_SQUARE_WEST,,,,0,11632,2371.85478 +11633,4,姫新線,キシンセン,姫新線,Kishin Line,Kishin Line,姬新线,기신선,#FF4500,2,K,,,,#FF4500,,,,REVERSED_SQUARE_WEST,,,,0,11633,4101.68686 +11634,4,姫新線,キシンセン,姫新線,Kishin Line,Kishin Line,姬新线,기신선,#800080,2,K,,,,#800080,,,,REVERSED_SQUARE_WEST,,,,0,11634,4608.22042 +11635,4,播但線,バンタンセン,播但線,Bantan Line,Bantan Line,播但线,반탄선,#A52A2A,2,J,,,,#A52A2A,,,,REVERSED_SQUARE_WEST,,,,0,11635,3834.08915 +11636,4,和歌山線,ワカヤマセン,和歌山線,Wakayama Line,Wakayama Line,和歌山线,와카야마선,#192375,2,T,,,,#192375,,,,REVERSED_SQUARE_WEST,,,,0,11636,2467.63838 +11637,4,万葉まほろば線,マンヨウマホロバセン,桜井線,Manyo Mahoroba Line,Manyo Mahoroba Line,万叶Mahoroba线,사쿠라이선,#EC64AB,2,U,,,,#EC64AB,,,,REVERSED_SQUARE_WEST,,,,0,11637,2220.88784 +11639,4,きのくに線,キノクニセン,紀勢本線,Kinokuni Line,Kinokuni Line,纪国线,기노쿠니선,#FE8525,2,W,,,,#FE8525,,,,REVERSED_SQUARE_WEST,,,,0,11639,3666.53002 +11640,4,紀勢本線,キセイホンセン,紀勢本線,Kisei Main Line,Kisei Main Line,纪势本线,기세이 본선,#192375,2,,,,,,,,,,,,,0,11640,1595.33951 +11641,4,おおさか東線,オオサカヒガシセン,おおさか東線,Osaka Higashi Line,Osaka Higashi Line,大阪东线,오사카히가시선,#347293,2,F,,,,#347293,,,,REVERSED_SQUARE_WEST,,,,0,11641,1703.58445 +11701,4,山陰本線,サンインホンセン,山陰本線,San’in Main Line,San’in Main Line,山阴本线,산인 본선,#BAE541,2,,,,,,,,,,,,,0,11701,4298.59562 +11702,4,山陰本線,サンインホンセン,山陰本線,San’in Main Line,San’in Main Line,山阴本线,산인 본선,#BAE541,2,,,,,,,,,,,,,0,11702,4464.27402 +11703,4,伯備線,ハクビセン,伯備線,Hakubi Line,Hakubi Line,伯备线,하쿠비선,#FF4500,2,,,,,,,,,,,,,0,11703,5078.99477 +11704,4,因美線,インビセン,因美線,Inbi Line,Inbi Line,因美线,인비선,#AA731C,2,B,,,,#AA731C,,,,REVERSED_SQUARE_WEST,,,,0,11704,4056.91816 +11705,4,境線,サカイセン,境線,Sakai Line,Sakai Line,境线,사카이선,#00FFFF,2,C,,,,#00FFFF,,,,REVERSED_SQUARE_WEST,,,,0,11705,1210.29083 +11706,4,木次線,キスキセン,木次線,Kisuki Line,Kisuki Line,木次线,기스키선,#339966,2,E,,,,#339966,,,,REVERSED_SQUARE_WEST,,,,0,11706,4446.78062 +11707,4,三江線,サンコウセン,三江線,Sanko Line,Sanko Line,三江线,산코선,#C9090B,2,,,,,,,,,,,,,2,11707,3143.03522 +11708,4,山口線,ヤマグチセン,山口線,Yamaguchi Line,Yamaguchi Line,山口线,야마구치선,#FF6600,2,,,,,,,,,,,,,0,11708,3423.51014 +11709,4,宇野線,ウノセン,宇野線,Uno Line,Uno Line,宇野线,우노선,#3333CC,2,M,,,,#63D2D3,,,,REVERSED_SQUARE_WEST_DARK_TEXT,,,,0,11709,2310.05384 +11710,4,瀬戸大橋線,セトオオハシセン,本四備讃線,Honshi-Bisan Line,Honshi-Bisan Line,本四备赞线,혼시비산선,#0072BC,2,M,Y,,,#0072BC,#FBAF18,,,REVERSED_SQUARE_WEST,ROUND,,,0,11710,6198.50829 +11713,4,吉備線,キビセン,吉備線,Kibi Line,Kibi Line,吉备线,기비선,#FFA500,2,,,,,,,,,,,,,0,11713,2236.12757 +11714,4,芸備線,ゲイビセン,芸備線,Geibi Line,Geibi Line,艺备线,게이비선,#00CED1,2,P,,,,#00CED1,,,,REVERSED_SQUARE_WEST,,,,0,11714,3716.98172 +11715,4,津山線,ツヤマセン,津山線,Tsuyama Line,Tsuyama Line,津山线,쓰야마선,#FF69B4,2,T,,,,#FF69B4,,,,REVERSED_SQUARE_WEST,,,,0,11715,3604.41501 +11716,4,呉線,クレセン,呉線,Kure Line,Kure Line,吴线,구레선,#33C033,2,Y,,,,#33C033,,,,REVERSED_SQUARE_WEST,,,,0,11716,3129.18662 +11717,4,可部線,カベセン,可部線,Kabe Line,Kabe Line,可部线,가베선,#A020F0,2,B,,,,#A020F0,,,,REVERSED_SQUARE_WEST,,,,0,11717,1201.80796 +11720,4,福塩線,フクエンセン,福塩線,Fukuen Line,Fukuen Line,福盐线,후쿠엔선,#FF1493,2,Z,,,,#FF1493,,,,REVERSED_SQUARE_WEST,,,,0,11720,3006.43876 +11721,4,宇部線,ウベセン,宇部線,Ube Line,Ube Line,宇部线,우베선,#990066,2,,,,,,,,,,,,,0,11721,1923.31896 +11722,4,美祢線,ミネセン,美祢線,Mine Line,Mine Line,美祢线,미네선,#CC0066,2,,,,,,,,,,,,,0,11722,3957.07753 +11723,4,小野田線,オノダセン,小野田線,Onoda Line,Onoda Line,小野田线,오노다선,#666699,2,,,,,,,,,,,,,0,11723,1992.42011 +11724,4,岩徳線,ガントクセン,岩徳線,Gantoku Line,Gantoku Line,岩德线,간토쿠선,#008056,2,,,,,,,,,,,,,0,11724,3423.3195 +11801,5,土讃線,ドサンセン,土讃線,Dosan Line,Dosan Line,土赞线,도산선,#E25885,2,D,K,,,#DC4586,#DC4586,,,ROUND,ROUND,,,0,11801,3235.86542 +11802,5,高徳線,コウトクセン,高徳線,Kotoku Line,Kotoku Line,高德线,고토쿠선,#99CC00,2,T,,,,#87CA3B,,,,ROUND,,,,0,11802,2606.83126 +11803,5,よしの川ブルーライン,ヨシノガワブルーライン,徳島線,Tokushima Line,Tokushima Line,德岛线,도쿠시마선,#008080,2,B,,,,#366481,,,,ROUND,,,,0,11803,2904.33283 +11804,5,牟岐線,ムギセン,牟岐線,Mugi Line,Mugi Line,牟岐线,무기선,#00FFFF,2,M,,,,#2EBDB1,,,,ROUND,,,,0,11804,2708.87394 +11805,5,鳴門線,ナルトセン,鳴門線,Naruto Line,Naruto Line,鸣门线,나루토선,#993366,2,N,,,,#881F61,,,,ROUND,,,,0,11805,1347.57908 +11806,5,予讃線,ヨサンセン,予讃線,Yosan Line,Yosan Line,予赞线,요산선,#FF9900,2,Y,,,,#F5AC13,,,,ROUND,,,,0,11806,3418.15462 +11807,5,予讃・内子線,ヨサン・ウチコセン,予讃・内子線,Yosan/Uchiko Line,Yosan/Uchiko Line,予赞・内子线,요산선・우치코선,#FF9900,2,U,S,,,#F5AC13,#9AA7D7,,,ROUND,ROUND,,,0,11807,3962.36461 +11808,5,しまんとグリーンライン,シマントグリーンライン,予土線,Yodo Line,Yodo Line,予土线,요도선,#339966,2,G,,,,#339966,,,,ROUND,,,,0,11808,3815.26923 +11901,4,博多南線,ハカタミナミセン,博多南線,Hakata-Minami Line,Hakata-Minami Line,博多南线,하카타미나미선,#22B04F,2,,,,,,,,,,,,,0,11901,9376.75481 +11902,6,鹿児島本線,カゴシマホンセン,鹿児島本線,Kagoshima Main Line,Kagoshima Main Line,鹿儿岛本线,가고시마 본선,#E24148,2,JA,,,,#E24148,,,,HALF_SQUARE,,,,0,11902,2788.52108 +11903,6,鹿児島本線,カゴシマホンセン,鹿児島本線,Kagoshima Main Line,Kagoshima Main Line,鹿儿岛本线,가고시마 본선,#E24148,2,JB,,,,#E24148,,,,HALF_SQUARE,,,,0,11903,3037.07214 +11904,6,鹿児島本線,カゴシマホンセン,鹿児島本線,Kagoshima Main Line,Kagoshima Main Line,鹿儿岛本线,가고시마 본선,#E24148,2,,,,,,,,,,,,,0,11904,3693.15389 +11905,6,長崎本線,ナガサキホンセン,長崎本線,Nagasaki Main Line,Nagasaki Main Line,长崎本线,나가사키 본선,#E6B040,2,JH,,,,#E6B040,,,,HALF_SQUARE_DARK_TEXT,,,,0,11905,3539.30824 +11906,6,日豊本線,ニッポウホンセン,日豊本線,Nippo Main Line,Nippo Main Line,日丰本线,닛포 본선,#4ABACD,2,JF,,,,#4ABACD,,,,HALF_SQUARE,,,,0,11906,3769.80768 +11907,6,日豊本線,ニッポウホンセン,日豊本線,Nippo Main Line,Nippo Main Line,日丰本线,닛포 본선,#4ABACD,2,,,,,,,,,,,,,0,11907,4783.87629 +11908,6,福北ゆたか線,フクホクユタカセン,篠栗線,Fukuhoku Yutaka Line,Fukuhoku Yutaka Line,福北丰线,후쿠호쿠유타카선,#FAAF18,2,JC,,,,#FAAF18,,,,HALF_SQUARE_DARK_TEXT,,,,0,11908,2397.33676 +11909,6,筑肥線,チクヒセン,筑肥線,Chikuhi Line,Chikuhi Line,筑肥线,지쿠히선,#8F3E97,2,JK,,,,#8F3E97,,,,HALF_SQUARE,,,,0,11909,2195.8741 +11910,6,若松線,ワカマツセン,筑豊本線,Wakamatsu Line,Wakamatsu Line,若松线,와카마쓰선,#0095D9,2,JE,,,,#0095D9,,,,HALF_SQUARE,,,,0,11910,2099.50323 +11911,6,福北ゆたか線,フクホクユタカセン,筑豊本線,Fukuhoku Yutaka Line,Fukuhoku Yutaka Line,福北丰线,후쿠호쿠유타카선,#FAAF18,2,JC,,,,#FAAF18,,,,HALF_SQUARE_DARK_TEXT,,,,0,11911,2280.68241 +11912,6,原田線,ハルダセン,筑豊本線,Haruda Line,Haruda Line,原田线,하루다선,#36B558,2,JG,,,,#36B558,,,,HALF_SQUARE,,,,0,11912,5133.01193 +11913,6,ゆふ高原線,ユフコウゲンセン,久大本線,Kyūdai Main Line,Kyūdai Main Line,久大本线,규다이 본선,#36B558,2,,,,,,,,,,,,,0,11913,3843.50595 +11914,6,日田彦山線,ヒタヒコサンセン,日田彦山線,Hitahikosan Line,Hitahikosan Line,日田彦山线,히타히코산선,#B96F30,2,JI,,,,#B96F30,,,,HALF_SQUARE,,,,0,11914,2853.35332 +11915,6,後藤寺線,ゴトウジセン,後藤寺線,Gotoji Line,Gotoji Line,后藤寺线,고토지선,#8F3E97,2,JJ,,,,#8F3E97,,,,HALF_SQUARE,,,,0,11915,2547.05013 +11916,6,海の中道線,ウミノナカミチセン,香椎線,Kashii Line,Kashii Line,香椎线,가시선,#3A268F,2,,,,,,,,,,,,,0,11916,2435.9513 +11917,6,香椎線,カシイセン,香椎線,Kashii Line,Kashii Line,香椎线,가시선,#0095D9,2,JD,,,,#0095D9,,,,HALF_SQUARE,,,,0,11917,1214.8027 +11918,6,佐世保線,サセボセン,佐世保線,Sasebo Line,Sasebo Line,佐世保线,사세보선,#36B558,2,,,,,,,,,,,,,0,11918,3720.00573 +11920,6,筑肥線,チクヒセン,筑肥線,Chikuhi Line,Chikuhi Line,筑肥线,지쿠히선,#8F3E97,2,,,,,,,,,,,,,0,11920,2637.30264 +11921,6,唐津線,カラツセン,唐津線,Karatsu Line,Karatsu Line,唐津线,가라쓰선,#0095D9,2,,,,,,,,,,,,,0,11921,3201.2036 +11922,6,大村線,オオムラセン,大村線,Omura Line,Omura Line,大村线,오무라선,#0095D9,2,,,,,,,,,,,,,0,11922,3363.01247 +11923,6,豊肥本線,ホウヒホンセン,豊肥本線,Hohi Main Line,Hohi Main Line,丰肥本线,호히 본선,#B96F30,2,,,,,,,,,,,,,0,11923,4060.20788 +11924,6,三角線(あまくさみすみ線),アマクサミスミセン,三角線,Misumi Line,Misumi Line,三角线,미스미선,#0095D9,2,,,,,,,,,,,,,0,11924,3270.08844 +11925,6,えびの高原線,エビノコウゲンセン,肥薩線,Hisatsu Line,Hisatsu Line,肥萨线,히사쓰선,#8F3E97,2,,,,,,,,,,,,,0,11925,4713.83221 +11926,6,肥薩線,ヒサツセン,肥薩線,Hisatsu Line,Hisatsu Line,肥萨线,히사쓰선,#8F3E97,2,,,,,,,,,,,,,0,11926,4078.25274 +11927,6,宮崎空港線,ミヤザキクウコウセン,宮崎空港線,Miyazaki Airport Line,Miyazaki Airport Line,宫崎机场线,미야자키쿠코선,#36B558,2,,,,,,,,,,,,,0,11927,1938.07464 +11928,6,日南線,ニチナンセン,日南線,Nichinan Line,Nichinan Line,日南线,니치난선,#FAAF18,2,,,,,,,,,,,,,0,11928,3348.76242 +11929,6,えびの高原線,エビノコウゲンセン,吉都線,Kitto Line,Kitto Line,吉都线,깃토선,#36B558,2,,,,,,,,,,,,,0,11929,3795.96536 +11930,6,指宿枕崎線,イブスキマクラザキセン,指宿枕崎線,Ibusuki Makurazaki Line,Ibusuki Makurazaki Line,指宿枕崎线,이부스키마쿠라자키선,#FAAF18,2,,,,,,,,,,,,,0,11930,2445.33683 +21001,11,東武東上線,トウブトウジョウセン,東武東上線,Tobu Tojo Line,Tobu Tojo Line,东武东上线,도부 도조선,#004098,2,TJ,,,,#014099,,,,SQUARE,,,,0,21001,1943.6609 +21002,11,東武伊勢崎線,トウブイセサキセン,東武伊勢崎線,Tobu Isesaki Line,Tobu Isesaki Line,东武伊势崎线,도부 이세사키선,#ED1A3D,2,TI,TS,,,#B50033,#0067C0,,,SQUARE,SQUARE,,,0,21002,2370.8542 +21003,11,東武日光線,トウブニッコウセン,東武日光線,Tobu Nikko Line,Tobu Nikko Line,东武日光线,도부 닛코선,#FFA500,2,TN,TS,,,#F08200,#0067C0,,,SQUARE,SQUARE,,,0,21003,3736.18408 +21004,11,東武アーバンパークライン,トウブアーバンパークライン,東武野田線,Tobu Urban Park Line,Tobu Urban Park Line,东武都市公园线,도부 어반 파크 라인,#00BFFF,2,TD,,,,#00A1E9,,,,SQUARE,,,,0,21004,1817.1716 +21005,11,東武亀戸線,トウブカメイドセン,東武亀戸線,Tobu Kameido Line,Tobu Kameido Line,东武龟户线,도부 가메이도선,#004098,2,TS,,,,#0067C0,,,,SQUARE,,,,0,21005,854.1278 +21006,11,東武大師線,トウブダイシセン,東武大師線,Tobu Daishi Line,Tobu Daishi Line,东武大师线,도부 다이시선,#004098,2,TS,,,,#0067C0,,,,SQUARE,,,,0,21006,808.59735 +21007,11,東武越生線,トウブオゴセセン,東武越生線,Tobu Ogose Line,Tobu Ogose Line,东武越生线,도부 오고세선,#004098,2,TJ,,,,#014099,,,,SQUARE,,,,0,21007,1542.24657 +21008,11,東武宇都宮線,トウブウツノミヤセン,東武宇都宮線,Tobu Utsunomiya Line,Tobu Utsunomiya Line,东武宇都宫线,도부 우쓰노미야선,#FFA500,2,TN,,,,#F08200,,,,SQUARE,,,,0,21008,2694.53691 +21009,11,東武鬼怒川線,トウブキヌガワセン,東武鬼怒川線,Tobu Kinugawa Line,Tobu Kinugawa Line,东武鬼怒川线,도부 기누가와선,#FFA500,2,TN,,,,#F08200,,,,SQUARE,,,,0,21009,1964.12 +21010,11,東武佐野線,トウブサノセン,東武佐野線,Tobu Sano Line,Tobu Sano Line,东武佐野线,도부 사노선,#ED1A3D,2,TI,,,,#B50033,,,,SQUARE,,,,0,21010,2389.76109 +21011,11,東武桐生線,トウブキリュウセン,東武桐生線,Tobu Kiryu Line,Tobu Kiryu Line,东武桐生线,도부 기류선,#ED1A3D,2,TI,,,,#B50033,,,,SQUARE,,,,0,21011,2835.1253 +21012,11,東武小泉線,トウブコイズミセン,東武小泉線,Tobu Koizumi Line,Tobu Koizumi Line,东武小泉线,도부 고이즈미선,#ED1A3D,2,TI,,,,#B50033,,,,SQUARE,,,,0,21012,2725.22052 +22001,12,西武池袋線,セイブイケブクロセン,西武池袋線,Seibu Ikebukuro Line,Seibu Ikebukuro Line,西武池袋线,세이부 이케부쿠로선,#F17900,2,SI,,,,#F17900,,,,HALF_SQUARE_DARK_TEXT,,,,0,22001,2041.41825 +22002,12,西武秩父線,セイブチチブセン,西武秩父線,Seibu Chichibu Line,Seibu Chichibu Line,西武秩父线,세이부 지치부선,#F17900,2,SI,,,,#F17900,,,,HALF_SQUARE_DARK_TEXT,,,,0,22002,3156.95666 +22003,12,西武有楽町線,セイブユウラクチョウセン,西武有楽町線,Seibu Yurakucho Line,Seibu Yurakucho Line,西武有乐町线,세이부 유라쿠초선,#F17901,2,SI,,,,#F17900,,,,HALF_SQUARE_DARK_TEXT,,,,0,22003,1192.33408 +22004,12,西武豊島線,セイブトシマセン,西武豊島線,Seibu Toshima Line,Seibu Toshima Line,西武丰岛线,세이부 도시마선,#F17900,2,SI,,,,#F17900,,,,HALF_SQUARE_DARK_TEXT,,,,0,22004,903.87278 +22005,12,西武狭山線,セイブサヤマセン,西武狭山線,Seibu Sayama Line,Seibu Sayama Line,西武狭山线,세이부 사야마선,#F17900,2,SI,,,,#F17900,,,,HALF_SQUARE_DARK_TEXT,,,,0,22005,2026.49521 +22006,12,レオライナー,レオライナー,西武山口線,Seibu Yamaguchi Line,Seibu Yamaguchi Line,西武山口线,세이부 야마구치선,#FF69B4,5,SY,,,,#FF3333,,,,HALF_SQUARE_DARK_TEXT,,,,0,22006,1384.74496 +22007,12,西武新宿線,セイブシンジュクセン,西武新宿線,Seibu Shinjuku Line,Seibu Shinjuku Line,西武新宿线,세이부 신주쿠선,#00A6C0,2,SS,,,,#00A6C0,,,,HALF_SQUARE_DARK_TEXT,,,,0,22007,1681.79404 +22008,12,西武拝島線,セイブハイジマセン,西武拝島線,Seibu Haijima Line,Seibu Haijima Line,西武拜岛线,세이부 하이지마선,#00A6C0,2,SS,,,,#00A6C0,,,,HALF_SQUARE_DARK_TEXT,,,,0,22008,2011.14468 +22009,12,西武西武園線,セイブセイブエンセン,西武西武園線,Seibu Seibuen Line,Seibu Seibuen Line,西武西武园线,세이부 세이부엔선,#00A6C0,2,SK,,,,#00A6C0,,,,HALF_SQUARE_DARK_TEXT,,,,0,22009,2432.68591 +22010,12,西武国分寺線,セイブコクブンジセン,西武国分寺線,Seibu Kokubunji Line,Seibu Kokubunji Line,西武国分寺线,세이부 고쿠분지선,#00BB00,2,SK,,,,#00BB00,,,,HALF_SQUARE_DARK_TEXT,,,,0,22010,1911.94322 +22011,12,西武多摩湖線,セイブタマコセン,西武多摩湖線,Seibu Tamako Line,Seibu Tamako Line,西武多摩湖线,세이부 다마코선,#FFA500,2,ST,,,,#FFA500,,,,HALF_SQUARE_DARK_TEXT,,,,0,22011,1497.83003 +22012,12,西武多摩川線,セイブタマガワセン,西武多摩川線,Seibu Tamagawa Line,Seibu Tamagawa Line,西武多摩川线,세이부 다마가와선,#F17900,2,SW,,,,#F17900,,,,HALF_SQUARE_DARK_TEXT,,,,0,22012,1556.25362 +23001,13,京成本線,ケイセイホンセン,京成本線,Keisei Main Line,Keisei Main Line,京成本线,게이세이 본선,#005AAA,2,KS,,,,#005AAA,,,,KEISEI,,,,0,23001,1640.0498 +23002,13,京成押上線,ケイセイオシアゲセン,京成押上線,Keisei Oshiage Line,Keisei Oshiage Line,京成押上线,게이세이 오시아게선,#005AAA,2,KS,A,,,#005AAA,#E85298,,,KEISEI,ROUND,,,0,23002,1120.25622 +23003,13,京成金町線,ケイセイカナマチセン,京成金町線,Keisei Kanamachi Line,Keisei Kanamachi Line,京成金町线,게이세이 가나마치선,#005AAA,2,KS,,,,#005AAA,,,,KEISEI,,,,0,23003,1261.42049 +23004,13,京成千葉線,ケイセイチバセン,京成千葉線,Keisei Chiba Line,Keisei Chiba Line,京成千叶线,게이세이 지바선,#005AAA,2,KS,,,,#005AAA,,,,KEISEI,,,,0,23004,1394.3923 +23005,13,京成千原線,ケイセイチハラセン,京成千原線,Keisei Chihara Line,Keisei Chihara Line,京成千原线,게이세이 지하라선,#005AAA,2,KS,,,,#005AAA,,,,KEISEI,,,,0,23005,2123.10699 +23006,13,成田スカイアクセス線,ナリタスカイアクセスセン,京成成田空港線,Keisei Narita Airport Line,Keisei Narita Airport Line,京成成田机场线,게이세이 나리타 공항선,#FF6600,2,KS,HS,,,#005AAA,#3333FF,,,KEISEI,KEISEI,,,0,23006,7555.64232 +24001,14,京王線,ケイオウセン,京王線,Keio Line,Keio Line,京王线,게이오선,#CA0073,2,KO,,,,#CA0073,,,,KEIO,,,,0,24001,1199.29758 +24002,14,京王相模原線,ケイオウサガミハラセン,京王相模原線,Keio Sagamihara Line,Keio Sagamihara Line,京王相模原线,게이오 사가미하라선,#CA0073,2,KO,,,,#CA0073,,,,KEIO,,,,0,24002,1995.06796 +24003,14,京王高尾線,ケイオウタカオセン,京王高尾線,Keio Takao Line,Keio Takao Line,京王高尾线,게이오 다카오선,#CA0073,2,KO,,,,#CA0073,,,,KEIO,,,,0,24003,1403.25349 +24004,14,京王競馬場線,ケイオウケイバジョウセン,京王競馬場線,Keio Keibajo Line,Keio Keibajo Line,京王竞马场线,게이오 게이바조선,#CA0073,2,KO,,,,#CA0073,,,,KEIO,,,,0,24004,926.37779 +24005,14,京王動物園線,ケイオウドウブツエンセン,京王動物園線,Keio Dobutsuen Line,Keio Dobutsuen Line,京王动物园线,게이오 도부쓰엔선,#CA0073,2,KO,,,,#CA0073,,,,KEIO,,,,0,24005,1947.7838 +24006,14,京王井の頭線,ケイオウイノガシラセン,京王井の頭線,Keio Inokashira Line,Keio Inokashira Line,京王井之头线,게이오 이노카시라선,#000088,2,IN,,,,#000088,,,,KEIO,,,,0,24006,802.89748 +24007,14,京王新線,ケイオウシンセン,京王新線,Keio New Line,Keio New Line,京王新线,게이오 신선,#CA0073,2,KO,,,,#CA0073,,,,KEIO,,,,0,24007,1104.45578 +25001,15,小田急線,オダキュウセン,小田急小田原線,Odakyu Line,Odakyu Line,小田急线,오다큐선,#2F79BC,2,OH,,,,#2F79BC,,,,ODAKYU,,,,0,25001,1771.38549 +25002,15,小田急江ノ島線,オダキュウエノシマセン,小田急江ノ島線,Odakyu Enoshima Line,Odakyu Enoshima Line,小田急江之岛线,오다큐 에노시마선,#2D8BD0,2,OE,OH,,,#2F79BC,#2F79BC,,,ODAKYU,ODAKYU,,,0,25002,1685.25136 +25003,15,小田急多摩線,オダキュウタマセン,小田急多摩線,Odakyu Tama Line,Odakyu Tama Line,小田急多摩线,오다큐 다마선,#2D8BD0,2,OT,OH,,,#2F79BC,#2F79BC,,,ODAKYU,ODAKYU,,,0,25003,1494.74821 +26001,16,東急東横線,トウキュウトウヨコセン,東急東横線,Tokyu Toyoko Line,Tokyu Toyoko Line,东急东横线,도큐 도요코선,#EE0011,2,TY,,,,#EE0011,,,,REVERSED_SQUARE,,,,0,26001,1189.02738 +26002,16,東急目黒線,トウキュウメグロセン,東急目黒線,Tokyu Meguro Line,Tokyu Meguro Line,东急目黑线,도큐 메구로선,#2C94B6,2,MG,,,,#2C94B6,,,,REVERSED_SQUARE,,,,0,26002,985.08403 +26003,16,東急田園都市線,トウキュウデンエントシセン,東急田園都市線,Tokyu Den-en-toshi Line,Tokyu Den-en-toshi Line,东急田园都市线,도큐 덴엔토시선,#018D54,2,DT,,,,#018D54,,,,REVERSED_SQUARE,,,,0,26003,1191.38645 +26004,16,東急大井町線,トウキュウオオイマチセン,東急大井町線,Tokyu Oimachi Line,Tokyu Oimachi Line,东急大井町线,도큐 오이마치선,#FD9A3D,2,OM,,,,#FD9A3D,,,,REVERSED_SQUARE,,,,0,26004,722.37423 +26005,16,東急池上線,トウキュウイケガミセン,東急池上線,Tokyu Ikegami Line,Tokyu Ikegami Line,东急池上线,도큐 이케가미선,#DE65B0,2,IK,,,,#DE65B0,,,,REVERSED_SQUARE,,,,0,26005,761.78481 +26006,16,東急多摩川線,トウキュウタマガワセン,東急多摩川線,Tokyu Tamagawa Line,Tokyu Tamagawa Line,东急多摩川线,도큐 다마가와선,#A3016E,2,TM,,,,#A3016E,,,,REVERSED_SQUARE,,,,0,26006,919.05782 +26007,16,東急世田谷線,トウキュウセタガヤセン,東急世田谷線,Tokyu Setagaya Line,Tokyu Setagaya Line,东急世田谷线,도큐 세타가야선,#FCC70D,4,SG,,,,#FCC70D,,,,REVERSED_SQUARE_DARK_TEXT,,,,0,26007,679.48258 +26008,16,東急こどもの国線,トウキュウコドモノクニセン,東急こどもの国線,Tokyu Kodomonokuni Line,Tokyu Kodomonokuni Line,东急子供之国线,도큐 고도모노쿠니선,#0068B7,2,KD,,,,#0068B7,,,,REVERSED_SQUARE,,,,0,26008,1536.1571 +26009,16,東急新横浜線,トウキュウシンヨコハマセン,東急新横浜線,Tokyu Shin-yokohama Line,Tokyu Shin-yokohama Line,东急新横滨线,도큐 신요코하마선,#890D84,2,SH,,,,#890D84,,,,REVERSED_SQUARE,,,,0,26009,2873.29633 +27001,17,京急本線,ケイキュウホンセン,京急本線,Keikyu Main Line,Keikyu Main Line,京急本线,게이큐 본선,#00CCFF,2,KK,A,,,#00CCFF,#EC6E65,,,KEIKYU,ROUND,,,0,27001,1137.89949 +27002,17,京急空港線,ケイキュウクウコウセン,京急空港線,Keikyu Airport Line,Keikyu Airport Line,京急机场线,게이큐 공항선,#00CCFF,2,KK,,,,#00CCFF,,,,KEIKYU,,,,0,27002,1041.9296 +27003,17,京急大師線,ケイキュウダイシセン,京急大師線,Keikyu Daishi Line,Keikyu Daishi Line,京急大师线,게이큐 다이시선,#00CCFF,2,KK,,,,#00CCFF,,,,KEIKYU,,,,0,27003,727.04466 +27004,17,京急逗子線,ケイキュウズシセン,京急逗子線,Keikyu Zushi Line,Keikyu Zushi Line,京急逗子线,게이큐 즈시선,#00CCFF,2,KK,,,,#00CCFF,,,,KEIKYU,,,,0,27004,1900.49399 +27005,17,京急久里浜線,ケイキュウクリハマセン,京急久里浜線,Keikyu Kurihama Line,Keikyu Kurihama Line,京急久里滨线,게이큐 구리하마선,#00CCFF,2,KK,,,,#00CCFF,,,,KEIKYU,,,,0,27005,1634.45156 +28001,18,東京メトロ銀座線,トウキョウメトロギンザセン,東京メトロ銀座線,Tokyo Metro Ginza Line,Tokyo Metro Ginza Line,银座线,긴자선,#F39700,3,G,,,,#F39700,,,,ROUND,,,,0,28001,780.46154 +28002,18,東京メトロ丸ノ内線,トウキョウメトロマルノウチセン,東京メトロ丸ノ内線,Tokyo Metro Marunouchi Line,Tokyo Metro Marunouchi Line,丸之内线,마루노우치선,#E60012,3,M,Mb,,,#E60012,#E60012,,,ROUND,ROUND,,,0,28002,1232.26083 +28003,18,東京メトロ日比谷線,トウキョウメトロヒビヤセン,東京メトロ日比谷線,Tokyo Metro Hibiya Line,Tokyo Metro Hibiya Line,日比谷线,히비야선,#9CAEB7,3,H,,,,#9CAEB7,,,,ROUND,,,,0,28003,927.06703 +28004,18,東京メトロ東西線,トウキョウメトロトウザイセン,東京メトロ東西線,Tokyo Metro Tozai Line,Tokyo Metro Tozai Line,东西线,도자이선,#00A7DB,3,T,,,,#00A7DB,,,,ROUND,,,,0,28004,1376.11236 +28005,18,東京メトロ千代田線,トウキョウメトロチヨダセン,東京メトロ千代田線,Tokyo Metro Chiyoda Line,Tokyo Metro Chiyoda Line,千代田线,지요다선,#009944,3,C,,,,#009944,,,,ROUND,,,,0,28005,1292.70369 +28006,18,東京メトロ有楽町線,トウキョウメトロユウラクチョウセン,東京メトロ有楽町線,Tokyo Metro Yurakucho Line,Tokyo Metro Yurakucho Line,有乐町线,유라쿠초선,#C1A470,3,Y,,,,#C1A470,,,,ROUND,,,,0,28006,1208.42847 +28008,18,東京メトロ半蔵門線,トウキョウメトロハンゾウモンセン,東京メトロ半蔵門線,Tokyo Metro Hanzomon Line,Tokyo Metro Hanzomon Line,半藏门线,한조몬선,#9B7CB6,3,Z,,,,#9B7CB6,,,,ROUND,,,,0,28008,1283.41956 +28009,18,東京メトロ南北線,トウキョウメトロナンボクセン,東京メトロ南北線,Tokyo Metro Namboku Line,Tokyo Metro Namboku Line,南北线,난보쿠선,#00ADA9,3,N,,,,#00ADA9,,,,ROUND,,,,0,28009,1144.78154 +28010,18,東京メトロ副都心線,トウキョウメトロフクトシンセン,東京メトロ副都心線,Tokyo Metro Fukutoshin Line,Tokyo Metro Fukutoshin Line,副都心线,후쿠토신선,#BB641D,3,F,,,,#BB641D,,,,ROUND,,,,0,28010,1327.77135 +29001,19,相鉄本線,ソウテツホンセン,相鉄本線,Sotetsu Main Line,Sotetsu Main Line,相铁本线,소테쓰 본선,#000080,2,SO,,,,#0967B4,,,,REVERSED_SQUARE,,,,0,29001,1417.12757 +29002,19,相鉄いずみ野線,ソウテツイズミノセン,相鉄いずみ野線,Sotetsu Izumino Line,Sotetsu Izumino Line,相铁泉野线,소테쓰 이즈미노선,#000080,2,SO,,,,#0967B4,,,,REVERSED_SQUARE,,,,0,29002,1555.09015 +29003,19,相鉄・JR直通線,ソウテツ・ジェイアールチョクツウセン,相鉄・JR直通線,Sotetsu-JR Link Line,Sotetsu-JR Link Line,相铁·JR直通线,소테츠·JR직통선,#000080,2,SO,JS,JA,,#0967B4,#E31F26,#00B48D,,REVERSED_SQUARE,SQUARE,SQUARE,,0,29003,3270.97376 +29004,19,相鉄新横浜線,ソウテツシンヨコハマセン,相鉄新横浜線,Sotetsu Shin-yokohama Line,Sotetsu Shin-yokohama Line,相铁新横滨线,소테츠 신요코하마선,#000080,2,SO,,,,#0967B4,,,,REVERSED_SQUARE,,,,0,29004,3065.75393 +30001,20,名鉄名古屋本線,メイテツナゴヤホンセン,名鉄名古屋本線,Nagoya Line,Nagoya Line,名古屋本线,나고야 본선,#D12027,2,NH,,,,#D12027,,,,HALF_SQUARE,,,,0,30001,1662.80435 +30002,20,名鉄豊川線,メイテツトヨカワセン,名鉄豊川線,Toyokawa Line,Toyokawa Line,丰川线,도요카와 선,#D12027,2,TK,NH,,,#D12027,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30002,1731.21241 +30003,20,名鉄西尾線,メイテツニシオセン,名鉄西尾線,Nishio Line,Nishio Line,西尾线,니시오 선,#654E9E,2,GN,NH,,,#654E9E,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30003,1864.89715 +30004,20,名鉄蒲郡線,メイテツガマゴオリセン,名鉄蒲郡線,Gamagori Line,Gamagori Line,蒲郡线,가마고리 선,#654E9E,2,GN,NH,,,#654E9E,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30004,1890.88623 +30005,20,名鉄三河線,メイテツミカワセン,名鉄三河線,Mikawa Line,Mikawa Line,三河线,미카와 선,#9EB03A,2,MY,NH,MU,,#9EB03A,#D12027,#654E9E,,HALF_SQUARE,HALF_SQUARE,HALF_SQUARE,,0,30005,1770.04093 +30006,20,名鉄豊田線,メイテツトヨタセン,名鉄豊田線,Toyota Line,Toyota Line,丰田线,도요타 선,#9EB03A,2,TT,MY,,,#9EB03A,#9EB03A,,,HALF_SQUARE,HALF_SQUARE,,,0,30006,2044.5201 +30007,20,名鉄常滑・空港線,メイテツトコナメクウコウセン,名鉄空港線,Airport Line,Airport Line,机场线,쿠코 선,#1065AB,2,TA,NH,,,#1065AB,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30007,2261.47887 +30008,20,名鉄常滑線,メイテツトコナメセン,名鉄常滑線,Tokoname Line,Tokoname Line,常滑线,도코나메 선,#1065AB,2,TA,NH,,,#1065AB,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30008,1381.83694 +30009,20,名鉄河和線,メイテツコウワセン,名鉄河和線,Kowa Line,Kowa Line,河和线,고와 선,#2A9DD8,2,KC,TA,,,#2A9DD8,#1065AB,,,HALF_SQUARE,HALF_SQUARE,,,0,30009,1495.95881 +30010,20,名鉄知多新線,メイテツチタシンセン,名鉄知多新線,Chita Line,Chita Line,知多新线,지타 신선,#2A9DD8,2,KC,TA,,,#2A9DD8,#1065AB,,,HALF_SQUARE,HALF_SQUARE,,,0,30010,2739.0839 +30011,20,名鉄築港線,メイテツチッコウセン,名鉄築港線,Chikko Line,Chikko Line,筑港线,짓코 선,#727171,2,CH,TA,,,#727171,#1065AB,,,HALF_SQUARE,HALF_SQUARE,,,0,30011,1313.02814 +30012,20,名鉄瀬戸線,メイテツセトセン,名鉄瀬戸線,Seto Line,Seto Line,濑户线,세토 선,#990099,2,ST,,,,#7C2982,,,,HALF_SQUARE,,,,0,30012,1050.07891 +30013,20,名鉄津島線,メイテツツシマセン,名鉄津島線,Tsushima Line,Tsushima Line,津岛线,쓰시마 선,#E85624,2,TB,NH,,,#E85624,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30013,1669.75524 +30014,20,名鉄尾西線,メイテツビサイセン,名鉄尾西線,Bisai Line,Bisai Line,尾西线,비사이 선,#E85624,2,TB,BS,NH,,#E85624,#E85624,#D12027,,HALF_SQUARE,HALF_SQUARE,HALF_SQUARE,,0,30014,1451.99735 +30015,20,名鉄犬山線,メイテツイヌヤマセン,名鉄犬山線,Inuyama Line,Inuyama Line,犬山线,이누야마 선,#018B44,2,IY,NH,,,#018B44,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30015,1777.76181 +30016,20,名鉄各務原線,メイテツカカミガハラセン,名鉄各務原線,Kakamigahara Line,Kakamigahara Line,各务原线,가카미가하라 선,#018B44,2,KG,IY,,,#018B44,#018B44,,,HALF_SQUARE,HALF_SQUARE,,,0,30016,1021.66184 +30017,20,名鉄広見線,メイテツヒロミセン,名鉄広見線,Hiromi Line,Hiromi Line,广见线,히로미 선,#018B44,2,HM,IY,,,#018B44,#018B44,,,HALF_SQUARE,HALF_SQUARE,,,0,30017,2136.41769 +30018,20,名鉄小牧線,メイテツコマキセン,名鉄小牧線,Komaki Line,Komaki Line,小牧线,고마키 선,#DA5290,2,KM,IY,,,#DA5290,#018B44,,,HALF_SQUARE,HALF_SQUARE,,,0,30018,1558.11789 +30019,20,犬山モノレール,イヌヤマモノレール,名鉄モンキーパークモノレール線,Inuyama Monorail,Inuyama Monorail,犬山单轨电车,이누야마 모노레일,#808080,5,,,,,,,,,,,,,2,30019,617.56367 +30020,20,名鉄竹鼻線,メイテツタケハナセン,名鉄竹鼻線,Takehana Line,Takehana Line,竹鼻线,다케하나 선,#D7A629,2,TH,NH,,,#D7A629,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30020,1248.15533 +30021,20,名鉄羽島線,メイテツハシマセン,名鉄羽島線,Hashima Line,Hashima Line,羽岛线,하시마 선,#D7A629,2,TH,NH,,,#D7A629,#D12027,,,HALF_SQUARE,HALF_SQUARE,,,0,30021,1280.75978 +31001,21,近鉄難波線,キンテツナンバセン,近鉄難波線,Kintetsu Namba Line,Kintetsu Namba Line,近铁难波线,긴테쓰 난바선,#008000,2,A,,,,#D21644,,,,KINTETSU,,,,0,31001,1058.17493 +31002,21,近鉄橿原線,キンテツカシハラセン,近鉄橿原線,Kintetsu Kashihara Line,Kintetsu Kashihara Line,近铁橿原线,긴테쓰 가시하라선,#DEA83F,2,B,,,,#FAB202,,,,KINTETSU,,,,0,31002,1477.6481 +31003,21,近鉄南大阪線,キンテツミナミオオサカセン,近鉄南大阪線,Kintetsu Minami-Osaka Line,Kintetsu Minami-Osaka Line,近铁南大阪线,긴테쓰 미나미오사카선,#FF1493,2,F,,,,#028E46,,,,KINTETSU,,,,0,31003,1440.61933 +31004,21,近鉄養老線,キンテツヨウロウセン,近鉄養老線,Kintetsu Yoro Line,Kintetsu Yoro Line,近铁养老线,긴테쓰 요로선,#228B22,2,,,,,,,,,,,,,2,31004,2398.89369 +31005,21,近鉄大阪線,キンテツオオサカセン,近鉄大阪線,Kintetsu Osaka Line,Kintetsu Osaka Line,近铁大阪线,긴테쓰 오사카선,#B33249,2,D,,,,#4694D1,,,,KINTETSU,,,,0,31005,2250.1387 +31006,21,近鉄伊賀線,キンテツイガセン,近鉄伊賀線,Kintetsu Iga Line,Kintetsu Iga Line,近铁伊贺线,긴테쓰 이가선,#808080,2,,,,,,,,,,,,,2,31006,1351.96836 +31007,21,近鉄吉野線,キンテツヨシノセン,近鉄吉野線,Kintetsu Yoshino Line,Kintetsu Yoshino Line,近铁吉野线,긴테쓰 요시노선,#339932,2,F,,,,#028E46,,,,KINTETSU,,,,0,31007,1630.97696 +31008,21,近鉄湯の山線,キンテツユノヤマセン,近鉄湯の山線,Kintetsu Yunoyama Line,Kintetsu Yunoyama Line,近铁汤之山线,긴테쓰 유노야마선,#339932,2,K,,,,#153F97,,,,KINTETSU,,,,0,31008,1656.83316 +31009,21,近鉄山田線,キンテツヤマダセン,近鉄山田線,Kintetsu Yamada Line,Kintetsu Yamada Line,近铁山田线,긴테쓰 야마다선,#003399,2,M,,,,#00B3C1,,,,KINTETSU,,,,0,31009,2153.37624 +31010,21,近鉄鳥羽線,キンテツトバセン,近鉄鳥羽線,Kintetsu Toba Line,Kintetsu Toba Line,近铁鸟羽线,긴테쓰 도바선,#339932,2,M,,,,#00B3C1,,,,KINTETSU,,,,0,31010,3248.65164 +31011,21,近鉄天理線,キンテツテンリセン,近鉄天理線,Kintetsu Tenri Line,Kintetsu Tenri Line,近铁天理线,긴테쓰 덴리선,#339932,2,H,,,,#FAB202,,,,KINTETSU,,,,0,31011,1463.19789 +31012,21,近鉄道明寺線,キンテツドウミョウジセン,近鉄道明寺線,Kintetsu Domyoji Line,Kintetsu Domyoji Line,近铁道明寺线,긴테쓰 도묘지선,#1B904A,2,N,,,,#028E46,,,,KINTETSU,,,,0,31012,1057.87702 +31013,247,内部線,ウツベセン,内部線,Utsube Line,Utsube Line,内部线,우쓰베선,#003399,2,,,,,,,,,,,,,0,31013,799.46359 +31014,247,八王子線,ハチオウジセン,八王子線,Hachioji Line,Hachioji Line,八王子线,하치오지선,#003399,2,,,,,,,,,,,,,0,31014,999.00665 +31015,21,近鉄志摩線,キンテツシマセン,近鉄志摩線,Kintetsu Shima Line,Kintetsu Shima Line,近铁志摩线,긴테쓰 시마선,#FF00FF,2,M,,,,#00B3C1,,,,KINTETSU,,,,0,31015,1557.69034 +31016,21,近鉄生駒線,キンテツイコマセン,近鉄生駒線,Kintetsu Ikoma Line,Kintetsu Ikoma Line,近铁生驹线,긴테쓰 이코마선,#F6160D,2,G,,,,#D21644,,,,KINTETSU,,,,0,31016,1081.18343 +31017,21,近鉄田原本線,キンテツタワラモトセン,近鉄田原本線,Kintetsu Tawaramoto Line,Kintetsu Tawaramoto Line,近铁田原本线,긴테쓰 다와라모토선,#003399,2,I,,,,#FAB202,,,,KINTETSU,,,,0,31017,1407.31079 +31018,21,近鉄御所線,キンテツゴセセン,近鉄御所線,Kintetsu Gose Line,Kintetsu Gose Line,近铁御所线,긴테쓰 고세선,#F6160D,2,P,,,,#028E46,,,,KINTETSU,,,,0,31018,1730.13383 +31019,21,近鉄鈴鹿線,キンテツスズカセン,近鉄鈴鹿線,Kintetsu Suzuka Line,Kintetsu Suzuka Line,近铁铃鹿线,긴테쓰 스즈카선,#FF9900,2,L,,,,#153F97,,,,KINTETSU,,,,0,31019,1991.74931 +31020,21,近鉄奈良線,キンテツナラセン,近鉄奈良線,Kintetsu Nara Line,Kintetsu Nara Line,近铁奈良线,긴테쓰 나라선,#B33249,2,A,,,,#D21644,,,,KINTETSU,,,,0,31020,2902.78939 +31021,21,近鉄信貴線,キンテツシギセン,近鉄信貴線,Kintetsu Shigi Line,Kintetsu Shigi Line,近铁信贵线,긴테쓰 시기선,#339932,2,J,,,,#4694D1,,,,KINTETSU,,,,0,31021,1364.86409 +31022,21,近鉄長野線,キンテツナガノセン,近鉄長野線,Kintetsu Nagano Line,Kintetsu Nagano Line,近铁长野线,긴테쓰 나가노선,#003399,2,O,,,,#028E46,,,,KINTETSU,,,,0,31022,1755.60208 +31023,21,近鉄けいはんな線,キンテツケイハンナセン,近鉄けいはんな線,Kintetsu Keihanna Line,Kintetsu Keihanna Line,近铁京阪奈线,긴테쓰 게이한나선,#019A66,2,C,,,,#32CD32,,,,KINTETSU,,,,0,31023,2657.72168 +31024,21,西信貴ケーブル,ニシシギケーブル,近鉄西信貴鋼索線,Nishishigi Cable,Nishishigi Cable,西信贵缆车,니시시기 케이블,#DDDDDD,0,Z,,,,#DD9966,,,,KINTETSU,,,,0,31024,1468.4481 +31025,21,近鉄京都線,キンテツキョウトセン,近鉄京都線,Kintestu Kyoto Line,Kintestu Kyoto Line,近铁京都线,긴테쓰 교토선,#DEA83F,2,B,,,,#FAB202,,,,KINTETSU,,,,0,31025,1414.08952 +31026,21,生駒ケーブル,イコマケーブル,近鉄生駒鋼索線,Ikoma Cable,Ikoma Cable,生驹缆车,이코마 케이블,#AA8861,0,Y,,,,#DD9966,,,,KINTETSU,,,,0,31026,586.83434 +31027,21,近鉄名古屋線,キンテツナゴヤセン,近鉄名古屋線,Kintetsu Nagoya Line,Kintetsu Nagoya Line,近铁名古屋线,긴테쓰 나고야선,#5E34F8,2,E,,,,#153F97,,,,KINTETSU,,,,0,31027,1808.75107 +32001,22,南海本線,ナンカイホンセン,南海本線,Nankai Main Line,Nankai Main Line,南海本线,난카이 본선,#3366CC,2,NK,,,,#000000,,,,NANKAI,,,,0,32001,1583.85625 +32002,22,南海空港線,ナンカイクウコウセン,南海空港線,Nankai Airport Line,Nankai Airport Line,南海机场线,난카이 공항선,#996699,2,NK,,,,#000000,,,,NANKAI,,,,0,32002,4277.22275 +32003,22,南海和歌山港線,ナンカイワカヤマコウセン,南海和歌山港線,Nankai Wakayamako Line,Nankai Wakayamako Line,南海和歌山港线,난카이 와카야마코선,#3366CC,2,NK,,,,#000000,,,,NANKAI,,,,0,32003,2854.7759 +32004,22,南海高師浜線,ナンカイタカシノハマセン,南海高師浜線,Nankai Takashinohama Line,Nankai Takashinohama Line,南海高师浜线,난카이 다카시노하마선,#3366CC,2,NK,,,,#000000,,,,NANKAI,,,,0,32004,713.94106 +32005,22,南海加太線,ナンカイカダセン,南海加太線,Nankai Kada Line,Nankai Kada Line,南海加太线,난카이 가다선,#3366CC,2,NK,,,,#000000,,,,NANKAI,,,,0,32005,1468.18212 +32006,22,南海多奈川線,ナンカイタナガワセン,南海多奈川線,Nankai Tanagawa Line,Nankai Tanagawa Line,南海多奈川线,난카이 다나가와선,#3366CC,2,NK,,,,#000000,,,,NANKAI,,,,0,32006,801.73389 +32007,22,南海高野線,ナンカイコウヤセン,南海高野線,Nankai Koya Line,Nankai Koya Line,南海高野线,난카이 고야선,#009900,2,NK,,,,#000000,,,,NANKAI,,,,0,32007,1508.08877 +32008,22,南海高野山ケーブル,ナンカイコウヤサンケーブル,南海高野山ケーブル,Nankai Koyasan Cable,Nankai Koyasan Cable,南海高野山缆车,난카이 고야산 케이블,#009900,0,NK,,,,#000000,,,,NANKAI,,,,0,32008,962.35557 +32009,22,南海汐見橋線,ナンカイシオミバシセン,南海汐見橋線,Nankai Shiomibashi Line,Nankai Shiomibashi Line,南海汐见桥线,난카이 시오미바시선,#009900,2,NK,,,,#000000,,,,NANKAI,,,,0,32009,936.41681 +33001,23,京阪本線,ケイハンホンセン,京阪本線,Keihan Main Line,Keihan Main Line,京阪本线,게이한 본선,#66CC33,2,KH,,,,#1D2088,,,,KEIHAN,,,,0,33001,1238.09532 +33002,23,京阪宇治線,ケイハンウジセン,京阪宇治線,Keihan Uji Line,Keihan Uji Line,京阪宇治线,게이한 우지선,#00AE00,2,KH,,,,#1D2089,,,,KEIHAN,,,,0,33002,1073.40383 +33003,23,京阪交野線,ケイハンカタノセン,京阪交野線,Keihan Katano Line,Keihan Katano Line,京阪交野线,게이한 가타노선,#00AE00,2,KH,,,,#1D2090,,,,KEIHAN,,,,0,33003,951.2774 +33004,23,京阪鴨東線,ケイハンオウトウセン,京阪鴨東線,Keihan Oto Line,Keihan Oto Line,京阪鸭东线,게이한 오토선,#00AE00,2,KH,,,,#1D2091,,,,KEIHAN,,,,0,33004,1142.05789 +33005,23,石清水八幡宮参道ケーブル,イワシミズハチマングウサンドウケーブル,京阪鋼索線,Iwashimizuhachiman Sando Cable,Iwashimizuhachiman Sando Cable,石清水八幡宫参道缆车,이와시미즈하치만구 산도 케이블,#DBA75A,0,,,,,,,,,,,,,0,33005,445.1874 +33006,23,京阪石山坂本線,ケイハンイシヤマサカモトセン,京阪石山坂本線,Keihan Ishiyama Sakamoto Line,Keihan Ishiyama Sakamoto Line,京阪石山坂本线,게이한 이시야마사카모토선,#009933,4,OT,,,,#1D2091,,,,KEIHAN,,,,0,33006,718.51102 +33007,23,京阪京津線,ケイハンケイシンセン,京阪京津線,Keihan Keishin Line,Keihan Keishin Line,京阪京津线,게이한 게이신선,#FFCC00,4,OT,T,,,#1D2091,#FF4500,,,KEIHAN,REVERSED_ROUND,,,0,33007,1195.90325 +33008,23,京阪中之島線,ケイハンナカノシマセン,京阪中之島線,Keihan Nakanoshima Line,Keihan Nakanoshima Line,京阪中之岛线,게이한 나카노시마선,#00AE00,2,KH,,,,#1D2088,,,,KEIHAN,,,,0,33008,751.54697 +34001,24,阪急神戸本線,ハンキュウコウベホンセン,阪急神戸本線,Hankyu Kobe Main Line,Hankyu Kobe Main Line,阪急神户本线,한큐 고베 본선,#0000FF,2,HK,,,,#007AC4,,,,HANKYU,,,,0,34001,2117.44985 +34002,24,阪急宝塚本線,ハンキュウタカラヅカホンセン,阪急宝塚本線,Hankyu Takarazuka Main Line,Hankyu Takarazuka Main Line,阪急宝塚本线,한큐 다카라즈카 본선,#FF00CC,2,HK,,,,#F26627,,,,HANKYU,,,,0,34002,1322.49263 +34003,24,阪急京都本線,ハンキュウキョウトホンセン,阪急京都本線,Hankyu Kyoto Main Line,Hankyu Kyoto Main Line,阪急京都本线,한큐 교토 본선,#33CC00,2,HK,,,,#2A9B50,,,,HANKYU,,,,0,34003,1740.94577 +34004,24,阪急今津線,ハンキュウイマヅセン,阪急今津線,Hankyu Imazu Line,Hankyu Imazu Line,阪急今津线,한큐 이마즈선,#0000FF,2,HK,,,,#007AC4,,,,HANKYU,,,,0,34004,1034.3153 +34005,24,阪急甲陽線,ハンキュウコウヨウセン,阪急甲陽線,Hankyu Koyo Line,Hankyu Koyo Line,阪急甲阳线,한큐 고요선,#0000FF,2,HK,,,,#007AC4,,,,HANKYU,,,,0,34005,1067.57925 +34006,24,阪急伊丹線,ハンキュウイタミセン,阪急伊丹線,Hankyu Itami Line,Hankyu Itami Line,阪急伊丹线,한큐 이타미선,#0000FF,2,HK,,,,#007AC4,,,,HANKYU,,,,0,34006,1008.54806 +34007,24,阪急箕面線,ハンキュウミノオセン,阪急箕面線,Hankyu Mino Line,Hankyu Mino Line,阪急箕面线,한큐 미노오선,#FF00CC,2,HK,,,,#F26627,,,,HANKYU,,,,0,34007,1300.92808 +34008,24,阪急千里線,ハンキュウセンリセン,阪急千里線,Hankyu Senri Line,Hankyu Senri Line,阪急千里线,한큐 센리선,#33CC00,2,HK,K,,,#2A9B50,#814721,,,HANKYU,REVERSED_ROUND,,,0,34008,1308.95808 +34009,24,阪急嵐山線,ハンキュウアラシヤマセン,阪急嵐山線,Hankyu Arashiyama Line,Hankyu Arashiyama Line,阪急岚山线,한큐 아라시야마선,#33CC00,2,HK,,,,#2A9B50,,,,HANKYU,,,,0,34009,1331.78071 +35001,25,阪神本線,ハンシンホンセン,阪神本線,Hanshin Main Line,Hanshin Main Line,阪神本线,한신 본선,#FFA00E,2,HS,,,,#1F64B1,,,,HANSHIN,,,,0,35001,986.45703 +35002,25,阪神なんば線,ハンシンナンバセン,阪神なんば線,Hanshin Namba Line,Hanshin Namba Line,阪神难波线,한신 난바선,#6BB5E6,2,HS,,,,#1F64B1,,,,HANSHIN,,,,0,35002,994.11761 +35003,25,阪神武庫川線,ハンシンムコガワセン,阪神武庫川線,Hanshin Mukogawa Line,Hanshin Mukogawa Line,阪神武库川线,한신 무코가와선,#4A74B0,2,HS,,,,#1F64B1,,,,HANSHIN,,,,0,35003,568.11583 +36001,26,西鉄天神大牟田線,ニシテツテンジンオオムタセン,西鉄天神大牟田線,Nishitetsu Tenjin Omuta Line,Nishitetsu Tenjin Omuta Line,西铁天神大牟田线,니시테쓰 덴진오무타선,#1065AB,2,T,,,,#1065AB,,,,NISHITETSU,,,,0,36001,1518.43874 +36002,26,西鉄太宰府線,ニシテツダザイフセン,西鉄太宰府線,Nishitetsu Dazaifu Line,Nishitetsu Dazaifu Line,西铁太宰府线,니시테쓰 다자이후선,#FD8A02,2,D,T,,,#1065AB,#1065AB,,,NISHITETSU,NISHITETSU,,,0,36002,1189.57765 +36003,26,西鉄甘木線,ニシテツアマギセン,西鉄甘木線,Nishitetsu Amagi Line,Nishitetsu Amagi Line,西铁甘木线,니시테쓰 아마기선,#1065AB,2,A,T,,,#1065AB,,,,NISHITETSU,,,,0,36003,1576.97881 +36004,26,西鉄貝塚線,ニシテツカイヅカセン,西鉄貝塚線,Nishitetsu Kaizuka Line,Nishitetsu Kaizuka Line,西铁贝冢线,니시테쓰 가이즈카선,#1065AB,2,NK,,,,#1065AB,,,,NISHITETSU,,,,0,36004,1190.996 +99101,101,札幌市営地下鉄東西線,サッポロシエイチカテツトウザイセン,札幌市営地下鉄東西線,Sapporo Municipal Subway Tozai Line,Sapporo Municipal Subway Tozai Line,札幌市营地铁东西线,삿포로 시영 지하철 도자이선,#FFA500,3,T,,,,#FFA500,,,,ROUND,,,,0,99101,1110.60862 +99102,101,札幌市営地下鉄南北線,サッポロシエイチカテツナンボクセン,札幌市営地下鉄南北線,Sapporo Municipal Subway Namboku Line,Sapporo Municipal Subway Namboku Line,札幌市营地铁南北线,삿포로 시영 지하철 난보쿠선,#008000,3,N,,,,#008000,,,,ROUND,,,,0,99102,947.50386 +99103,101,札幌市営地下鉄東豊線,サッポロシエイチカテツトウホウセン,札幌市営地下鉄東豊線,Sapporo Municipal Subway Toho Line,Sapporo Municipal Subway Toho Line,札幌市营地铁东丰线,삿포로 시영 지하철 도호선,#0080FF,3,H,,,,#0080FF,,,,ROUND,,,,0,99103,1113.91678 +99104,252,札幌市電,サッポロシデン,札幌市電 一条・山鼻軌道線,Yamahana Streetcar Line,Yamahana Streetcar Line,札幌市电,삿포로 시덴,#2A74BC,4,SC,,,,#2A74BC,,,,ROUND,,,,0,99104,458.55484 +99105,102,函館市電2系統,ハコダテシデンニケイトウ,函館市電2系統,Hakodate Streetcar Route 2,Hakodate Streetcar Route 2,函馆市电2系统,하코다테 시덴 2계통,#004896,4,DY,Y,,,#004896,,,,ROUND,,,,0,99105,452.62201 +99106,102,函館市電5系統,ハコダテシデンゴケイトウ,函館市電5系統,Hakodate Streetcar Route 5,Hakodate Streetcar Route 5,函馆市电5系统,하코다테 시덴 5계통,#004896,4,DY,D,,,#004896,,,,ROUND,,,,0,99106,467.86281 +99107,103,ふるさと銀河線,フルサトギンガセン,北海道ちほく高原鉄道ふるさと銀河線,Furusato Ginga Line,Furusato Ginga Line,故乡银河线,후루사토 긴가선,#B63238,2,,,,,,,,,,,,,2,99107,4695.94041 +99108,248,道南いさりび鉄道線,ドウナンイサリビテツドウセン,道南いさりび鉄道線,South Hokkaido Railway Line,South Hokkaido Railway Line,道南渔火铁道线,도난이사리비 철도선,#246DAC,2,sh,H,,,#246DAC,#0072BC,,,REVERSED_ROUND,ROUND,,,0,99108,3386.87637 +99201,104,津軽鉄道線,ツガルテツドウセン,津軽鉄道線,Tsugaru Railway Line,Tsugaru Railway Line,津轻铁道线,쓰가루 철도선,#8D8335,2,,,,,,,,,,,,,0,99201,1815.8183 +99202,105,弘南鉄道弘南線,コウナンテツドウコウナンセン,弘南鉄道弘南線,Konan Railway Konan Line,Konan Railway Konan Line,弘南铁道弘南线,고난 철도 고난선,#1E9B49,2,KK,,,,#231816,,,,REVERSED_ROUND,,,,0,99202,1360.44342 +99203,105,弘南鉄道大鰐線,コウナンテツドウオオワニセン,弘南鉄道大鰐線,Konan Railway Owani Line,Konan Railway Owani Line,弘南铁道大鳄线,고난 철도 오와니선,#F39918,2,KW,,,,#D80C18,,,,REVERSED_ROUND,,,,0,99203,1043.47334 +99204,106,十和田観光電鉄線,トワダカンコウデンテツセン,十和田観光電鉄線,Towada Kanko Electric Railway Line,Towada Kanko Electric Railway Line,十和田观光电铁线,도와다 관광 전철선,#2826FE,2,,,,,,,,,,,,,2,99204,1581.06990 +99205,107,いわて銀河鉄道線,イワテギンガテツドウセン,いわて銀河鉄道線,Iwate Galaxy Railway Line,Iwate Galaxy Railway Line,岩手银河铁道线,이와테 긴가 철도선,#003399,2,,,,,,,,,,,,,0,99205,4773.70355 +99206,108,青い森鉄道線,アオイモリテツドウセン,青い森鉄道線,Aoimori Railway Line,Aoimori Railway Line,青森铁道线,아오이모리 철도선,#00FFFF,2,,,,,,,,,,,,,0,99206,4646.29433 +99207,109,三陸鉄道北リアス線,サンリクテツドウキタリアスセン,三陸鉄道北リアス線,Sanriku Railway North Rias Line,Sanriku Railway North Rias Line,三陆铁道北里亚斯线,산리쿠 철도 기타리아스선,#EC6821,2,,,,,,,,,,,,,2,99207,0 +99208,109,三陸鉄道リアス線,サンリクテツドウリアスセン,三陸鉄道リアス線,Sanriku Railway Rias Line,Sanriku Railway Rias Line,三陆铁道里亚斯线,산리쿠 철도 리아스선,#EC6821,2,,,,,,,,,,,,,0,99208,4007.72176 +99209,110,秋田内陸線,アキタナイリクセン,秋田内陸縦貫鉄道秋田内陸線,Akita Nairiku Line,Akita Nairiku Line,秋田内陆线,아키타 나이리쿠선,#990000,2,,,,,,,,,,,,,0,99209,3317.10338 +99210,111,鳥海山ろく線,チョウカイサンロクセン,由利高原鉄道鳥海山ろく線,Chokai Sanroku Line,Chokai Sanroku Line,鸟海山麓线,조카이산로쿠선,#B5E61D,2,,,,,,,,,,,,,0,99210,2051.2472 +99211,112,フラワー長井線,ヤマガタテツドウフラワーナガイセン,山形鉄道フラワー長井線,Flower Nagai Line,Flower Nagai Line,花长井线,플라워 나가이선,#F892F4,2,,,,,,,,,,,,,0,99211,1882.55335 +99212,113,くりはら田園鉄道線,クリハラデンエンテツドウセン,くりはら田園鉄道線,Kurihara Den'en Railway Line,Kurihara Den'en Railway Line,栗原田园铁道线,구리하라 덴엔 철도선,#8E2229,2,,,,,,,,,,,,,2,99212,1907.17502 +99213,114,阿武隈急行線,アブクマキュウコウセン,阿武隈急行線,Abukuma Kyūkō Line,Abukuma Kyūkō Line,阿武隈急行线,아부쿠마 급행선,#37CB7F,2,,,,,,,,,,,,,0,99213,2369.63173 +99214,115,仙台市営地下鉄南北線,センダイシエイチカテツナンボクセン,仙台市営地下鉄南北線,Sendai Subway Namboku Line,Sendai Subway Namboku Line,仙台市营地铁南北线,센다이 시영 지하철 난보쿠선,#339966,3,N,,,,#339966,,,,ROUND,,,,0,99214,891.24713 +99218,115,仙台市営地下鉄東西線,センダイシエイチカテツトウザイセン,仙台市営地下鉄東西線,Sendai Subway Tozai Line,Sendai Subway Tozai Line,仙台市营地铁东西线,센다이 시영 지하철 도자이선,#00B1DD,3,T,,,,#00B1DD,,,,ROUND,,,,0,99214,1129.33276 +99215,116,福島交通飯坂線,フクシマシエイコウツウイイザカセン,福島交通飯坂線,Fukushima Kotsu Iizaka Line,Fukushima Kotsu Iizaka Line,福岛交通饭坂线,후쿠시마 교통 이이자카선,#BFBFFF,2,,,,,,,,,,,,,0,99215,855.93195 +99216,117,会津鉄道会津線,アイヅテツドウアイヅセン,会津鉄道会津線,Aizu Railway Aizu Line,Aizu Railway Aizu Line,会津铁道会津线,아이즈 철도 아이즈선,#265613,2,,,,,,,,,,,,,0,99216,2815.55776 +99217,118,仙台空港線,センダイクウコウセン,仙台空港鉄道仙台空港線,Sendai Airport Line,Sendai Airport Line,仙台机场线,센다이 공항선,#2A5CAA,2,,,,,,,,,,,,,0,99217,2316.47225 +99301,119,都営大江戸線,トエイオオエドセン,都営大江戸線,Toei Oedo Line,Toei Oedo Line,都营大江户线,도에이 오에도선,#B6007A,3,E,,,,#B6007A,,,,ROUND,,,,0,99301,1066.83815 +99302,119,都営浅草線,トエイアサクサセン,都営浅草線,Toei Asakusa Line,Toei Asakusa Line,都营浅草线,도에이 아사쿠사선,#EC6E65,3,A,,,,#EC6E65,,,,ROUND,,,,0,99302,952.38538 +99303,119,都営三田線,トエイミタセン,都営三田線,Toei Mita Line,Toei Mita Line,都营三田线,도에이 미타선,#0079C2,3,I,,,,#0079C2,,,,ROUND,,,,0,99303,992.91929 +99304,119,都営新宿線,トエイシンジュクセン,都営新宿線,Toei Shinjuku Line,Toei Shinjuku Line,都营新宿线,도에이 신주쿠선,#B0BF1E,3,S,,,,#B0BF1E,,,,ROUND,,,,0,99304,1157.85443 +99305,119,東京さくらトラム(都電荒川線),トウキョウサクラトラム(トデンアラカワセン),都営都電荒川線,Tokyo Sakura Tram,Tokyo Sakura Tram,都电荒川线,도덴 아라카와선,#EE86A7,4,SA,,,,#EE86A7,,,,REVERSED_ROUND,,,,0,99305,437.36399 +99342,119,日暮里・舎人ライナー,ニッポリ・トネリライナー,日暮里・舎人ライナー,Nippori-Toneri Liner,Nippori-Toneri Liner,日暮里-舍人线,닛포리·도네리 라이너,#69B444,5,NT,,,,#69B444,,,,NTL,,,,0,99305,817.56071 +99306,120,秩父鉄道秩父本線,チチブテツドウチチブホンセン,秩父鉄道秩父本線,Chichibu Railway Chichibu Main Line,Chichibu Railway Chichibu Main Line,秩父铁道秩父本线,지치부 철도 지치부 본선,#0054A6,2,CR,,,,#0054A6,,,,ROUND,,,,0,99306,1959.10704 +99307,121,埼玉高速鉄道線,サイタマコウソクテツドウセン,埼玉高速鉄道線,Saitama Rapid Railway Line,Saitama Rapid Railway Line,埼玉高速铁道线,사이타마 고속 철도선,#3565AD,2,SR,,,,#3565AD,,,,ROUND,,,,0,99307,2047.79834 +99308,122,いすみ線,イスミセン,いすみ鉄道いすみ線,Isumi Line,Isumi Line,夷隅线,이스미선,#FFDC00,2,,,,,,,,,,,,,0,99308,2002.27441 +99309,123,つくばエクスプレス線,ツクバエクスプレスセン,首都圏新都市鉄道つくばエクスプレス,Tsukuba Express Line,Tsukuba Express Line,筑波快线,쓰쿠바 익스프레스,#273E6C,2,TX,,,,#273E6C,,,,REVERSED_SQUARE,,,,0,99309,3016.22347 +99310,124,みなとみらい線,ミナトミライセン,みなとみらい21線,Minatomirai Line,Minatomirai Line,港未来线,미나토미라이선,#013274,2,MM,,,,#013274,,,,REVERSED_SQUARE,,,,0,99310,793.27142 +99311,125,ゆりかもめ,ユリカモメ,ゆりかもめ東京臨海新交通臨海線,Yurikamome,Yurikamome,百合鸥,유리카모메,#00418E,5,U,,,,#00418E,,,,REVERSED_ROUND,,,,0,99311,936.45551 +99312,126,わたらせ渓谷線,ワタラセケイコクセン,わたらせ渓谷鐵道わたらせ渓谷線,Watarase Keikoku Line,Watarase Keikoku Line,渡良濑溪谷线,와타라세 계곡선,#5B1511,2,WK,,,,#5B1511,,,,ROUND,,,,0,99312,2683.8255 +99313,127,ユーカリが丘線,ユーガリガオカセン,山万ユーカリが丘線,Yukarigaoka Line,Yukarigaoka Line,有加利丘线,유카리가오카선,#30B474,5,,,,,#5B1511,,,,ROUND,,,,0,99313,681.93148 +99314,128,伊豆箱根鉄道大雄山線,イズハコネテツドウダイユウザンセン,伊豆箱根鉄道大雄山線,Izuhakone Railway Daiyuzan Line,Izuhakone Railway Daiyuzan Line,伊豆箱根铁道大雄山线,이즈하코네 철도 다이유잔선,#4086E5,2,ID,,,,#4086E5,,,,IZUHAKONE,,,,0,99314,861.50661 +99315,129,ひたちなか海浜鉄道湊線,ヒタチナカカイヒンテツドウミナトセン,ひたちなか海浜鉄道湊線,Hitachinaka Seaside Railway,Hitachinaka Seaside Railway,常陆那珂海滨铁道凑线,히타치나카 해안철도 미나토선,#A77718,2,,,,,,,,,,,,,0,99315,1390.85906 +99316,130,横浜市営地下鉄ブルーライン,ヨコハマシエイチカテツブルーライン,横浜市高速鉄道1号線・3号線,Yokohama Municipal Subway Blue Line,Yokohama Municipal Subway Blue Line,横滨市营地铁蓝线,요코하마 시영 지하철 블루 라인,#005BA5,3,B,,,,#005BA5,,,,REVERSED_ROUND,,,,0,99316,1273.71378 +99343,130,横浜市営地下鉄グリーンライン,ヨコハマシエイチカテツグリーンライン,横浜市高速鉄道4号線,Yokohama Municipal Subway Green Line,Yokohama Municipal Subway Green Line,横滨市营地铁绿线,요코하마 시영 지하철 그린 라인,#40CC40,3,G,,,,#40CC40,,,,REVERSED_ROUND,,,,0,99316,1391.75413 +99317,131,金沢シーサイドライン,カナザワシーサイドライン,横浜新都市交通金沢シーサイドライン,Kanazawa Seaside Line,Kanazawa Seaside Line,横滨海岸线,요코하마 시사이드라인,#F68B1E,5,,,,,#5466BC,,,,REVERSED_ROUND_HORIZONTAL,,,,0,99317,774.45917 +99318,132,関東鉄道常総線,カントウテツドウジョウソウセン,関東鉄道常総線,Kanto Railway Joso Line,Kanto Railway Joso Line,关东铁道常总线,간토 철도 조소선,#121892,2,,,,,,,,,,,,,0,99318,2131.01169 +99319,132,関東鉄道竜ヶ崎線,カントウテツドウリュウガサキセン,関東鉄道竜ヶ崎線,Kanto Railway Ryugasaki Line,Kanto Railway Ryugasaki Line,关东铁道龙崎线,간토 철도 류가사키선,#121892,2,,,,,,,,,,,,,0,99319,2173.64206 +99320,133,江ノ島電鉄線,エノシマデンテツセン,江ノ島電鉄線,Enoshima Electric Railway Line,Enoshima Electric Railway Line,江之岛电铁线,에노시마 전철선,#209A3F,2,EN,,,,#209A3F,,,,ENODEN,,,,0,99320,682.96003 +99321,134,ニューシャトル,ニューシャトル,埼玉新都市交通伊奈線,New Shuttle,New Shuttle,伊奈线,이나선,#339999,5,NS,,,,#339999,,,,NEW_SHUTTLE,,,,0,99321,1075.79739 +99322,135,鹿島鉄道線,カシマテツドウセン,鹿島鉄道線,Kashima Railway Line,Kashima Railway Line,鹿岛鉄道线,카시마 철도선,#CC0000,2,,,,,,,,,,,,,2,99322,1887.65696 +99323,136,鹿島臨海鉄道大洗鹿島線,カシマリンカイテツドウオオアライカシマセン,鹿島臨海鉄道大洗鹿島線,Oarai Kashima Line,Oarai Kashima Line,鹿岛临海铁道大洗鹿岛线,가시마 임해 철도 오아라이카시마선,#3260C0,2,,,,,,,,,,,,,0,99323,3711.69043 +99324,137,芝山鉄道線,シバヤマテツドウセン,芝山鉄道線,Shibayama Railway Line,Shibayama Railway Line,芝山铁道线,시바야마 철도선,#33CC33,2,SR,KS,,,#007F5A,#005AAA,,,KEISEI,KEISEI,,,0,99324,2107.62382 +99325,138,小湊鉄道線,コミナトテツドウセン,小湊鉄道線,Kominato Line,Kominato Line,小凑铁道线,코미나토 철도선,#DCBC9F,2,,,,,,,,,,,,,0,99325,2249.53509 +99326,139,湘南モノレール,ショウナンモノレール,江の島線,Shonan Monorail,Shonan Monorail,湘南单轨电车,쇼난 모노레일,#3E7AFF,5,SMR,,,,#000000,,,,SMR,,,,0,99326,895.55729 +99327,140,上信電鉄,ジョウシンデンテツ,上信電鉄,Joshin Dentetsu Line,Joshin Dentetsu Line,上信电铁,조신 전철,#457BC6,2,,,,,,,,,,,,,0,99327,1648.16489 +99328,141,上毛電気鉄道上毛線,ジョウモウデンキテツドウジョウモウセン,上毛電気鉄道上毛線,Jomo Line,Jomo Line,上毛电气铁道上毛线,조모 전기 철도 조모선,#40E0D0,2,JM,,,,#40E0D0,,,,ROUND,,,,0,99328,1118.88779 +99329,13,京成松戸線,ケイセイマツドセン,京成電鉄松戸線,Keisei Matsudo Line,Keisei Matsudo Line,京成松户线,게이세이 마쓰도선,#005AAA,2,KS,,,,#005AAA,,,,KEISEI,,,,0,99329,1112.85437 +99330,143,真岡鐵道真岡線,モオカテツドウモオカセン,真岡鐵道真岡線,Moka Line,Moka Line,真冈铁道真冈线,모카 철도 모카선,#EE5B5B,2,,,,,,,,,,,,,0,99330,2586.20889 +99331,144,千葉都市モノレール1号線,チバトシモノレールイチゴウセン,千葉都市モノレール1号線,Chiba Urban Monorail Line 1,Chiba Urban Monorail Line 1,千叶都市单轨电车1号线,지바 도시 모노레일 1호선,#192198,5,CM,,,,#3E8BAD,,,,ROUND,,,,0,99331,566.66594 +99332,144,千葉都市モノレール2号線,チバトシモノレールニゴウセン,千葉都市モノレール2号線,Chiba Urban Monorail Line 2,Chiba Urban Monorail Line 2,千叶都市单轨电车2号线,지바 도시 모노레일 2호선,#192198,5,CM,,,,#3E8BAD,,,,ROUND,,,,0,99332,916.35638 +99333,145,流鉄流山線,リュウテツナガレヤマセン,流鉄流山線,Ryutetsu Nagareyama Line,Ryutetsu Nagareyama Line,流铁流山线,류테츠나가레야마선,#B58429,2,RN,,,,#B58429,,,,ROUND,,,,0,99333,1090.40105 +99334,146,多摩モノレール,タマモノレール,多摩都市モノレール線,Tama Toshi Monorail Line,Tama Toshi Monorail Line,多摩都市单轨电车线,다마 도시 모노레일선,#FF6633,5,TT,,,,#37615E,,,,SQUARE,,,,0,99334,870.36393 +99335,147,銚子電鉄線,チョウシデンテツセン,銚子電気鉄道線,Choshi Electric Railway Line,Choshi Electric Railway Line,铫子电气铁道线,조시 전기철도선,#A52A2A,2,CD,,,,#333333,,,,SQUARE,,,,0,99335,723.60043 +99336,148,東京モノレール,トウキョウモノレール,東京モノレール羽田空港線,Tokyo Monorail,Tokyo Monorail,东京单轨电车,도쿄 모노레일,#003686,5,MO,,,,#003686,,,,SQUARE,,,,0,99336,1730.1195 +99337,149,りんかい線,リンカイセン,東京臨海高速鉄道りんかい線,Rinkai Line,Rinkai Line,临海线,린카이선,#00418E,2,R,,,,#00418E,,,,TWR,,,,0,99337,1739.57769 +99338,150,東葉高速線,トウヨウコウソクセン,東葉高速鉄道東葉高速線,Toyo Rapid Railway Line,Toyo Rapid Railway Line,东叶高速线,도요 고속선,#66CC00,2,TR,,,,#66CC00,,,,ROUND,,,,0,99338,2026.46605 +99339,151,箱根登山鉄道鉄道線,ハコネトザンテツドウテツドウセン,箱根登山鉄道鉄道線,Hakone Tozan Line,Hakone Tozan Line,箱根登山线,하코네 등산선,#F04A00,2,OH,,,,#F04A00,,,,HAKONE,,,,0,99339,1393.88661 +99340,152,北総鉄道北総線,ホクソウテツドウホクソウセン,北総鉄道北総線,Hokuso Line,Hokuso Line,北总铁道北总线,호쿠소 철도 호쿠소선,#3333FF,2,HS,KS,,,#3333FF,#005AAA,,,KEISEI,KEISEI,,,0,99340,2282.3843 +99341,153,ほっとスパ・ライン,ホットスパライン,野岩鉄道会津鬼怒川線,Yagan Railway Aizu Kinugawa Line,Yagan Railway Aizu Kinugawa Line,野岩铁道会津鬼怒川线,야간 철도 아이즈키누가와선,#00733C,2,,,,,,,,,,,,,0,99341,3792.83721 +99344,151,箱根登山ケーブルカー,ハコネトザンケーブルカー,箱根登山鉄道鋼索線,Hakone Tozan Cable Car,Hakone Tozan Cable Car,箱根登山缆车,하코네 등산 케이블카,#BE3C27,0,,,,,,,,,,,,,0,99344,285.33449 +99345,250,芳賀・宇都宮LRT,ウツノミヤハガライトレールセン,宇都宮芳賀ライトレール線,Haga Utsunomiya LRT,Haga Utsunomiya LRT,芳贺/宇都宫LRT,하가 · 우츠노미야 LRT,#F9BE00,4,,,,,#F9BE00,,,,MONOCHROME_ROUND,,,,0,99345,784.19167 +99401,154,富士急行線,フジキュウコウセン,富士急行線,Fujikyuko Line,Fujikyuko Line,富士急行线,후지큐코선,#E83917,2,FJ,,,,#000000,,,,ROUND,,,,0,99401,1488.82123 +99402,155,北越急行ほくほく線,ホクエツキュウコウホクホクセン,北越急行ほくほく線,Hokuhoku Line,Hokuhoku Line,北越急行北北线,호쿠에쓰 급행 호쿠호쿠선,#CC3366,2,,,,,,,,,,,,,0,99402,5366.7774 +99403,156,しなの鉄道線,シナノテツドウセン,しなの鉄道線,Shinano Railway Line,Shinano Railway Line,信浓铁道线,시나노 철도선,#F0A401,2,,,,,,,,,,,,,0,99403,3335.19718 +99427,156,北しなの線,キタシナノセン,北しなの線,Kita-Shinano Line,Kita-Shinano Line,北信浓线,기타시나노선,#FEC9FE,2,,,,,,,,,,,,,0,99403,5132.73044 +99404,157,上田電鉄別所線,ウエダデンテツベッショセン,上田電鉄別所線,Ueda Electric Railway Bessho Line,Ueda Electric Railway Bessho Line,上田电铁别所线,우에다 전철 벳쇼선,#0B2846,2,BE,,,,#0B2846,,,,REVERSED_ROUND,,,,0,99404,787.89761 +99405,158,長野電鉄長野線,ナガノデンテツナガノセン,長野電鉄長野線,Nagano Electric Railway Nagano Line,Nagano Electric Railway Nagano Line,长野电铁长野线,나가노 전철 나가노선,#E21919,2,N,,,,#E21919,,,,ROUND,,,,0,99405,1389.13664 +99406,158,長野電鉄屋代線,ナガノデンテツヤシロセン,長野電鉄屋代線,Nagano Electric Railway Yashiro Line,Nagano Electric Railway Yashiro Line,长野电铁屋代线,나가노 전철 야시로선,#E21919,2,Y,,,,#E21919,,,,ROUND,,,,2,99406,2195.43210 +99407,159,上高地線,カミコウチセン,アルピコ交通上高地線,Kamikochi Line,Kamikochi Line,上高地线,가미코치선,#465DAA,2,AK,,,,#465DAA,,,,ROUND,,,,0,99407,1084.96874 +99408,160,富山地鉄本線,トヤマチテツホンセン,富山地鉄本線,Toyama Chiho Railway Main Line,Toyama Chiho Railway Main Line,富山地铁本线,도야마 지방 철도 본선,#1D1686,2,T,,,,#1D1686,,,,SQUARE,,,,0,99408,1312.56347 +99409,160,富山地鉄立山線,トヤマチテツタテヤマセン,富山地鉄立山線,Toyama Chiho Railway Tateyama Line,Toyama Chiho Railway Tateyama Line,富山地铁立山线,도야마 지방 철도 다테야마선,#008000,2,T,,,,#008000,,,,SQUARE,,,,0,99409,1834.83282 +99410,160,富山地鉄不二越・上滝線,トヤマチテツフジコシ・カミダキセン,富山地鉄不二越・上滝線,Toyama Chiho Railway Fujikoshi-Kamidaki Line,Toyama Chiho Railway Fujikoshi-Kamidaki Line,富山地铁不二越・上泷线,도야마 지방 철도 후지코시·가미다키선,#7E490A,2,T,,,,#7E490A,,,,SQUARE,,,,0,99410,1139.17683 +99411,161,神岡鉄道神岡線,カミオカテツドウカミオカセン,神岡鉄道神岡線,Kamioka Railway Kamioka Line,Kamioka Railway Kamioka Line,神冈铁道神冈线,가미오카 철도 가미오카선,#DC4C14,2,,,,,,,,,,,,,2,99411,3068.94038 +99412,162,黒部峡谷鉄道本線,クロベキョウコクテツドウホンセン,黒部峡谷鉄道本線,Kurobe Gorge Main Line,Kurobe Gorge Main Line,黑部峡谷铁道本线,구로베 협곡 철도 본선,#EE7700,2,,,,,,,,,,,,,0,99412,5823.20369 +99413,160,富山地鉄市内線【1・2系統】,トヤマチテツシナイセン,富山地鉄市内線,Toyama City Tram Line Route 1/2,Toyama City Tram Line Route 1/2,富山地铁市内线【1・2系统】,도야마 지방 철도 시내선【1·2계통】,#EF1731,4,C,,,,#EF1731,,,,ROUND,,,,0,99413,390.42487 +99422,160,富山地鉄富山都心線【3系統(環状線)】,トヤマチテツトヤマトシンセン,富山地鉄富山都心線,Toyama City Tram Line Route 3,Toyama City Tram Line Route 3,富山地铁富山都心线【3系统(环状线)】,도야마 지방 철도 도야마 도심선【3계통(순환선)】,#4243BE,4,C,,,,#4243BE,,,,ROUND,,,,0,99413,316.9133 +99414,163,万葉線,マンヨウセン,万葉線,Manyo Line,Manyo Line,万叶线,만요선,#FF0B4B,4,,,,,,,,,,,,,0,99414,651.0786 +99415,160,富山港線,トヤマコウセン,富山港線,Toyamako line,Toyamako line,富山港线,도야마코선,#3698C4,4,C,,,,#3698C4,,,,ROUND,,,,0,99415,565.76659 +99416,165,北陸鉄道石川線,ホクリクテツドウイシカワセン,北陸鉄道石川線,Hokuriku Railroad Ishikawa Line,Hokuriku Railroad Ishikawa Line,北陆铁道石川线,호쿠리쿠 철도 이시카와선,#A9731E,2,I,,,,#008000,,,,ROUND,,,,0,99416,848.60776 +99417,165,北陸鉄道浅野川線,ホクリクテツドウアサノガワセン,北陸鉄道浅野川線,Hokuriku Railroad Asanogawa Line,Hokuriku Railroad Asanogawa Line,北陆铁道浅野川线,호쿠리쿠 철도 아사노가와선,#559652,2,A,,,,#0067C0,,,,ROUND,,,,0,99417,621.57908 +99423,244,日本海ひすいライン,ニホンカイヒスイライン,日本海ひすいライン,Nihonkai Hisui Line,Nihonkai Hisui Line,日本海翡翠线,니혼카이 히스이 라인,#3782BD,2,,,,,,,,,,,,,0,99417,4887.26227 +99424,244,妙高はねうまライン,ミョウコウハネウマライン,妙高はねうまライン,Myoko Haneuma Line,Myoko Haneuma Line,妙高跃马线,묘코 하네우마 라인,#35C98E,2,,,,,,,,,,,,,0,99417,4172.06803 +99425,245,あいの風とやま鉄道線,アイノカゼトヤマテツドウセン,あいの風とやま鉄道線,Ainokaze Toyama Railway Line,Ainokaze Toyama Railway Line,爱之风富山铁道线,아이노카제 도야마 철도선,#63C65E,2,,,,,,,,,,,,,0,99417,4573.88042 +99426,246,IRいしかわ鉄道線,アイアールイシカワテツドウセン,IRいしかわ鉄道株式会社,IR Ishikawa Railway Line,IR Ishikawa Railway Line,IR石川铁道线,IR이시카와 철도선,#25A6DF,2,,,,,,,,,,,,,0,99417,3553.1462 +99418,166,のと鉄道七尾線,ノトテツドウナナオセン,のと鉄道七尾線,Noto Railway Nanao Line,Noto Railway Nanao Line,能登铁道七尾线,노토 철도 나나오선,#1594EB,2,,,,,,,,,,,,,0,99418,4704.77949 +99419,167,えちぜん鉄道勝山永平寺線,エチゼンテツドウカツヤマエイヘイジセン,えちぜん鉄道勝山永平寺線,Echizen Railway Katsuyama Eiheiji Line,Echizen Railway Katsuyama Eiheiji Line,越前铁道胜山永平寺线,에치젠 철도 가쓰야마에이헤이지선,#FD6802,2,E,,,,#FD6802,,,,ROUND,,,,0,99419,1227.41572 +99420,167,えちぜん鉄道三国芦原線,エチゼンテツドウミクニアワラセン,えちぜん鉄道三国芦原線,Echizen Railway Mikuni Ashihara Line,Echizen Railway Mikuni Ashihara Line,越前铁道三国芦原线,에치젠 철도 미쿠니아와라선,#0069FF,2,E,,,,#0069FF,,,,ROUND,,,,0,99420,1148.51023 +99421,168,福井鉄道福武線,フクイテツドウフクブセン,福井鉄道福武線,Fukui Railway Fukutake Line,Fukui Railway Fukutake Line,福井铁道福武线,후쿠이 철도 후쿠타케선,#197A3D,4,F,,,,#197A3D,,,,ROUND,,,,0,99421,1071.15936 +99428,251,ハピラインふくい線,ハピラインフクイセン,ハピラインふくい線,Hapi-line Fukui,Hapi-line Fukui线,Hapi线福井线,하피라인 후쿠이선,#EC1C9C,2,,,,,,,,,,,,,0,99426,4390.58048 +99501,169,伊豆急行線,イズキュウコウセン,伊豆急行線,Izu Kyuko Line,Izu Kyuko Line,伊豆急行线,이즈 급행선,#0085CD,2,IZ,,,,#000000,,,,SQUARE,,,,0,99501,3006.10916 +99502,128,伊豆箱根鉄道駿豆線,イズハコネテツドウスンズセン,伊豆箱根鉄道駿豆線,Izuhakone Railway Sunzu Line,Izuhakone Railway Sunzu Line,伊豆箱根铁道骏豆线,이즈하코네 철도 순즈선,#4086E5,2,IS,,,,#4086E5,,,,IZUHAKONE,,,,0,99502,1608.83117 +99503,170,岳南鉄道線,ガクナンテツドウセン,岳南鉄道線,Gakunan Railway Line,Gakunan Railway Line,岳南铁道线,가쿠난 철도선,#6B0102,2,GD,,,,#6B0102,,,,MONOCHROME_ROUND,,,,0,99503,991.96997 +99504,171,静岡鉄道静岡清水線,シズオカテツドウシズオカシミズセン,静岡鉄道静岡清水線,Shizuoka Railway Shizuoka Shimizu Line,Shizuoka Railway Shizuoka Shimizu Line,静冈铁道静冈清水线,시즈오카 철도 시즈오카시미즈선,#0063B5,2,S,,,,#0094E2,,,,ROUND_HORIZONTAL,,,,0,99504,776.48074 +99505,172,天竜浜名湖線,テンリュウハマナコセン,天竜浜名湖鉄道天竜浜名湖線,Tenryu Hamanako Line,Tenryu Hamanako Line,天龙浜名湖线,덴류하마나코선,#95805A,2,,,,,,,,,,,,,0,99505,1739.51349 +99506,173,遠州鉄道鉄道線,エンシュウテツドウテツドウセン,遠州鉄道鉄道線,Enshu Railway Line,Enshu Railway Line,远州铁道铁道线,엔슈 철도선,#0672B0,2,ET,,,,#0672B0,,,,NUMBER_ONLY,,,,0,99506,1040.11028 +99507,174,大井川鐵道大井川本線,オオイガワテツドウオオイガワホンセン,大井川鐵道大井川本線,Oigawa Railway Oigawa Main Line,Oigawa Railway Oigawa Main Line,大井川铁道大井川本线,오이가와 철도 오이가와 본선,#F5F5F5,2,,,,,,,,,,,,,0,99507,2006.41977 +99508,174,南アルプスあぷとライン,ミナミアルプスアプトライン,大井川鐵道井川線,Oigawa Railway Ikawa Line,Oigawa Railway Ikawa Line,南阿尔卑斯阿普特线,미나미알프스 아프트 라인,#FFFFCC,2,,,,,,,,,,,,,0,99508,1871.28994 +99509,175,あおなみ線,アオナミセン,西名古屋港線,Aonami Line,Aonami Line,青波线,아오나미선,#464285,2,AN,,,,#464285,,,,ROUND,,,,0,99509,1494.42718 +99510,176,東海交通事業城北線,トウカイコウツウジギョウジョウホクセン,東海交通事業城北線,Tokai Transport Service Johoku Line,Tokai Transport Service Johoku Line,东海交通事业城北线,도카이 교통 사업 조호쿠선,#FF6600,2,,,,,,,,,,,,,0,99510,2210.03734 +99511,177,愛知環状鉄道線,アイチカンジョウテツドウセン,愛知環状鉄道線,Aichi Loop Line,Aichi Loop Line,爱知环状铁道线,아이치 간조 철도선,#2A359D,2,,,,,#2A359D,,,,MONOCHROME_ROUND,,,,0,99511,2022.52706 +99512,178,リニモ,リニモ,東部丘陵線,Linimo,Linimo,磁浮列车,리니모,#0D1F70,5,L,,,,#000000,,,,ROUND,,,,0,99512,1073.771 +99513,179,名古屋市営地下鉄東山線,ナゴヤシエイチカテツヒガシヤマセン,名古屋市営地下鉄東山線,Nagoya Municipal Subway Higashiyama Line,Nagoya Municipal Subway Higashiyama Line,名古屋市营地铁东山线,나고야 시영 지하철 히가시야마선,#FFCC00,3,H,,,,#FFCC00,,,,ROUND,,,,0,99513,966.08368 +99514,179,名古屋市営地下鉄名城線,ナゴヤシエイチカテツメイジョウセン,名古屋市営地下鉄名城線,Nagoya Municipal Subway Meijo Line,Nagoya Municipal Subway Meijo Line,名古屋市营地铁名城线,나고야 시영 지하철 메이조선,#9B74C1,3,M,,,,#9B74C1,,,,ROUND,,,,0,99514,917.56259 +99515,179,名古屋市営地下鉄名港線,ナゴヤシエイチカテツメイコウセン,名古屋市営地下鉄名港線,Nagoya Municipal Subway Meiko Line,Nagoya Municipal Subway Meiko Line,名古屋市营地铁名港线,나고야 시영 지하철 메이코선,#9B74C1,3,E,,,,#9B74C1,,,,ROUND,,,,0,99515,989.8734 +99516,179,名古屋市営地下鉄鶴舞線,ナゴヤシエイチカテツツルマイセン,名古屋市営地下鉄鶴舞線,Nagoya Municipal Subway Tsurumai Line,Nagoya Municipal Subway Tsurumai Line,名古屋市营地铁鹤舞线,나고야 시영 지하철 쓰루마이선,#04ACDD,3,T,,,,#04ACDD,,,,ROUND,,,,0,99516,1056.06986 +99517,179,名古屋市営地下鉄桜通線,ナゴヤシエイチカテツサクラドオリセン,名古屋市営地下鉄桜通線,Nagoya Municipal Subway Sakuradori Line,Nagoya Municipal Subway Sakuradori Line,名古屋市营地铁樱通线,나고야 시영 지하철 사쿠라도리선,#FF0000,3,S,,,,#FF0000,,,,ROUND,,,,0,99517,944.55051 +99518,179,名古屋市営地下鉄上飯田線,ナゴヤシエイチカテツカミイイダセン,名古屋市営地下鉄上飯田線,Nagoya Municipal Subway Kamiida Line,Nagoya Municipal Subway Kamiida Line,名古屋市营地铁上饭田线,나고야 시영 지하철 가미이다선,#FF66C4,3,K,,,,#FF66C4,,,,ROUND,,,,0,99518,879.75768 +99519,180,ピーチライナー,ピーチライナー,桃花台新交通,Peach Liner,Peach Liner,桃花快线,피치 라이너,#F9F9F9,5,,,,,,,,,,,,,2,99519,1220.51679 +99520,181,豊橋鉄道渥美線,トヨハシテツドウアツミセン,豊橋鉄道渥美線,Toyohashi Railroad Atsumi Line,Toyohashi Railroad Atsumi Line,丰桥铁道渥美线,도요하시 철도 아쓰미선,#1A9B96,4,,,,,,,,,,,,,0,99520,1164.54371 +99521,181,豊橋鉄道東田本線,トヨハシテツドウアヅマダホンセン,豊橋鉄道東田本線,Toyohashi Railroad Azumada Main Line,Toyohashi Railroad Azumada Main Line,丰桥铁道东田本线,도요하시 철도 아즈마다 본선,#1A9B96,4,,,,,,,,,,,,,0,99521,533.24363 +99522,181,豊橋鉄道運動公園前線,トヨハシテツドウウンドウコウエンマエセン,豊橋鉄道運動公園前線,Toyohashi Railroad Yagyu-bashi Branch Line,Toyohashi Railroad Yagyu-bashi Branch Line,丰桥铁道运动公园前线,도요하시 철도 야규바시 지선,#1A9B96,4,,,,,,,,,,,,,2,99522,805.15292 +99523,182,ゆとりーとライン,ユトリートライン,ガイドウェイバス志段味線,Yutorito Line,Yutorito Line,导向巴士志段味线,유토리토 라인,#3C459A,5,Y,,,,#3C459A,,,,ROUND,,,,0,99523,859.80651 +99524,183,明知鉄道明知線,アケチテツドウアケチセン,明知鉄道明知線,Akechi Railway Akechi Line,Akechi Railway Akechi Line,明知铁道明知线,아케치 철도 아케치선,#000000,2,,,,,#000000,,,,MONOCHROME_ROUND,,,,0,99524,2433.10424 +99525,184,長良川鉄道越美南線,ナガラガワテツドウエツミナンセン,長良川鉄道越美南線,Nagaragawa Railway Etsumi-Nan Line,Nagaragawa Railway Etsumi-Nan Line,长良川铁道越美南线,나가라가와 철도 에쓰미난선,#FF1493,2,,,,,#FF1493,,,,MONOCHROME_ROUND,,,,0,99525,1895.06044 +99526,185,樽見鉄道樽見線,タルミテツドウタルミセン,樽見鉄道樽見線,Tarumi Railway Tarumi Line,Tarumi Railway Tarumi Line,樽见铁道樽见线,다루미 철도 다루미선,#097AD6,2,TR,,,,#D50707,,,,REVERSED_ROUND_HORIZONTAL,,,,0,99526,1880.2054 +99528,186,三岐鉄道三岐線,サンギテツドウサンギセン,三岐鉄道三岐線,Sangi Railway Sanki Line,Sangi Railway Sanki Line,三岐铁道三岐线,산기 철도 산기선,#0D287C,2,,,,,,,,,,,,,0,99528,1855.04828 +99529,186,三岐鉄道北勢線,サンギテツドウホクセイセン,三岐鉄道北勢線,Sangi Railway Hokusei Line,Sangi Railway Hokusei Line,三岐铁道北势线,산기 철도 호쿠세이선,#0D287C,2,,,,,,,,,,,,,0,99529,1652.78385 +99530,187,伊勢鉄道伊勢線,イセテツドウイセセン,伊勢鉄道伊勢線,Ise Railway Ise Line,Ise Railway Ise Line,伊势铁道伊势线,이세 철도 이세선,#0300FA,2,,,,,,,,,,,,,0,99530,2449.10241 +99531,188,伊賀鉄道伊賀線,イガテツドウイガセン,伊賀鉄道伊賀線,Iga Railway Iga Line,Iga Railway Iga Line,伊贺铁道伊贺线,이가 철도 이가선,#895B8A,2,,,,,,,,,,,,,0,99531,1140.55469 +99532,189,養老鉄道養老線,ヨウロウテツドウヨウロウセン,養老鉄道養老線,Yoro Railway Yoro Line,Yoro Railway Yoro Line,养老铁道养老线,요로 철도 요로선,#ADDB8E,2,,,,,,,,,,,,,0,99532,2174.94449 +99601,190,近江鉄道本線,オウミテツドウホンセン,近江鉄道本線,Ohmi Railway Main Line,Ohmi Railway Main Line,近江铁道本线,오미 철도 본선,#DF8A28,2,OR,,,,#DF8A28,,,,ROUND,,,,0,99601,1965.32482 +99602,190,近江鉄道多賀線,オウミテツドウタガセン,近江鉄道多賀線,Ohmi Railway Taga Line,Ohmi Railway Taga Line,近江铁道多贺线,오미 철도 다가선,#DF8A28,2,OR,,,,#DF8A28,,,,ROUND,,,,0,99602,1201.19679 +99603,190,近江鉄道八日市線,オウミテツドウヨウカイチセン,近江鉄道八日市線,Ohmi Railway Yokaichi Line,Ohmi Railway Yokaichi Line,近江铁道八日市线,오미 철도 요카이치선,#DF8A28,2,OR,,,,#DF8A28,,,,ROUND,,,,0,99603,1507.40494 +99604,191,信楽高原鐵道信楽線,シガラキコウゲンテツドウシガラキセン,信楽高原鐵道信楽線,Shigaraki Kogen Railway Shigaraki Line,Shigaraki Kogen Railway Shigaraki Line,信乐高原铁道信乐线,시가라키 고원 철도 시가라키선,#FF6633,2,,,,,,,,,,,,,0,99604,2902.2727 +99605,192,嵯峨野観光線,サガノカンコウセン,嵯峨野観光線,Sagano Scenic Railway,Sagano Scenic Railway,嵯峨野观光线,사가노 관광선,#B22222,2,,,,,,,,,,,,,0,99605,2881.21078 +99606,193,叡山電鉄叡山本線,エイザンデンテツエイザンホンセン,叡山電鉄叡山本線,Eizan Electric Railway Eizan Main Line,Eizan Electric Railway Eizan Main Line,叡山电铁叡山本线,에이잔 전철 에이잔 본선,#007F00,2,E,,,,#007F00,,,,KEIHAN,,,,0,99606,776.34475 +99607,193,叡山電鉄鞍馬線,エイザンデンテツクラマセン,叡山電鉄鞍馬線,Eizan Electric Railway Kurama Line,Eizan Electric Railway Kurama Line,叡山电铁鞍马线,에이잔 전철 구라마선,#FF0000,2,E,,,,#007F00,,,,KEIHAN,,,,0,99607,920.4243 +99608,194,宮福線,ミヤフクセン,宮福線,Miyafuku Line,Miyafuku Line,宫福线,미야후쿠선,#429BE1,2,F,,,,#EA4F6F,,,,REVERSED_SQUARE,,,,0,99608,2310.20684 +99609,194,宮豊線,ミヤトヨセン,宮豊線,Miyatoyo Line,Miyatoyo Line,宫丰线,미야토요선,#FF4E6F,2,T,,,,#EA4F6F,,,,REVERSED_SQUARE,,,,0,99609,4782.36439 +99653,194,宮舞線,ミヤマイセン,宮舞線,Miyamai Line,Miyamai Line,宫舞线,미야마이선,#B230D1,0,M,,,,#EA4F6F,,,,REVERSED_SQUARE,,,,0,99609,4054.13143 +99610,195,京都市営地下鉄烏丸線,キョウトシエイチカテツカラスマセン,京都市営地下鉄烏丸線,Kyoto Municipal Subway Karasuma Line,Kyoto Municipal Subway Karasuma Line,京都市营地铁乌丸线,교토 시영 지하철 가라스마선,#66CC99,3,K,,,,#66CC99,,,,REVERSED_ROUND,,,,0,99610,971.61203 +99611,195,京都市営地下鉄東西線,キョウトシエイチカテツトウザイセン,京都市営地下鉄東西線,Kyoto Municipal Subway Tozai Line,Kyoto Municipal Subway Tozai Line,京都市营地铁东西线,교토 시영 지하철 도자이선,#FF6600,3,T,,,,#FF6600,,,,REVERSED_ROUND,,,,0,99611,1070.20956 +99612,196,京福電鉄嵐山本線,ケイフクデンテツアラシヤマホンセン,京福電鉄嵐山本線,Keifuku Electric Railway Arashiyama Main Line,Keifuku Electric Railway Arashiyama Main Line,京福电铁岚山本线,게이후쿠 전철 아라시야마 본선,#CC0033,4,A,,,,#CC0033,,,,REVERSED_ROUND_HORIZONTAL,,,,0,99612,625.336 +99613,196,京福電鉄北野線,ケイフクデンテツキタノセン,京福電鉄北野線,Keifuku Electric Railway Kitano Line,Keifuku Electric Railway Kitano Line,京福电铁北野线,게이후쿠 전철 기타노선,#6666CC,4,B,A,,,#6666CC,#CC0033,,,REVERSED_ROUND_HORIZONTAL,,,,0,99613,509.30112 +99614,197,北大阪急行電鉄,キタオオサカキュウコウデンテツ,北大阪急行電鉄,Kita Osaka Express Electric Railway,Kita Osaka Express Electric Railway,北大阪急行电铁,기타오사카 급행 전철,#DD5B5C,2,M,,,,#E5171F,,,,REVERSED_ROUND,,,,0,99614,1656.79284 +99616,22,南海泉北線,ナンカイセンボクセン,南海泉北線,Nankai Semboku Line,Nankai Semboku Line,南海泉北线,난카이 센보쿠선,#0099FF,2,NK,,,,#000000,,,,NANKAI,,,,0,99616,2819.48165 +99617,199,水間鉄道水間線,ミズマテツドウミズマセン,水間鉄道水間線,Mizuma Railway Mizuma Line,Mizuma Railway Mizuma Line,水间铁道水间线,미즈마 철도 미즈마선,#005CB1,2,,,,,,,,,,,,,0,99617,628.45348 +99618,249,Osaka Metro御堂筋線,オオサカメトロミドウスジセン,高速電気軌道第1号線,Osaka Metro Midosuji Line,Osaka Metro Midosuji Line,御堂筋线,미도스지선,#E5171F,3,M,,,,#E5171F,,,,REVERSED_ROUND,,,,0,99618,1280.32033 +99619,249,Osaka Metro谷町線,オオサカメトロタニマチセン,高速電気軌道第2号線,Osaka Metro Tanimachi Line,Osaka Metro Tanimachi Line,谷町线,다니마치선,#522886,3,T,,,,#522886,,,,REVERSED_ROUND,,,,0,99619,1088.54456 +99620,249,Osaka Metro四つ橋線,オオサカメトロヨツバシセン,高速電気軌道第3号線,Osaka Metro Yotsubashi Line,Osaka Metro Yotsubashi Line,四桥线,요쓰바시선,#0078BA,3,Y,,,,#0078BA,,,,REVERSED_ROUND,,,,0,99620,1119.92896 +99621,249,Osaka Metro中央線,オオサカメトロチュウオウセン,高速電気軌道第4号線,Osaka Metro Chuo Line,Osaka Metro Chuo Line,中央线,주오선,#019A66,3,C,,,,#019A66,,,,REVERSED_ROUND,,,,0,99621,1489.20988 +99622,249,Osaka Metro千日前線,オオサカメトロセンニチマエセン,高速電気軌道第5号線,Osaka Metro Sennichimae Line,Osaka Metro Sennichimae Line,千日前线,센니치마에선,#E44D93,3,S,,,,#E44D93,,,,REVERSED_ROUND,,,,0,99622,950.83706 +99623,249,Osaka Metro堺筋線,オオサカメトロサカイスジセン,高速電気軌道第6号線,Osaka Metro Sakaisuji Line,Osaka Metro Sakaisuji Line,堺筋线,사카이스지선,#814721,3,K,,,,#814721,,,,REVERSED_ROUND,,,,0,99623,940.76542 +99624,249,Osaka Metro長堀鶴見緑地線,オオサカメトロナガホリツルミリョクチセン,高速電気軌道第7号線,Osaka Metro Nagahori Tsurumi-ryokuchi Line,Osaka Metro Nagahori Tsurumi-ryokuchi Line,长堀鹤见绿地线,나가호리쓰루미료쿠치선,#A9CC51,3,N,,,,#A9CC51,,,,REVERSED_ROUND,,,,0,99624,908.75103 +99652,249,Osaka Metro今里筋線,オオサカメトロイマザトスジセン,高速電気軌道第8号線,Osaka Metro Imazatosuji Line,Osaka Metro Imazatosuji Line,今里筋线,이마자토스지선,#EE7B1A,3,I,,,,#EE7B1A,,,,REVERSED_ROUND,,,,0,99624,1270.47569 +99625,249,Osaka Metro南港ポートタウン線,オオサカメトロナンコウポートタウンセン,大阪市高速電気軌道南港ポートタウン線,Osaka Metro Nanko Port Town Line,Osaka Metro Nanko Port Town Line,南港港城线,포트타운선,#00A0DE,5,P,,,,#00A0DE,,,,REVERSED_ROUND,,,,0,99625,849.64254 +99626,201,大阪モノレール線,オオサカモノレールセン,大阪モノレール線,Osaka Monorail Main Line,Osaka Monorail Main Line,大阪单轨电车线,오사카 모노레일선,#5058C3,5,,,,,,,,,,,,,0,99626,1598.41043 +99627,201,大阪モノレール彩都線,オオサカモノレールサイトセン,国際文化公園都市線,Osaka Monorail Saito Line,Osaka Monorail Saito Line,大阪单轨电车彩都线,오사카 모노레일 사이토선,#5058C3,5,,,,,,,,,,,,,0,99627,1635.81889 +99628,202,阪堺電軌上町線,ハンカイデンキウエマチセン,阪堺電軌上町線,Hankai Uemachi Line,Hankai Uemachi Line,阪堺电轨上町线,한카이 우에마치선,#083388,4,HN,,,,#000000,,,,SQUARE,,,,0,99628,585.20252 +99629,202,阪堺電軌阪堺線,ハンカイデンキハンカイセン,阪堺電軌阪堺線,Hankai Line,Hankai Line,阪堺电轨阪堺线,한카이선,#008947,4,HN,,,,#000000,,,,SQUARE,,,,0,99629,488.59702 +99630,203,神戸高速東西線,コウベコウソクトウザイセン,神戸高速東西線,Kobe Rapid Transit Railway Tozai Line,Kobe Rapid Transit Railway Tozai Line,神户高速东西线,고베 고속 도자이선,#2560A8,2,HS,HK,SY,,#2560A8,#2560A8,#F45757,,HANSHIN,HANKYU,SANYO,,0,99630,875.00784 +99631,203,神戸高速南北線,コウベコウソクナンボクセン,神戸高速南北線,Kobe Rapid Transit Railway Namboku Line,Kobe Rapid Transit Railway Namboku Line,神户高速南北线,고베 고속 난보쿠선,#2560A8,2,KB,,,,#DD0033,,,,HANSHIN,,,,0,99631,439.36353 +99632,204,有馬線,アリマセン,神鉄有馬線,Arima Line,Arima Line,有马线,아리마선,#D53924,2,KB,,,,#DD0033,,,,HANSHIN,,,,0,99632,1532.09535 +99633,204,三田線,サンダセン,神鉄三田線,Sanda Line,Sanda Line,三田线,산다선,#D53924,2,KB,,,,#DD0033,,,,HANSHIN,,,,0,99633,1275.15137 +99634,204,公園都市線,コウエントシセン,神鉄公園都市線,Koen-Toshi Line,Koen-Toshi Line,公园都市线,고엔토시선,#D53924,2,KB,,,,#DD0033,,,,HANSHIN,,,,0,99634,1435.16656 +99635,204,粟生線,アオセン,神鉄粟生線,Ao Line,Ao Line,粟生线,아오선,#D53924,2,KB,,,,#DD0033,,,,HANSHIN,,,,0,99635,1512.8307 +99636,211,神戸市営地下鉄北神線,コウベシエイチカテツホクシンセン,神戸市営地下鉄北神線,Kobe Municipal Subway Hokushin Line,Kobe Municipal Subway Hokushin Line,神户市营地铁北神线,고베 시영 지하철 호쿠신선,#D59A00,2,S,S,,,#01AF98,#01AF98,,,SQUARE,REVERSED_SQUARE_WEST,,,0,99636,7328.54641 +99637,206,山陽電鉄本線,サンヨウデンテツホンセン,山陽電鉄本線,Sanyo Electric Railway Main Line,Sanyo Electric Railway Main Line,山阳电铁本线,산요 전철 본선,#F45757,2,SY,,,,#ED1A3D,,,,SANYO,,,,0,99637,1280.1745 +99638,206,山陽電鉄網干線,サンヨウデンテツアボシセン,山陽電鉄網干線,Sanyo Electric Railway Aboshi Line,Sanyo Electric Railway Aboshi Line,山阳电铁网干线,산요 전철 아보시선,#F45757,2,SY,,,,#ED1A3D,,,,SANYO,,,,0,99638,1444.82485 +99615,207,能勢電鉄妙見線,ノセデンテツミョウケンセン,能勢電鉄妙見線,Nose Electric Railway Myoken Line,Nose Electric Railway Myoken Line,能势电铁妙见线,노세 전철 묘켄선,#B72142,2,NS,,,,#B72142,,,,REVERSED_ROUND,,,,0,99640,902.44973 +99640,207,能勢電鉄日生線,ノセデンテツニッセイセン,能勢電鉄日生線,Nose Electric Railway Nissei Line,Nose Electric Railway Nissei Line,能势电铁日生线,노세 전철 닛세이선,#B72142,2,NS,,,,#B72142,,,,REVERSED_ROUND,,,,0,99640,2478.49816 +99642,208,三木鉄道三木線,ミキテツドウミキセン,三木鉄道三木線,Miki Railway Miki Line,Miki Railway Miki Line,三木铁道三木线,미키 철도 미키선,#009CFF,2,,,,,,,,,,,,,2,99642,948.45333 +99643,209,北条鉄道北条線,ホウジョウテツドウホウジョウセン,北条鉄道北条線,Hojo Line,Hojo Line,北条铁道北条线,호조 철도 호조선,#7564D3,2,,,,,,,,,,,,,0,99643,1919.58856 +99644,210,智頭急行智頭線,チズキュウコウチズセン,智頭急行智頭線,Chizu Express Chizu Line,Chizu Express Chizu Line,智头急行智头线,지즈 급행 지즈선,#000099,2,,,,,,,,,,,,,0,99644,4299.89441 +99645,211,神戸市営地下鉄西神線,コウベシエイチカテツセイシンセン,神戸市営地下鉄西神線,Kobe Municipal Subway Seishin Line,Kobe Municipal Subway Seishin Line,神户市营地铁西神线,고베 시영 지하철 세이신선,#01AF98,3,S,,,,#01AF98,,,,REVERSED_SQUARE_WEST,,,,0,99645,1844.9049 +99646,211,神戸市営地下鉄山手線,コウベシエイチカテツヤマテセン,神戸市営地下鉄山手線,Kobe Municipal Subway Yamate Line,Kobe Municipal Subway Yamate Line,神户市营地铁山手线,고베 시영 지하철 야마테선,#01AF98,3,S,,,,#01AF98,,,,REVERSED_SQUARE_WEST,,,,0,99646,1083.42685 +99647,211,神戸市営地下鉄海岸線,コウベシエイチカテツカイガンセン,神戸市営地下鉄海岸線,Kobe Municipal Subway Kaigan Line,Kobe Municipal Subway Kaigan Line,神户市营地铁海岸线,고베 시영 지하철 가이간선,#0388C0,3,K,,,,#0388C0,,,,REVERSED_SQUARE_WEST,,,,0,99647,864.59592 +99648,212,ポートライナー,ポートライナー,神戸新交通ポートアイランド線,Port Liner,Port Liner,港湾人工岛线,포트 라이너,#9686BD,5,P,PL,,,#9686BD,#9686BD,,,REVERSED_SQUARE,REVERSED_SQUARE,,,0,99648,1147.16066 +99649,212,六甲ライナー,ロッコウライナー,神戸新交通六甲アイランド線,Rokko Liner,Rokko Liner,六甲人工岛线,롯코 라이너,#9686BD,5,R,,,,#9686BD,,,,REVERSED_SQUARE,,,,0,99649,893.11205 +99650,213,紀州鉄道線,キシュウテツドウセン,紀州鉄道線,Kishu Railway Line,Kishu Railway Line,纪州铁道线,기슈 철도선,#081042,2,,,,,,,,,,,,,0,99650,659.45614 +99651,214,貴志川線,キシガワセン,和歌山電鐵貴志川線,Kishigawa Line,Kishigawa Line,贵志川线,기시가와선,#DA381B,2,,,,,,,,,,,,,0,99651,1064.09728 +99701,215,若桜線,ワカサセン,若桜鉄道若桜線,Wakasa Line,Wakasa Line,若樱线,와카사선,#FF2F1A,2,,,,,,,,,,,,,0,99701,2342.28838 +99702,216,北松江線,キタマツエセン,一畑電車北松江線,Kita-Matsue Line,Kita-Matsue Line,北松江线,기타마쓰에선,#EB5C02,2,,,,,#EB5C02,,,,REVERSED_ROUND,,,,0,99702,1576.127 +99703,216,大社線,タイシャセン,一畑電車大社線,Taisha Line,Taisha Line,大社线,다이샤선,#EB5C02,2,,,,,,,,,,,,,0,99703,2059.70786 +99704,217,水島本線,ミズシマホンセン,水島臨海鉄道水島本線,Mizushima Main Line,Mizushima Main Line,水岛本线,미즈시마 본선,#3B82C5,2,MR,,,,#3B82C5,,,,REVERSED_ROUND,,,,0,99704,1170.384 +99705,218,井原線,イバラセン,井原鉄道井原線,Ibara Line,Ibara Line,井原线,이바라선,#00AD66,2,,,,,,,,,,,,,0,99705,2963.58483 +99706,219,東山線,ヒガシヤマセン,岡山電軌東山本線,Higashiyama Line,Higashiyama Line,东山线,히가시야마선,#EF1731,4,H,,,,#EF1731,,,,ROUND,,,,0,99706,401.54121 +99707,219,清輝橋線,セイキバシセン,岡山電軌清輝橋線,Seikibashi Line,Seikibashi Line,清辉桥线,세이키바시선,#07502B,4,S,,,,#07502B,,,,ROUND,,,,0,99707,321.09156 +99708,220,スカイレールみどり坂線,スカイレールミドリザカセン,広島短距離交通瀬野線,Skyrail Midorizaka Line,Skyrail Midorizaka Line,空中铁道绿坂线,스카이레일 미도리자카선,#F9F9F9,5,,,,,,,,,,,,,2,99708,651.30282 +99709,221,アストラムライン,アストラムライン,広島高速交通広島新交通1号線,Astram Line,Astram Line,新交通系统,아스트람 라인,#FFA500,5,,,,,,,,,,,,,0,99709,856.37782 +99710,222,広電1号線(宇品線),ヒロデンイチゴウセン,広電1号線(宇品線),Hiroden Ujina Line,Hiroden Ujina Line,广电1号线(宇品线),히로덴 1호선(우지나선),#FF5900,4,M,U,,,#00A85F,#0092D7,,,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,,,0,99710,385.93525 +99711,222,広電2号線(宮島線),ヒロデンニゴウセン,広電2号線(宮島線),Hiroden Miyajima Line,Hiroden Miyajima Line,广电2号线(宫岛线),히로덴 2호선(미야지마선),#EF1731,4,M,,,,#00A85F,,,,REVERSED_ROUND_HORIZONTAL,,,,0,99711,672.49032 +99712,222,広電3号線,ヒロデンサンゴウセン,広電3号線,Hiroden Streetcar Route 3,Hiroden Streetcar Route 3,广电3号线,히로덴 3호선,#4243BE,4,U,M,,,#0092D7,#00A85F,,,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,,0,99712,383.85101 +99713,222,広電5号線(皆実線),ヒロデンゴゴウセン,広電5号線(皆実線),Hiroden Minami Line,Hiroden Minami Line,广电5号线(皆实线),히로덴 5호선(미나미선),#00CC66,4,M,H,U,,#00A85F,#7DBF4C,#0092D7,,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,,0,99713,437.72286 +99714,222,広電6号線(江波線),ヒロデンロクゴウセン,広電6号線(江波線),Hiroden Eba Line,Hiroden Eba Line,广电6号线(江波线),히로덴 6호선(에바선),#FFCC00,4,E,M,,,#FEDB4F,#008033,,,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,,,0,99714,413.23367 +99715,222,広電7号線,ヒロデンナナゴウセン,広電7号線,Hiroden Streetcar Route 7,Hiroden Streetcar Route 7,广电7号线,히로덴 7호선,#005A52,4,Y,M,U,,#ED8095,#00A85F,#0092D7,,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,,0,99715,405.20802 +99716,222,広電8号線(横川線),ヒロデンハチゴウセン,広電8号線(横川線),Hiroden Yokogawa Line,Hiroden Yokogawa Line,广电8号线(横川线),히로덴 8호선(요코가와선),#DF60AE,4,Y,M,E,,#ED8095,#00A85F,#FEDB4F,,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,REVERSED_ROUND_HORIZONTAL,,0,99716,494.20631 +99717,222,広電9号線(白島線),ヒロデンキュウゴウセン,広電9号線(白島線),Hiroden Hakushima Line,Hiroden Hakushima Line,广电9号线(白岛线),히로덴 9호선(하쿠시마선),#797878,4,W,,,,#797878,,,,REVERSED_ROUND_HORIZONTAL,,,,0,99717,380.00763 +99718,223,錦川清流線,ニシキガワセイリュウセン,錦川鉄道錦川清流線,Nishikigawa Seiryu Line,Nishikigawa Seiryu Line,锦川清流线,니시키가와 세이류선,#E60010,2,,,,,,,,,,,,,0,99718,2660.86581 +99801,224,阿波室戸シーサイドライン,アワムロトシーサイドライン,阿佐海岸鉄道阿佐東線,Awa-Muroto Seaside Line,Awa-Muroto Seaside Line,阿波室户海滨线,아와무로토 시사이드 라인,#A5AEB4,2,AK,,,,#A5AEB4,,,,ROUND,,,,0,99801,3291.48155 +99802,225,琴電琴平線,コトデンコトヒラセン,琴電琴平線,Kotoden Kotohira Line,Kotoden Kotohira Line,琴电琴平线,고토덴 고토히라선,#FFD400,2,K,,,,#FFD400,,,,ROUND,,,,0,99802,1462.64871 +99803,225,琴電長尾線,コトデンナガオセン,琴電長尾線,Kotoden Nagao Line,Kotoden Nagao Line,琴电长尾线,고토덴 나가오선,#009966,2,N,,,,#009966,,,,ROUND,,,,0,99803,933.5494 +99804,225,琴電志度線,コトデンシドセン,琴電志度線,Kotoden Shido Line,Kotoden Shido Line,琴电志度线,고토덴 시도선,#FF3366,2,S,,,,#FF3366,,,,ROUND,,,,0,99804,812.09522 +99805,226,伊予鉄道郡中線,イヨテツドウグンチュウセン,伊予鉄道郡中線,Iyotetsu Gunchu Line,Iyotetsu Gunchu Line,伊予铁道郡中线,이요 철도 군추선,#F15A22,2,IY,,,,#F15A22,,,,REVERSED_ROUND,,,,0,99805,1021.3182 +99806,226,伊予鉄道高浜線,イヨテツドウタカハマセン,伊予鉄道高浜線,Iyotetsu Takahama Line,Iyotetsu Takahama Line,伊予铁道高浜线,이요 철도 다카하마선,#9ACD32,2,IY,,,,#9ACD32,,,,REVERSED_ROUND,,,,0,99806,985.13285 +99807,226,伊予鉄道横河原線,イヨテツドウヨコガワラセン,伊予鉄道横河原線,Iyotetsu Yokogawara Line,Iyotetsu Yokogawara Line,伊予铁道横河原线,이요 철도 요코가와라선,#00BBEE,2,IY,,,,#00BBEE,,,,REVERSED_ROUND,,,,0,99807,940.73597 +99808,226,伊予鉄道環状線(1系統),イヨテツドウカンジョウセン,伊予鉄道1系統,Iyotetsu Route 1 Loop Line,Iyotetsu Route 1 Loop Line,伊予铁道环状线(1系统),이요 철도 순환선(1계통),#CD6803,4,IY,,,,#CD6803,,,,REVERSED_ROUND,,,,0,99808,391.19973 +99809,226,伊予鉄道環状線(2系統),イヨテツドウカンジョウセン,伊予鉄道2系統,Iyotetsu Route 2 Loop Line,Iyotetsu Route 2 Loop Line,伊予铁道环状线(2系统),이요 철도 순환선(2계통),#CD6803,4,IY,,,,#CD6803,,,,REVERSED_ROUND,,,,0,99809,391.65867 +99810,226,伊予鉄道市駅線(3系統),イヨテツドウシエキセン,伊予鉄道3系統,Iyotetsu Route 3,Iyotetsu Route 3,伊予铁道市站线(3系统),이요 철도 시에키선(3계통),#CD6803,4,IY,,,,#CD6803,,,,REVERSED_ROUND,,,,0,99810,413.44857 +99811,226,伊予鉄道松山駅前線(5系統),イヨテツドウマツヤマエキマエセン,伊予鉄道5系統,Iyotetsu Route 5,Iyotetsu Route 5,伊予铁道松山站前线(5系统),이요 철도 마쓰야마에키마에선(5계통),#CD6803,4,IY,,,,#CD6803,,,,REVERSED_ROUND,,,,0,99811,402.24475 +99812,226,伊予鉄道本町線(6系統),イヨテツドウホンマチセン,伊予鉄道6系統,Iyotetsu Route 6,Iyotetsu Route 6,伊予铁道本町线(6系统),이요 철도 혼마치선(6계통),#CD6803,4,IY,,,,#CD6803,,,,REVERSED_ROUND,,,,0,99812,389.88748 +99814,227,中村線,ナカムラセン,土佐くろしお鉄道中村線,Nakamura Line,Nakamura Line,中村线,나카무라선,#32455C,2,TK,,,,#32455C,,,,ROUND,,,,0,99814,3023.55505 +99815,227,宿毛線,スクモセン,土佐くろしお鉄道宿毛線,Sukumo Line,Sukumo Line,宿毛线,스쿠모선,#32455C,2,TK,,,,#32455C,,,,ROUND,,,,0,99815,3398.58428 +99816,227,ごめん・なはり線,ゴメン・ナハリセン,土佐くろしお鉄道ごめん・なはり線,Gomen-Nahari Line,Gomen-Nahari Line,后免・奈半利线,고멘·나하리선,#32455C,2,GN,,,,#A5AEB4,,,,ROUND,,,,0,99816,2077.70167 +99817,228,ごめん線,ゴメンセン,土佐電鉄ごめん線,Gomen Line,Gomen Line,后免线,고멘선,#2A9A38,4,,,,,,,,,,,,,0,99817,418.60311 +99818,228,伊野線,イノセン,土佐電鉄伊野線,Ino Line,Ino Line,伊野线,이노선,#2A9A38,4,,,,,,,,,,,,,0,99818,417.13513 +99819,228,桟橋線,サンバシセン,土佐電鉄桟橋線,Sambashi Line,Sambashi Line,栈桥线,산바시선,#2A9A38,4,,,,,,,,,,,,,0,99819,342.85359 +99901,229,甘木鉄道甘木線,アマギテツドウアマギセン,甘木鉄道甘木線,Amagi Railway,Amagi Railway,甘木铁道甘木线,아마기 철도 아마기선,#D43A2A,2,,,,,,,,,,,,,0,99901,1340.75892 +99902,230,伊田線,イダセン,平成筑豊鉄道伊田線,Ida Line,Ida Line,伊田线,이다선,#FF9900,2,HC,,,,#FF9900,,,,HALF_SQUARE,,,,0,99902,1118.3009 +99903,230,糸田線,イトダセン,平成筑豊鉄道糸田線,Itoda Line,Itoda Line,系田线,이토다선,#99CC00,2,HC,,,,#FF9900,,,,HALF_SQUARE,,,,0,99903,1349.80057 +99904,230,田川線,タガワセン,平成筑豊鉄道田川線,Tagawa Line,Tagawa Line,田川线,다가와선,#4DBBFF,2,,,,,,,,,,,,,0,99904,1608.54241 +99928,230,門司港レトロ観光線,モジコウレトロカンコウセン,平成筑豊鉄道門司港レトロ観光線,Mojiko Retro Scenic Line,Mojiko Retro Scenic Line,门司港怀旧观光线,모지코 레트로 관광선,#476FC1,2,,,,,,,,,,,,,0,99904,655.42319 +99905,231,福岡市営地下鉄空港線,フクオカシエイチカテツクウコウセン,福岡市営地下鉄空港線,Fukuoka City Subway Airport Line,Fukuoka City Subway Airport Line,福冈市营地铁机场线,후쿠오카 시영 지하철 공항선,#FFA500,3,K,,,,#FFA500,,,,ROUND,,,,0,99905,1056.94017 +99906,231,福岡市営地下鉄箱崎線,フクオカシエイチカテツハコザキセン,福岡市営地下鉄箱崎線,Fukuoka City Subway Hakozaki Line,Fukuoka City Subway Hakozaki Line,福冈市营地铁箱崎线,후쿠오카 시영 지하철 하코자키선,#00BFFF,3,H,,,,#00BFFF,,,,ROUND,,,,0,99906,811.72308 +99907,231,福岡市営地下鉄七隈線,フクオカシエイチカテツナナクマセン,福岡市営地下鉄七隈線,Fukuoka City Subway Nanakuma Line,Fukuoka City Subway Nanakuma Line,福冈市营地铁七隈线,후쿠오카 시영 지하철 나나쿠마선,#228B22,3,N,,,,#228B22,,,,ROUND,,,,0,99907,789.83764 +99908,232,北九州モノレール,キタキュウシュウモノレール,北九州高速鉄道,Kitakyushu Monorail,Kitakyushu Monorail,北九州单轨电车,기타큐슈 모노레일,#40BFE8,5,,,,,,,,,,,,,0,99908,729.89416 +99909,233,筑豊電気鉄道線,チクホウデンキテツドウセン,筑豊電気鉄道線,Chikuho Electric Railroad Line,Chikuho Electric Railroad Line,筑丰电气铁道线,지쿠호 전기 철도선,#E30075,2,CK,,,,#E30075,,,,HALF_SQUARE,,,,0,99909,791.53533 +99910,234,西九州線,ニシキュウシュウセン,松浦鉄道西九州線,Nishi-Kyushu Line,Nishi-Kyushu Line,西九州线,니시큐슈선,#0080FF,2,,,,,,,,,,,,,0,99910,1250.88679 +99911,234,西九州線,ニシキュウシュウセン,松浦鉄道西九州線,Nishi-Kyushu Line,Nishi-Kyushu Line,西九州线,니시큐슈선,#0080FF,2,,,,,,,,,,,,,0,99911,1695.1834 +99912,235,島原鉄道線,シマバラテツドウセン,島原鉄道線,Shimabara Railway Line,Shimabara Railway Line,岛原铁道线,시마바라 철도선,#FEE633,2,,,,,,,,,,,,,0,99912,1838.85554 +99913,236,長崎電軌1系統,ナガサキデンキイチゴウケイトウ,長崎電軌1系統,Nagasaki Electric Tramway Route 1,Nagasaki Electric Tramway Route 1,长崎电轨1系统,나가사키 전기궤도 1계통,#4243BE,4,,,,,,,,,,,,,0,99913,350.09157 +99914,236,長崎電軌3系統,ナガサキデンキサンゴウケイトウ,長崎電軌3系統,Nagasaki Electric Tramway Route 3,Nagasaki Electric Tramway Route 3,长崎电轨3系统,나가사키 전기궤도 3계통,#EF1731,4,,,,,,,,,,,,,0,99914,396.11844 +99915,236,長崎電軌4系統,ナガサキデンキヨンゴウケイトウ,長崎電軌4系統,Nagasaki Electric Tramway Route 4,Nagasaki Electric Tramway Route 4,长崎电轨4系统,나가사키 전기궤도 4계통,#FFCC00,4,,,,,,,,,,,,,0,99915,378.80477 +99916,236,長崎電軌5系統,ナガサキデンキゴゴウケイトウ,長崎電軌5系統,Nagasaki Electric Tramway Route 5,Nagasaki Electric Tramway Route 5,长崎电轨5系统,나가사키 전기궤도 5계통,#005A52,4,,,,,,,,,,,,,0,99916,364.66745 +99917,237,熊本電鉄本線,クマモトデンテツホンセン,熊本電鉄本線,Kumamoto Electric Railway Main Line,Kumamoto Electric Railway Main Line,熊本电铁本线,구마모토 전철 본선,#7B0D27,2,KD,,,,#BE302C,,,,SQUARE,,,,0,99917,785.60254 +99918,237,熊本電鉄上熊本線,クマモトデンテツカミクマモトセン,熊本電鉄上熊本線,Kumamoto Electric Railway Kami-Kumamoto Line,Kumamoto Electric Railway Kami-Kumamoto Line,熊本电铁上熊本线,구마모토 전철 가미쿠마모토선,#7B0D27,2,KD,,,,#BE302C,,,,SQUARE,,,,0,99918,655.3384 +99919,238,高森線,タカモリセン,南阿蘇鉄道高森線,Takamori Line,Takamori Line,高森线,다카모리선,#138068,2,,,,,,,,,,,,,0,99919,1923.0291 +99920,239,湯前線,ユノマエセン,くま川鉄道湯前線,Yunomae Line,Yunomae Line,汤前线,유노마에선,#153C36,2,,,,,,,,,,,,,0,99920,1872.97933 +99921,240,肥薩おれんじ鉄道線,ヒサツオレンジテツドウセン,肥薩おれんじ鉄道線,Hisatsu Orange Railway,Hisatsu Orange Railway,肥萨橙铁道线,히사쓰 오렌지 철도선,#FFA500,2,OR,,,,#FFA500,,,,ROUND,,,,0,99921,4285.529 +99922,241,熊本市電A系統,クマモトシデンエーライン,熊本市電A系統,Kumamoto City Tram Route A,Kumamoto City Tram Route A,熊本市电A系统,구마모토 시덴 A계통,#FF0000,4,A,,,,#FF0000,,,,REVERSED_SQUARE,,,,0,99922,444.53072 +99923,241,熊本市電B系統,クマモトシデンビーライン,熊本市電B系統,Kumamoto City Tram Route B,Kumamoto City Tram Route B,熊本市电B系统,구마모토 시덴 B계통,#0000FF,4,B,,,,#0000FF,,,,REVERSED_SQUARE,,,,0,99923,375.32687 +99925,242,鹿児島市電1系統,カゴシマシデンイチケイトウ,鹿児島市電1系統,Kagoshima City Tram Route 1,Kagoshima City Tram Route 1,鹿儿岛市电1系统,가고시마 시덴 1계통,#4243BE,4,I,,,,#4243BE,,,,REVERSED_ROUND,,,,0,99925,419.36632 +99926,242,鹿児島市電2系統,カゴシマシデンニケイトウ,鹿児島市電2系統,Kagoshima City Tram Route 2,Kagoshima City Tram Route 2,鹿儿岛市电2系统,가고시마 시덴 2계통,#EF1731,4,N,,,,#EF1731,,,,REVERSED_ROUND,,,,0,99926,367.48816 +99927,243,ゆいレール,ユイレール,沖縄都市モノレール線,Yui Rail,Yui Rail,冲绳都市单轨电车,유이레일,#CC0000,5,,,,,#CC0000,,,,MONOCHROME_ROUND,,,,0,99927,875.63476 diff --git a/data/3!stations.csv b/data/3!stations.csv index 3d6cbb05..3894fc76 100644 --- a/data/3!stations.csv +++ b/data/3!stations.csv @@ -7801,7 +7801,7 @@ station_cd,station_g_cd,station_name,station_name_k,station_name_r,station_name_ 9921811,9921811,卸町,オロシマチ,Oroshimachi,Oroshimachi,卸町,오로시마치,11,,,,,99218,4,984-0015,宮城県仙台市若林区卸町,140.920833,38.251528,2015-12-06,0000-00-00,0,9921811 9921812,9921812,六丁の目,ロクチョウノメ,Rokuchonome,Rokuchonome,六丁之目,로쿠초노메,12,,,,,99218,4,984-0011,宮城県仙台市若林区六丁の目西町,140.935556,38.250972,2015-12-06,0000-00-00,0,9921812 9921813,9921813,荒井,アライ,Arai,Arai,荒井,아라이,13,,,,,99218,4,984-0032,宮城県仙台市若林区荒井東,140.948611,38.244861,2015-12-06,0000-00-00,0,9921813 -9930101,9930101,都庁前,トチョウマエ,Tochomae,Tochomae,都厅前,도초마에,28,,,,,99301,13,160-0023,東京都新宿区西新宿2-8-1,139.69257,35.690551,0000-00-00,0000-00-00,0,9930101 +9930100,9930100,都庁前,トチョウマエ,Tochomae,Tochomae,都厅前,도초마에,28,,,,,99301,13,160-0023,東京都新宿区西新宿2-8-1,139.69257,35.690551,0000-00-00,0000-00-00,0,9930101 9930102,9930102,新宿西口,シンジュクニシグチ,Shinjuku-nishiguchi,Shinjuku-nishiguchi,新宿西口,신주쿠니시구치,01,,,,,99301,13,160-0023,東京都新宿区西新宿1-3-17,139.699155,35.693315,0000-00-00,0000-00-00,0,9930102 9930103,2801012,東新宿,ヒガシシンジュク,Higashi-shinjuku,Higashi-shinjuku,东新宿,히가시신주쿠,02,,,,,99301,13,160-0022,東京都新宿区新宿7-27-3,139.707549,35.69792,0000-00-00,0000-00-00,0,9930103 9930104,9930104,若松河田,ワカマツカワダ,Wakamatsu-kawada,Wakamatsu-kawada,若松河田,와카마쓰카와다,03,,,,,99301,13,162-0054,東京都新宿区河田町10-10,139.718184,35.699218,0000-00-00,0000-00-00,0,9930104 @@ -7829,17 +7829,17 @@ station_cd,station_g_cd,station_name,station_name_k,station_name_r,station_name_ 9930126,9930126,国立競技場,コクリツキョウギジョウ,Kokuritsu-kyogijo,Kokuritsu-kyogijo,国立竞技场,고쿠리쓰쿄지조,25,,,,,99301,13,160-0013,東京都新宿区霞ケ丘町10-3,139.714932,35.679831,0000-00-00,0000-00-00,0,9930126 9930127,1130207,代々木,ヨヨギ,Yoyogi,Yoyogi,代代木,요요기,26,,,,,99301,13,151-0053,東京都渋谷区代々木一丁目35-5,139.701666,35.683218,0000-00-00,0000-00-00,0,9930127 9930128,1130208,新宿,シンジュク,Shinjuku,Shinjuku,新宿,신주쿠,27,,,,,99301,13,151-0053,東京都渋谷区代々木二丁目1-1,139.698812,35.68869,0000-00-00,0000-00-00,0,9930128 -9930139,9930101,都庁前,トチョウマエ,Tochomae,Tochomae,都厅前,도초마에,28,,,,,99301,13,160-0023,東京都新宿区西新宿2-8-1,139.69257,35.690551,0000-00-00,0000-00-00,0,9930128 -9930129,9930129,西新宿五丁目,ニシシンジュクゴチョウメ,Nishi-shinjuku-gochome,Nishi-shinjuku-gochome,西新宿五丁目,니시신주쿠고초메,29,,,,,99301,13,160-0023,東京都新宿区西新宿5-25-9,139.684304,35.689798,0000-00-00,0000-00-00,0,9930129 -9930130,2800220,中野坂上,ナカノサカウエ,Nakano-sakaue,Nakano-sakaue,中野坂上,나카노사카우에,30,,,,,99301,13,164-0011,東京都中野区中央2-1-2,139.682279,35.69709,0000-00-00,0000-00-00,0,9930130 -9930131,1131213,東中野,ヒガシナカノ,Higashi-nakano,Higashi-nakano,东中野,히가시나카노,31,,,,,99301,13,164-0003,東京都中野区東中野4丁目,139.682987,35.706891,0000-00-00,0000-00-00,0,9930131 -9930132,2200704,中井,ナカイ,Nakai,Nakai,中井,나카이,32,,,,,99301,13,161-0032,東京都新宿区中落合1-19-1,139.686356,35.714035,0000-00-00,0000-00-00,0,9930132 -9930133,9930133,落合南長崎,オチアイミナミナガサキ,Ochiai-minami-nagasaki,Ochiai-minami-nagasaki,落合南长崎,오치아이미나미나가사키,33,,,,,99301,13,161-0031,東京都新宿区西落合3-1-18,139.683303,35.723608,0000-00-00,0000-00-00,0,9930133 -9930134,9930134,新江古田,シンエゴタ,Shin-egota,Shin-egota,新江古田,신에고타,34,,,,,99301,13,165-0023,東京都中野区江原町2-29-13,139.670653,35.732538,0000-00-00,0000-00-00,0,9930134 -9930135,2200106,練馬,ネリマ,Nerima,Nerima,练马,네리마,35,,,,,99301,13,176-0001,東京都練馬区練馬1-3-5,139.65477,35.737404,0000-00-00,0000-00-00,0,9930135 -9930136,2200402,豊島園,トシマエン,Toshimaen,Toshimaen,丰岛园,도시마엔,36,,,,,99301,13,176-0001,東京都練馬区練馬4-16-5,139.64894845621,35.742567043044,0000-00-00,0000-00-00,0,9930136 -9930137,9930137,練馬春日町,ネリマカスガチョウ,Nerima-kasugacho,Nerima-kasugacho,练马春日町,네리마카스가초,37,,,,,99301,13,179-0074,東京都練馬区春日町3-29-25,139.640236,35.751452,0000-00-00,0000-00-00,0,9930137 -9930138,9930138,光が丘,ヒカリガオカ,Hikarigaoka,Hikarigaoka,光丘,히카리가오카,38,,,,,99301,13,179-0072,東京都練馬区光が丘2-9-5,139.628603,35.758526,0000-00-00,0000-00-00,0,9930138 +9930101,9930100,都庁前,トチョウマエ,Tochomae,Tochomae,都厅前,도초마에,28,,,,,99301,13,160-0023,東京都新宿区西新宿2-8-1,139.69257,35.690551,0000-00-00,0000-00-00,0,9930129 +9930129,9930129,西新宿五丁目,ニシシンジュクゴチョウメ,Nishi-shinjuku-gochome,Nishi-shinjuku-gochome,西新宿五丁目,니시신주쿠고초메,29,,,,,99301,13,160-0023,東京都新宿区西新宿5-25-9,139.684304,35.689798,0000-00-00,0000-00-00,0,9930130 +9930130,2800220,中野坂上,ナカノサカウエ,Nakano-sakaue,Nakano-sakaue,中野坂上,나카노사카우에,30,,,,,99301,13,164-0011,東京都中野区中央2-1-2,139.682279,35.69709,0000-00-00,0000-00-00,0,9930131 +9930131,1131213,東中野,ヒガシナカノ,Higashi-nakano,Higashi-nakano,东中野,히가시나카노,31,,,,,99301,13,164-0003,東京都中野区東中野4丁目,139.682987,35.706891,0000-00-00,0000-00-00,0,9930132 +9930132,2200704,中井,ナカイ,Nakai,Nakai,中井,나카이,32,,,,,99301,13,161-0032,東京都新宿区中落合1-19-1,139.686356,35.714035,0000-00-00,0000-00-00,0,9930133 +9930133,9930133,落合南長崎,オチアイミナミナガサキ,Ochiai-minami-nagasaki,Ochiai-minami-nagasaki,落合南长崎,오치아이미나미나가사키,33,,,,,99301,13,161-0031,東京都新宿区西落合3-1-18,139.683303,35.723608,0000-00-00,0000-00-00,0,9930134 +9930134,9930134,新江古田,シンエゴタ,Shin-egota,Shin-egota,新江古田,신에고타,34,,,,,99301,13,165-0023,東京都中野区江原町2-29-13,139.670653,35.732538,0000-00-00,0000-00-00,0,9930135 +9930135,2200106,練馬,ネリマ,Nerima,Nerima,练马,네리마,35,,,,,99301,13,176-0001,東京都練馬区練馬1-3-5,139.65477,35.737404,0000-00-00,0000-00-00,0,9930136 +9930136,2200402,豊島園,トシマエン,Toshimaen,Toshimaen,丰岛园,도시마엔,36,,,,,99301,13,176-0001,東京都練馬区練馬4-16-5,139.64894845621,35.742567043044,0000-00-00,0000-00-00,0,9930137 +9930137,9930137,練馬春日町,ネリマカスガチョウ,Nerima-kasugacho,Nerima-kasugacho,练马春日町,네리마카스가초,37,,,,,99301,13,179-0074,東京都練馬区春日町3-29-25,139.640236,35.751452,0000-00-00,0000-00-00,0,9930138 +9930138,9930138,光が丘,ヒカリガオカ,Hikarigaoka,Hikarigaoka,光丘,히카리가오카,38,,,,,99301,13,179-0072,東京都練馬区光が丘2-9-5,139.628603,35.758526,0000-00-00,0000-00-00,0,9930139 9930201,9930201,西馬込,ニシマゴメ,Nishi-magome,Nishi-magome,西马込,니시마고메,01,,,,,99302,13,143-0026,東京都大田区西馬込2-1-6,139.705942,35.586859,0000-00-00,0000-00-00,0,9930201 9930202,9930202,馬込,マゴメ,Magome,Magome,马込,마고메,02,,,,,99302,13,143-0021,東京都大田区北馬込2-31-9,139.711772,35.596435,0000-00-00,0000-00-00,0,9930202 9930203,2600404,中延,ナカノブ,Nakanobu,Nakanobu,中延,나카노부,03,,,,,99302,13,142-0053,東京都品川区中延4-5-5,139.713736,35.605769,0000-00-00,0000-00-00,0,9930203 diff --git a/data/4!types.csv b/data/4!types.csv index 7d424745..367b9289 100644 --- a/data/4!types.csv +++ b/data/4!types.csv @@ -1,332 +1,332 @@ -id,type_cd,type_name,type_name_k,type_name_r,type_name_zh,type_name_ko,color,direction,kind,priority,#メモ,#着手済 -DEFAULT,1,のぞみ,ノゾミ,Nozomi,希望,노조미,#FFD400,0,4,0,,COMPLETE -DEFAULT,2,ひかり,ヒカリ,Hikari,光,히카리,#FF0000,0,4,0,,COMPLETE -DEFAULT,3,こだま,コダマ,Kodama,回声,고다마,#3050FF,0,4,0,,COMPLETE -DEFAULT,4,みずほ,ミズホ,Mizuho,瑞穗,미즈호,#FFA500,0,4,0,,COMPLETE -DEFAULT,5,さくら,サクラ,Sakura,樱,사쿠라,#FF69B4,0,4,0,,COMPLETE -DEFAULT,6,つばめ,ツバメ,Tsubame,燕,쓰바메,#40E0D0,0,4,0,,COMPLETE -DEFAULT,7,はやぶさ,ハヤブサ,Hayabusa,隼,하야부사,#008000,0,4,0,,COMPLETE -DEFAULT,8,はやて,ハヤテ,Hayate,疾风,하야테,#008000,0,4,0,,COMPLETE -DEFAULT,9,やまびこ,ヤマビコ,Yamabiko,山彦,야마비코,#008001,0,4,0,,COMPLETE -DEFAULT,10,なすの,ナスノ,Nasuno,那须野,나스노,#008002,0,4,0,,COMPLETE -DEFAULT,11,こまち,コマチ,Komachi,小町,고마치,#FF0080,0,4,0,,COMPLETE -DEFAULT,12,つばさ,ツバサ,Tsubasa,翼,쓰바사,#FF8000,0,4,0,,COMPLETE -DEFAULT,13,とき,トキ,Toki,朱鹭,도키,#008000,0,4,0,,COMPLETE -DEFAULT,14,たにがわ,タニガワ,Tanigawa,谷川,다니가와,#0000FF,0,4,0,,COMPLETE -DEFAULT,15,かがやき,カガヤキ,Kagayaki,光辉,가가야키,#FFD400,0,4,0,,COMPLETE -DEFAULT,16,はくたか,ハクタカ,Hakutaka,白鹰,하쿠타카,#FF0000,0,4,0,,COMPLETE -DEFAULT,17,あさま,アサマ,Asama,浅间,아사마,#0000FF,0,4,0,,COMPLETE -DEFAULT,18,つるぎ,ツルギ,Tsurugi,剑,쓰루기,#3050FF,0,4,0,,COMPLETE -DEFAULT,19,かもめ,カモメ,KAMOME,海鸥,카모메,#E10017,0,4,0,,COMPLETE -DEFAULT,100,普通,フツウ,Local,慢车,보통,#1F63C6,0,0,2,,PARTIAL -DEFAULT,101,各駅停車,カクエキテイシャ,Local,每站停车,각역정차,#1F63C6,0,0,2,,PARTIAL -DEFAULT,102,快速,カイソク,Rapid,快车,쾌속,#DC143C,0,2,0,,PARTIAL -DEFAULT,103,特別快速,トクベツカイソク,Special Rapid,特别快车,특별쾌속,#DC143C,0,2,0,,COMPLETE -DEFAULT,104,通勤快速,ツウキンカイソク,Commuter Rapid,通勤快车,통근쾌속,#581882,0,6,0,,COMPLETE -DEFAULT,105,快速(赤),カイソク(アカ),Rapid(Red),快车,쾌속,#FF0000,0,2,0,,NOT -DEFAULT,106,快速(緑),カイソク(ミドリ),Rapid(Green),快车,쾌속,#00FF00,0,2,0,,NOT -DEFAULT,107,ホームライナー,ホームライナー,Home Liner,家用班轮,홈 라이너,#DC143C,0,2,0,,NOT -DEFAULT,108,区間快速,クカンカイソク,Regional Rapid,区域快车,구간쾌속,#DC143C,0,2,0,,PARTIAL -DEFAULT,109,快速みえ,カイソクミエ,Rapid Mie,快速三重,쾌속미에,#DC143C,0,2,0,,COMPLETE -DEFAULT,110,新快速,シンカイソク,Special Rapid,新快速,새쾌속,#0071BE,0,5,0,JR西日本用,COMPLETE -DEFAULT,111,直通快速,チョクツウカイソク,Direct Rapid,直接快速,직통쾌속,#F5A200,0,2,0,,COMPLETE -DEFAULT,112,B快速,Bカイソク,B Rapid,B快速,B쾌속,#0071BE,0,2,0,,COMPLETE -DEFAULT,113,おくたま号,オクタマゴウ,Okutama,奧多摩号,오쿠타마호,#F15A22,0,2,0,,COMPLETE -DEFAULT,114,大和路快速,ヤマトジカイソク,Yamatoji Rapid,大和路快速,야마토지 쾌속,#02AD73,0,2,0,,COMPLETE -DEFAULT,115,丹波路快速,タンバジカイソク,Tambaji Rapid,坦巴路快速,단바로 쾌속,#FEC210,0,2,0,,COMPLETE -DEFAULT,116,みやこ路快速,ミヤコジカイソク,Miyakoji Rapid,都路快速,미야코지 쾌속,#FEC210,0,2,0,,COMPLETE -DEFAULT,117,関空快速,カンクウカイソク,Kansai Airport Rapid,关空快速,간쿠 쾌속,#007AC2,0,2,0,,COMPLETE -DEFAULT,118,紀州路快速,キシュウジカイソク,Kishūji Rapid,紀州路快速,기슈로 쾌속,#FD7E00,0,2,0,,COMPLETE -DEFAULT,119,青梅特快,オウメトッカイ,Ōme Special Rapid,青梅特快,오메특쾌,#44984D,0,2,0,,COMPLETE -DEFAULT,120,中央特快,チュウオウトッカイ,Chūō Special Rapid,中央特快,중앙특쾌,#2C67B2,0,2,0,,COMPLETE -DEFAULT,121,通勤特快,ツウキントッカイ,Commuter Special Rapid,通勤特快,통근특쾌,#D42D22,0,2,0,,COMPLETE -DEFAULT,122,サンライナー,サンライナー,Sun Liner,Sun Liner,산 라이너,#DC143C,0,2,0,,COMPLETE -DEFAULT,123,マリンライナー,マリンライナー,Marine Liner,Marine Liner,마린라이나,#DC143C,0,5,0,,COMPLETE -DEFAULT,124,快速ことぶき,カイソクコトブキ,Rapid Kotobuki,快速寿,쾌속 축수,#DC143C,0,2,0,,NOT -DEFAULT,125,シティライナー,シティライナー,City Liner,City Liner,시티 라이너,#DC143C,0,2,0,,NOT -DEFAULT,126,通勤ライナー,ツウキンライナー,Commuter Liner,通勤Liner,통근 라이너,#DC143C,0,2,0,,NOT -DEFAULT,127,安芸路ライナー,アキジライナー,Akiji Liner,安藝路Liner,아키로 라이너,#DC143C,0,2,0,,NOT -DEFAULT,128,みよしライナー,ミヨシライナー,Miyoshi Liner,三吉Liner,미요시 라이너,#DC143C,0,2,0,,NOT -DEFAULT,129,とっとりライナー,トットリライナー,Tottori Liner,鳥取Liner,돗토리 라이너,#DC143C,0,2,0,,NOT -DEFAULT,130,アクアライナー,アクアライナー,Aqua Liner,Aqua Liner,아쿠아 라이너,#DC143C,0,2,0,,NOT -DEFAULT,131,快速(青),カイソク(アオ),Rapid(Blue),快车,쾌속,#0000FF,0,2,0,,NOT -DEFAULT,132,各駅停車(南武支線),カクエキテイシャ,Local(Nambu Branch Line),每站停车(南埠支线),각역정차(난부 지선),#FFD400,0,1,0,,COMPLETE -DEFAULT,133,普通(成田空港方面),フツウ,Local(for Narita Airport),慢车(成田机场),보통(나리타 공항),#00B261,0,1,0,,COMPLETE -DEFAULT,134,区間快速(加茂方面),クカンカイソク,Regional Rapid(for Kamo),区间快速,구간쾌속,#02AD73,0,2,0,,COMPLETE -DEFAULT,135,区間快速(和歌山方面),クカンカイソク,Regional Rapid(for Wakayama),区间快速,구간쾌속,#F89C1C,0,2,0,,COMPLETE -DEFAULT,136,直通快速(和歌山方面),チョクツウカイソク,Direct Rapid(for Wakayama),直接快速,직통쾌속,#F89C1C,0,2,0,,COMPLETE -DEFAULT,137,直通快速(関西空港方面),チョクツウカイソク,Direct Rapid(for Kansai Airport),直接快速,직통쾌속,#007AC2,0,2,0,,COMPLETE -DEFAULT,138,新快速,シンカイソク,New Rapid,新快速,신쾌속,#FF4500,0,2,0,JR東海用,COMPLETE -DEFAULT,139,普通(辰野支線),フツウ,Local(Tatsuno Branch Line),慢车(辰野支线),보통(다쓰노 지선),#0074BE,0,1,0,,COMPLETE -DEFAULT,140,普通(我孫子支線),フツウ,Local(Abiko Branch Line),慢车(我孫子支线),보통(아비코 지선),#00B261,0,1,0,,COMPLETE -DEFAULT,141,普通(利府支線),フツウ,Local(Rifu Branch Line),慢车(利府线),보통(리후선),#3CB371,0,1,0,,COMPLETE -DEFAULT,142,普通(長与経由),フツウ,Local(Nagayo Branch Line),慢车(长与支线),보통(나가요 경로),#FAAF18,0,1,0,,COMPLETE -DEFAULT,143,普通(新千歳空港方面),フツウ,Local(for New Chitose Airport),慢车,보통,#00B2EB,0,1,0,,COMPLETE -DEFAULT,144,普通(砂原線経由),フツウ,Local(Sawara Branch Line),慢车(砂原支线),보통(사와라 지선),#0072BC,0,1,0,,COMPLETE -DEFAULT,145,普通(室蘭方面),フツウ,Local(for Muroran),慢车,보통,#2CB431,0,1,0,,COMPLETE -DEFAULT,146,シーサイドライナー,シーサイドライナー,Sea Side Liner,滨海快线,바다 사이드 라이너,#0095D9,0,2,0,,COMPLETE -DEFAULT,147,エアポート,エアポート,Airport,机场号,에어포트,#FF0080,0,5,0,,COMPLETE -DEFAULT,148,ニセコライナー,ニセコライナー,Niseko Liner,二世谷快车,니세코라이너,#0098E1,0,2,0,,COMPLETE -DEFAULT,149,普通(美濃赤坂線),フツウ,Local(Mino-Akasaka Line),慢车(美浓赤坂线),보통(미노아카사카 지선),#F68B1E,0,1,0,,COMPLETE -DEFAULT,150,普通(本山支線),フツウ,Local(Motoyama Branch Line),慢车(本山支线),보통(모토야마 지선),#695FAA,0,1,0,小野田線,COMPLETE -DEFAULT,151,あきがわ号,アキガワゴウ,Akigawa,秋川号,아키가와호,#F15A22,0,2,0,,COMPLETE -DEFAULT,152,普通,フツウ,Local,慢车,보통,#1F63C6,1,0,0,上り系統,PARTIAL -DEFAULT,153,普通,フツウ,Local,慢车,보통,#1F63C6,2,0,0,下り系統,PARTIAL -DEFAULT,154,快速,カイソク,Rapid,快车,쾌속,#DC143C,0,2,1,自動選択用,COMPLETE -DEFAULT,155,区間快速エアポート,クカンカイソクエアポート,Semi Rapid Airport,区域快车机场号,구간쾌속에어포트,#33ff33,0,5,0,,COMPLETE -DEFAULT,156,快速エアポート,カイソクエアポート,Rapid Airport,快车机场号,쾌속에어포트,#FF6600,0,5,0,,COMPLETE -DEFAULT,157,特別快速エアポート,トクベツカイソクエアポート,Special Rapid Airport,特别快车机场号,특별쾌속에어포트,#FF3300,0,5,0,,COMPLETE -DEFAULT,158,快速サンポート,カイソクサンポート,Rapid Sunport,快车太陽港号,쾌속선포트,#F39800,0,2,0,,PARTIAL -DEFAULT,159,普通(桜島方面),フツウ,Local(For Sakurajima),慢车,보통,#1F63C6,0,1,0,,COMPLETE -DEFAULT,160,快速きたみ,カイソクキタミ,Rapid Kitami,快车北见,쾌속니시기타미,#FF6600,0,2,0,,COMPLETE -DEFAULT,161,特別快速大雪,トクベツカイソクタイセツ,Special Rapid Taisetsu,特别快车大雪,특별쾌속타이세츠,#FF3300,0,2,0,,COMPLETE -DEFAULT,162,エキスポライナー,エキスポライナー,Expo Liner,世博会Liner,박람회 라이너,#0000ff,0,2,0,,COMPLETE -DEFAULT,163,快速,カイソク,Rapid,快车,쾌속,#DC143C,0,5,1,常磐線用,COMPLETE -DEFAULT,164,特別快速,トクベツカイソク,Special Rapid,特别快车,특별쾌속,#DC143C,0,5,0,常磐線用,COMPLETE -DEFAULT,165,通勤快速,ツウキンカイソク,Commuter Rapid,通勤快车,통근쾌속,#DC143C,0,6,0,TX用,COMPLETE -DEFAULT,166,快速,カイソク,Rapid,快车,쾌속,#DC143C,0,5,0,TX用,COMPLETE -DEFAULT,200,踊り子(池袋〜伊豆急下田),オドリコ,Odoriko(Ikebukuro to Izukyū-shimoda),踊子,무희,#035D67,0,4,0,,COMPLETE -DEFAULT,201,踊り子(東京〜伊豆急下田),オドリコ,Odoriko(Tokyo to Izukyū-shimoda),踊子,무희,#035D67,0,4,0,,COMPLETE -DEFAULT,202,踊り子(池袋〜修善寺),オドリコ,Odoriko(Ikebukuro to Shuzenji),踊子,무희,#035D67,0,4,0,,COMPLETE -DEFAULT,203,踊り子(東京〜修善寺),オドリコ,Odoriko(Tokyo to Shuzenji),踊子,무희,#035D67,0,4,0,,COMPLETE -DEFAULT,204,ひたち,ヒタチ,Hitachi,常陆,히타치,#035D67,0,4,0,,COMPLETE -DEFAULT,205,ときわ,トキワ,Tokiwa,常轮,토키와,#035D67,0,4,0,,COMPLETE -DEFAULT,206,北斗,ホクト,Hokuto,北斗,북두,#0072BC,0,4,0,,COMPLETE -DEFAULT,207,すずらん,スズラン,Suzuran,铃兰,은방울꽃,#0072BC,0,4,0,,COMPLETE -DEFAULT,208,ソニック,ソニック,Sonic,索尼克,소닉,#0095D9,0,4,0,,COMPLETE -DEFAULT,209,かいじ,カイジ,Kaiji,甲斐路,가이지,#0074BE,0,4,0,,COMPLETE -DEFAULT,210,あずさ,アズサ,Azusa,梓,아즈사,#0074BE,0,4,0,,COMPLETE -DEFAULT,211,サンライズ瀬戸,サンライズセト,Sunrise Seto,日出濑户,선라이즈 세토,#AA8D01,0,4,0,,COMPLETE -DEFAULT,212,サンライズ出雲,サンライズイズモ,Sunrise Izumo,日出出云,선라이즈 이즈모,#AA8D01,0,4,0,,COMPLETE -DEFAULT,213,サロベツ,サロベツ,Sarobetsu,佐呂別,살로베츠,#2CB431,0,4,0,,COMPLETE -DEFAULT,214,ライラック,ライラック,Lilac,丁香,라일락,#2CB431,0,4,0,,COMPLETE -DEFAULT,215,カムイ,カムイ,Kamui,神威,카무이,#2CB431,0,4,0,,COMPLETE -DEFAULT,216,宗谷,ソウヤ,Sōya,宗谷,소야,#2CB432,1,4,0,上り,COMPLETE -DEFAULT,217,宗谷,ソウヤ,Sōya,宗谷,소야,#2CB432,2,4,0,下り,COMPLETE -DEFAULT,218,オホーツク,オホーツク,Okhotsk,鄂霍次克,오호츠크,#2CB431,0,4,0,,COMPLETE -DEFAULT,219,大雪,タイセツ,Taisetsu,大雪,타이세츠,#2CB431,0,4,0,,COMPLETE -DEFAULT,220,南風,ナンプウ,Nanpū,南风,남풍,#E25885,0,4,0,,COMPLETE -DEFAULT,221,うずしお,ウズシオ,Uzushio,涡潮,우즈시오,#1CADCA,0,4,0,,COMPLETE -DEFAULT,222,こうのとり,コウノトリ,Kounotori,东方白鹳,고노토리,#FFCC00,0,4,0,,COMPLETE -DEFAULT,223,サンダーバード,サンダーバード,Thunderbird,雷鸟,선더버드,#0072BA,0,4,0,,COMPLETE -DEFAULT,224,ひだ(大阪〜富山),ヒダ,Hida(Osaka to Toyama),飞驒,히다,#F77321,0,4,0,,COMPLETE -DEFAULT,225,ひだ(名古屋発着),ヒダ,Hida(Nagoya to Toyama),飞驒,히다,#F77321,0,4,0,,COMPLETE -DEFAULT,226,富士回遊,フジカイユウ,FUJI EXCURSION,富士回游,후지카이유,#7B68EE,0,4,0,中央線-富士急行直通用,COMPLETE -DEFAULT,227,はちおうじ,ハチオウジ,Hachioji,八王子,하치오지,#F15A22,0,4,0,,COMPLETE -DEFAULT,228,おうめ,オウメ,Ome,青梅,오메,#F15A22,0,4,0,,COMPLETE -DEFAULT,229,しなの,シナノ,Shinano,信浓,시나노,#D56A29,0,4,0,,COMPLETE -DEFAULT,230,成田エクスプレス,ナリタエクスプレス,Narita Express,成田特快,나리타 익스프레스,#FF3333,0,4,0,,COMPLETE -DEFAULT,231,リレーかもめ,リレーカモメ,Relay KAMOME,接力海鸥,릴레이 카모메,#E10018,0,4,0,,COMPLETE -DEFAULT,232,あかぎ,アカギ,Akagi,赤城,아카기,#008000,0,4,0,,COMPLETE -DEFAULT,233,草津・四万,クサツ・シマ,Kusatsu/Shima,草津・四万,구사쓰・시마,#008000,0,4,0,,COMPLETE -DEFAULT,234,湘南(新宿発着),ショウナン,Shōnan(for Shinjuku or Odawara),湘南,쇼난,#F68B1E,0,4,0,,COMPLETE -DEFAULT,235,湘南(東京発着),ショウナン,Shōnan(for Tokyo or Odawara),湘南,쇼난,#F68B1E,0,4,0,,COMPLETE -DEFAULT,236,"SLぐんま -みなかみ",SLグンマ ミナカミ,"SL Gunma -Minakami","SL群马 -水上","SL군마 -미나카미",#0D0C09,0,2,0,,COMPLETE -DEFAULT,237,"SLぐんま -よこかわ",SLグンマ ヨコカワ,"SL Gunma -Yokokawa","SL群马 -横川","SL군마 -요코카와",#0D0C09,0,2,0,,COMPLETE -DEFAULT,238,やくも,ヤクモ,Yakumo,八雲,야쿠모,#bb5535,0,4,0,,COMPLETE -DEFAULT,239,スーパーまつかぜ,スーパーマツカゼ,Super Matsukaze,超松風,슈퍼마츠카제,#f8b500,0,4,0,,COMPLETE -DEFAULT,240,スーパーおき,スーパーオキ,Super Oki,超隱岐,슈퍼오키,#f8b500,0,4,0,,COMPLETE -DEFAULT,241,しまんと,シマント,Shimanto,四萬十,시만토,#E25885,0,4,0,,COMPLETE -DEFAULT,242,あしずり,アシズリ,Ashizuri,足折,아시즈리,#E25885,0,4,0,,COMPLETE -DEFAULT,243,しおかぜ,シオカゼ,Shiokaze,海風,바닷바람,#1CADCA,0,4,0,,COMPLETE -DEFAULT,244,いしづち,イシヅチ,Ishizuchi,石鎚,석진,#1CADCA,0,4,0,,COMPLETE -DEFAULT,245,おおぞら,オオゾラ,Ōzora,大空,큰 하늘,#2CB431,0,4,0,,COMPLETE -DEFAULT,246,とかち,トカチ,Tokachi,十勝,도카치,#2CB431,0,4,0,,COMPLETE -DEFAULT,247,きのさき,キノサキ,Kinosaki,城崎,시로사키,#800080,0,4,0,,COMPLETE -DEFAULT,248,はしだて,ハシダテ,Hashidate,橋立,하시다테,#ff0000,0,4,0,,COMPLETE -DEFAULT,249,まいづる,マイヅル,Maizuru,舞鶴,마이즈루,#ff8c00,0,4,0,,COMPLETE -DEFAULT,250,しらさぎ,シラサギ,Shirasagi,白鷺,백로,#f0e68c,0,4,0,,COMPLETE -DEFAULT,251,くろしお,クロシオ,Kuroshio,黑潮,구로시오,#40e0d0,0,4,0,,COMPLETE -DEFAULT,252,はるか,ハルカ,Haruka,遙,하루카,#00008b,0,4,0,,COMPLETE -DEFAULT,253,スーパーはくと,スーパーハクト,Super Hakuto,超級白兔,슈퍼 하쿠토,#0000ff,0,4,0,,COMPLETE -DEFAULT,254,スーパーいなば,スーパーイナバ,Super Inaba,超級因幡,슈퍼 요시만,#7cfc00,0,4,0,,COMPLETE -DEFAULT,255,宇和海,ウワカイ,Uwakai,宇和海,우와해,#00bfff,0,4,0,,COMPLETE -DEFAULT,256,剣山,ツルギサン,Tsurugisan,劍山,검산,#00008b,0,4,0,,COMPLETE -DEFAULT,257,むろと,ムロト,Muroto,室戶,무로토,#00bfff,0,4,0,,COMPLETE -DEFAULT,258,みどり,ミドリ,Midori,綠,미도리의,#008000,0,4,0,,COMPLETE -DEFAULT,259,ハウステンボス,ハウステンボス,Huis Ten Bosch,豪斯登堡,하우스텐보스,#ff8c00,0,4,0,,COMPLETE -DEFAULT,260,かささぎ,カササギ,Kasasagi,喜鵲,가사기,#dc143c,0,4,0,,COMPLETE -DEFAULT,261,きらめき,キラメキ,Kirameki,閃耀,반짝임,#ff0000,0,4,0,,COMPLETE -DEFAULT,262,にちりん,ニチリン,Nichirin,日輪,일륜,#ffa500,0,4,0,,COMPLETE -DEFAULT,263,にちりんシーガイア,ニチリンシーガイア,Nichirin Sea Gaia,日輪喜凱亞,일륜 시가이아,#ffa500,0,4,0,,COMPLETE -DEFAULT,264,ひゅうが,ヒュウガ,Hyuga,日向,휴가,#ff0000,0,4,0,,COMPLETE -DEFAULT,265,きりしま,キリシマ,Kirishima,霧島,기리시마,#006400,0,4,0,,COMPLETE -DEFAULT,266,かいおう,カイオウ,Kaiō,魁皇,카이오,#8b0000,0,4,0,,COMPLETE -DEFAULT,267,ゆふ,ユフ,Yufu,由布,유후,#ffff00,0,4,0,,COMPLETE -DEFAULT,268,ゆふいんの森,ユフインノモリ,Yufuin no Mori,由布院之森,유후인노모리,#228b22,0,4,0,,COMPLETE -DEFAULT,269,有明,アリアケ,Ariake,有明,아리아케,#daa520,0,4,0,,COMPLETE -DEFAULT,270,九州横断特急,キュウシュウオウダントッキュウ,Trans-Kyushu Limited Express,九州橫斷特急,규슈 횡단 특급,#dc143c,0,4,0,,COMPLETE -DEFAULT,271,南紀,ナンキ,Nanki,南紀,난키,#00bfff,0,4,0,,COMPLETE -DEFAULT,272,伊那路,イナジ,Inaji,伊那路,이나로,#228b22,0,4,0,,COMPLETE -DEFAULT,273,東海,トウカイ,Tōkai,東海,도카이,#ff8c00,0,4,0,,COMPLETE -DEFAULT,274,ふじかわ,フジカワ,Fujikawa,富士川,후지카와,#90ee90,0,4,0,,COMPLETE -DEFAULT,275,わかしお,ワカシオ,Wakashio,若潮,와카시오,#ff0000,0,4,0,,COMPLETE -DEFAULT,276,新宿わかしお,シンジュクワカシオ,Shinjuku Wakashio,新宿若潮,신주쿠와카시오의,#ff0000,0,4,0,,COMPLETE -DEFAULT,277,さざなみ,サザナミ,Sazanami,细波,사자나미,#00bfff,0,4,0,,COMPLETE -DEFAULT,278,新宿さざなみ,シンジュクサザナミ,Shinjuku Sazanami,新宿细波,신주쿠사자나미,#00bfff,0,4,0,,COMPLETE -DEFAULT,279,しおさい,シオサイ,Shiosai,潮骚,시오사이,#ffff00,0,4,0,,COMPLETE -DEFAULT,280,あやめ,アヤメ,Ayame,菖蒲,아야메,#ffd700,0,4,0,,COMPLETE -DEFAULT,281,つがる,ツガル,Tsugaru,津輕,쓰가루,#ff0000,0,4,0,,COMPLETE -DEFAULT,282,いなほ,イナホ,Inaho,稻穗,이나호,#ffa500,0,4,0,,COMPLETE -DEFAULT,283,北越,ホクエツ,Hokuetsu,北越,호쿠코시,#00ffff,0,4,0,,COMPLETE -DEFAULT,284,しらゆき,シラユキ,Shirayuki,白雪,백설,#800080,0,4,0,,COMPLETE -DEFAULT,285,ダイナスター,ダイナスター,Dinostar,恐龍星,다이노스타,#191970,0,4,0,,COMPLETE -DEFAULT,286,能登かがり火,ノトカガリビ,Noto Kagaribi,能登篝火,노토 카오리 불,#dc143c,0,4,0,,COMPLETE -DEFAULT,287,サフィール踊り子,サフィールオドリコ,Saphir Odoriko,蓝宝石踊子,사필 무희,#035D67,0,4,0,,COMPLETE -DEFAULT,288,はまかぜ,ハマカゼ,Hamakaze,濱風,하마카제,#b22222,0,4,0,,COMPLETE -DEFAULT,289,らくラクはりま,ラクラクハリマ,Rakuraku Harima,简单播磨,라쿠 라쿠 하리마,#00bfff,0,4,0,,COMPLETE -DEFAULT,290,らくラクびわこ,ラクラクビワコ,Rakuraku Biwako,简单琵琶湖,라쿠 라쿠 비와코,#0000ff,0,4,0,,COMPLETE -DEFAULT,291,らくラクやまと,ラクラクヤマト,Rakuraku Yamato,简单大和,라쿠 라쿠 야마토,#90ee90,0,4,0,,COMPLETE -DEFAULT,292,まほろば,マホロバ,Mahoroba,真秀场,마호로바,#008000,0,4,0,,COMPLETE -DEFAULT,293,信州,シンシュウ,Shinshu,信州,신슈,#800080,0,4,0,,COMPLETE -DEFAULT,294,ニセコ,ニセコ,Niseko,二世谷,니세코,#0098E1,0,4,0,,COMPLETE -DEFAULT,295,フラノラベンダーエクスプレス,フラノラベンダーエクスプレス,Furano Lavender Express,富良野薰衣草特快,푸라노 라벤더 익스프레스,#da70d6,0,4,0,,COMPLETE -DEFAULT,296,鎌倉,カマクラ,Kamakura,镰仓,가마쿠라,#00008b,0,4,0,,COMPLETE -DEFAULT,297,いにしへ,イニシヘ,Inishihe,在过去,어서,#8b0000,0,4,0,,COMPLETE -DEFAULT,300,普通,フツウ,Local,慢车,보통,#1F63C6,0,0,0,優先度0,PARTIAL -DEFAULT,301,各駅停車,カクエキテイシャ,Local,每站停车,각역정차,#1F63C6,0,0,0,優先度0,PARTIAL -DEFAULT,302,快速,カイソク,Rapid,快车,쾌속,#DC143C,0,2,0,廃止済み 102に移行,NOT -DEFAULT,303,区間急行,クカンキュウコウ,Semi Express,区域特快,구간급행,#D8CA00,0,3,0,,PARTIAL -DEFAULT,304,急行,キュウコウ,Express,特快,급행,#DC143C,0,3,0,,PARTIAL -DEFAULT,306,特急,トッキュウ,Limited Express,特快,특급,#DC143C,0,4,0,,COMPLETE -DEFAULT,307,エアポート快特,エアポートカイトク,Airport Limited Express,机场特快,공항쾌특,#FA9715,0,3,0,,COMPLETE -DEFAULT,308,快特(泉岳寺〜三崎口),カイトク,Limited Express(Sengakuji to Misakiguchi),特快,쾌특,#379412,0,3,0,,COMPLETE -DEFAULT,309,快特(泉岳寺〜羽田空港),カイトク,Limited Express(Sengakuji to Haneda Airport),特快,쾌특,#379412,0,3,0,,COMPLETE -DEFAULT,310,急行(泉岳寺〜羽田空港),キュウコウ,Express(Haneda Airport to Sengakuji),特快,급행,#0D83C3,0,3,0,,COMPLETE -DEFAULT,311,急行(逗子・葉山〜羽田空港),キュウコウ,Express(Haneda Airport to Zushi・Hayama),特快,급행,#0D83C3,0,3,0,,COMPLETE -DEFAULT,312,特急(泉岳寺〜三崎口),トッキュウ,Limited Express(Sengakuji to Misakiguchi),特快,특급,#EA0104,0,3,0,,COMPLETE -DEFAULT,313,特急(泉岳寺〜浦賀),トッキュウ,Limited Express(Sengakuji to Uraga),特快,특급,#EA0104,0,3,0,,PARTIAL -DEFAULT,314,通勤急行,ツウキンキュウコウ,Commuter Express,通勤快车,통근급행,#EEAA66,0,3,0,,PARTIAL -DEFAULT,315,準急,ジュンキュウ,Semi Express,准急,준급,#2EAB8D,0,3,0,,PARTIAL -DEFAULT,316,S-TRAIN(平日運行),エストレイン,S-TRAIN(Weekday),S-TRAIN,S-TRAIN,#8EC21F,0,2,0,,COMPLETE -DEFAULT,317,通勤特急,ツウキントッキュウ,Commuter Express,通勤特快,통근특급,#DC143C,0,4,0,,PARTIAL -DEFAULT,318,区間準急,クカンジュンキュウ,Section Semi Express,区间准急,구간준급,#00FF00,0,3,0,,PARTIAL -DEFAULT,319,区間急行,クカンキュウコウ,Section Express,区间快速,구간급행,#FF99FF,0,3,0,,PARTIAL -DEFAULT,320,空港快速,クウコウカイソク,Haneda Express,机场快速,공항쾌속,#DC143C,0,2,0,,COMPLETE -DEFAULT,321,区間快速,クカンカイソク,Rapid,区间快速,구간쾌속,#FFAE00,0,2,0,,COMPLETE -DEFAULT,322,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#F7931D,0,3,0,(小田原〜新宿),COMPLETE -DEFAULT,323,通勤準急,ツウキンジュンキュウ,Commuter Semi Express,通勤准急,통근준급,#00B66B,0,3,0,,COMPLETE -DEFAULT,324,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#F7931D,0,3,0,(唐木田〜新宿),COMPLETE -DEFAULT,325,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#F7931D,0,3,0,(片瀬江ノ島〜新宿),COMPLETE -DEFAULT,326,急行,キュウコウ,Express,特快,급행,#DC143C,0,3,0,(小田原〜新宿),COMPLETE -DEFAULT,327,急行,キュウコウ,Express,特快,급행,#DC143C,0,3,0,(唐木田〜新宿),COMPLETE -DEFAULT,328,急行,キュウコウ,Express,特快,급행,#DC143C,0,3,0,(片瀬江ノ島〜新宿),COMPLETE -DEFAULT,330,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#F7931D,0,3,0,小田急用,COMPLETE -DEFAULT,331,快速特急,カイソクトッキュウ,Limited Express,快速特快,쾌속특쾌,#049C5E,0,4,0,,COMPLETE -DEFAULT,332,アクセス特急,アクセストッキュウ,Access Express,访问特快,액세스 특급,#ED7D00,0,4,1,,PARTIAL -DEFAULT,333,準急,ジュンキュウ,Semi-Express,准急,준급,#2A9B50,0,3,0,堺筋準急,PARTIAL -DEFAULT,334,直通特急,チョクツウトッキュウ,Limited Express,直通特急,직통특급,#DD2E1E,0,4,0,山陽電車,COMPLETE -DEFAULT,335,区間快速,クカンカイソク,Semi Rapid,区间快速,구간쾌속,#000084,0,5,0,TX用,COMPLETE -DEFAULT,336,通勤快速,ツウキンカイソク,Commuter Rapid,通勤快车,통근쾌속,#FFA500,0,6,0,廃止済み 104に移行,NOT -DEFAULT,337,準特急,ジュントッキュウ,Semi-Limited Express,准特急,준특급,#FF6E00,0,4,0,,COMPLETE -DEFAULT,338,区間急行,クカンキュウコウ,Sub Express,区间快速,구간급행,#009A41,0,3,0,南海電車用,COMPLETE -DEFAULT,339,S-TRAIN(土休日運行),エストレイン,S-TRAIN(Holiday),S-TRAIN,S-TRAIN,#8EC21F,0,2,0,,COMPLETE -DEFAULT,340,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#C05EC4,0,3,0,西武用,COMPLETE -DEFAULT,341,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#004098,0,3,0,東武用,COMPLETE -DEFAULT,342,快速特急,カイソクトッキュウ,Rapid Limited Express,快速特快,쾌속특급,#C51C40,0,4,0,名鉄用,COMPLETE -DEFAULT,343,特急,トッキュウ,Limited Express,特快,특급,#E03837,0,4,0,名鉄用,COMPLETE -DEFAULT,344,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#034F98,0,3,0,名鉄用,COMPLETE -DEFAULT,345,急行,キュウコウ,Express,特快,급행,#00BEFE,0,3,0,名鉄用,COMPLETE -DEFAULT,346,準急,ジュンキュウ,Semi Express,准急,준급,#009945,0,3,0,名鉄用,COMPLETE -DEFAULT,347,普通,フツウ,Local,慢车,보통,#333333,0,0,0,名鉄用,COMPLETE -DEFAULT,348,空港急行,クウコウキュウコウ,Airport Express,机场快速,공항급행,#FF7F27,0,3,0,南海電車用,COMPLETE -DEFAULT,349,区間特急,クカントッキュウ,Limited Express,直通特急,구간특급,#A349A4,0,4,0,阪神電車,COMPLETE -DEFAULT,350,S特急,エストッキュウ,Limited Express,S特急,S특급,#22B14C,0,4,0,山陽電車,COMPLETE -DEFAULT,351,快速急行(新松田より急行),カイソクキュウコウ,Rapid Express(Express from Shin-Matsuda),快速急行,쾌속급행,#F7931D,0,3,0,,COMPLETE -DEFAULT,352,急行(新松田より各駅停車),キュウコウ,Express(Local from Shin-Matsuda),特快,급행,#DC143C,0,3,0,,COMPLETE -DEFAULT,353,各駅停車(新松田より急行),カクエキテイシャ,Local(Express from Shin-Matsuda),每站停车,각역정차,#1F63C6,0,0,0,,COMPLETE -DEFAULT,354,特急,トッキュウ,Special Express,特快,특급,#DC143C,0,4,0,京王線用,COMPLETE -DEFAULT,355,普通,フツウ,Local,慢车,보통,#000000,0,0,2,京急京成用,COMPLETE -DEFAULT,356,普通(西馬込方面),フツウ,Local(For Nishi-magome),慢车,보통,#000000,0,0,0,都営浅草線用,COMPLETE -DEFAULT,357,普通(押上方面),フツウ,Local(For Oshiage),慢车,보통,#000000,0,0,0,都営浅草線用,COMPLETE -DEFAULT,358,急行,キュウコウ,Express,特快,급행,#0D83C3,0,3,0,都営浅草線用,COMPLETE -DEFAULT,359,快速,カイソク,Rapid,快车,쾌속,#ff69b4,0,2,0,都営浅草線用,COMPLETE -DEFAULT,360,通勤特急,ツウキントッキュウ,Commuter Express,通勤特快,통근특급,#00bfff,0,4,0,都営浅草線用,COMPLETE -DEFAULT,361,特急(泉岳寺方面),トッキュウ,Limited Express(For Sengakuji),特快,특급,#DC143C,0,4,0,都営浅草線用,COMPLETE -DEFAULT,362,特急(押上方面),トッキュウ,Limited Express(For Oshiage),特快,특급,#DC143C,0,4,0,都営浅草線用,COMPLETE -DEFAULT,363,快特(泉岳寺方面),カイトク,Limited Express(For Sengakuji),特快,쾌특,#379412,0,3,0,都営浅草線用,COMPLETE -DEFAULT,364,快速特急(押上方面),カイソクトッキュウ,Limited Express(For Oshiage),快速特快,쾌속특쾌,#049C5E,0,4,0,都営浅草線用,COMPLETE -DEFAULT,365,通勤快急,ツウキンカイキュウ,Commuter Rapid Express,通勤快急,통근쾌급,#C05EC4,0,3,0,,COMPLETE -DEFAULT,366,特快速,トッカイソク,Special Rapid Express,特快车,특쾌속,#DC143C,0,3,0,,COMPLETE -DEFAULT,367,快速(芝山千代田方面),カイソク,Rapid(For Shibayama-Chiyoda),快车,쾌속,#ff69b4,0,2,0,都営浅草線用,COMPLETE -DEFAULT,368,ノンストップ,ノンストップ,Nonstop,马不停蹄,논스톱,#4169e1,0,2,0,,COMPLETE -DEFAULT,369,普通(名古屋港方面),フツウ,Local(For Nagoyako),慢车,보통,#1F63C6,0,1,0,,COMPLETE -DEFAULT,370,通勤準急,ツウキンジュンキュウ,Commuter Semi Express,通勤准急,통근준급,#0072BA,0,3,0,西武線用,COMPLETE -DEFAULT,371,A特急,Aトッキュウ,A Limited Express,A特快,A특급,#DC143C,0,4,0,,COMPLETE -DEFAULT,372,B特急,Bトッキュウ,B Limited Express,B特快,B특급,#DC143C,0,4,0,,COMPLETE -DEFAULT,373,区間準急,クカンジュンキュウ,Sub. Semi-Express,区间准急,구간준급,#00FF00,0,3,0,近鉄奈良線・難波線・大阪線、阪神なんば線・阪神本線用,PARTIAL -DEFAULT,374,区間急行,クカンキュウコウ,Sub. Express,区间快速,구간급행,#F7931D,0,3,0,近鉄用,COMPLETE -DEFAULT,375,急行,キュウコウ,Express,特快,급행,#F7931D,0,3,0,近鉄用,COMPLETE -DEFAULT,376,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#DC143C,0,3,0,近鉄用,COMPLETE -DEFAULT,377,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#00BFFF,0,3,0,阪神なんば線・阪神本線用,COMPLETE -DEFAULT,378,快速,カイソク,Rapid,快车,쾌속,#0000FF,0,2,0,京王用,PARTIAL -DEFAULT,379,快速,カイソク,Rapid,快车,쾌속,#00BFFF,0,2,0,西武用,PARTIAL -DEFAULT,380,急行,キュウコウ,Express,特快,급행,#F7931D,0,3,0,阪急用,COMPLETE -DEFAULT,381,通勤急行,ツウキンキュウコウ,Commuter Express,通勤快车,통근급행,#FFFF00,0,3,0,西武・阪急用,PARTIAL -DEFAULT,382,急行,キュウコウ,Express,特快,급행,#008000,0,3,0,京王・西鉄用,PARTIAL -DEFAULT,383,区間急行,クカンキュウコウ,Semi Express,区域特快,구간급행,#009A41,0,3,0,京阪用,PARTIAL -DEFAULT,384,準急,ジュンキュウ,Sub Express,准急,준급,#0000FF,0,3,0,京阪用,PARTIAL -DEFAULT,385,準急,ジュンキュウ,Semi Express,准急,준급,#0000FF,0,3,0,南海用,PARTIAL -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,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 -DEFAULT,405,拝島ライナー,ハイジマライナー,Haijima Liner,拜岛Liner,하이지마 라이너,#B4C300,0,2,0,,COMPLETE -DEFAULT,406,TJライナー(下り),TJライナー,TJ Liner(Ikebukuro to Ogawamachi),TJ Liner,TJ Liner,#FF710A,2,2,0,,COMPLETE -DEFAULT,407,TJライナー(上り),TJライナー,TJ Liner(Ogawamachi to Ikebukuro),TJ Liner,TJ Liner,#008CD6,1,2,0,,COMPLETE -DEFAULT,408,各駅停車(北埠頭方面),カクエキテイシャ,Local,每站停车,각역정차,#9686BD,0,1,0,ポートアイランド線用,COMPLETE -DEFAULT,409,各駅停車(田園都市線経由),カクエキテイシャ,Local,每站停车,각역정차,#1F63C7,0,0,0,大井町線用,COMPLETE -DEFAULT,410,泉北ライナー,センボクライナー,Semboku Liner,泉北Liner,센보쿠라이너,#E6B422,0,2,0,,COMPLETE -DEFAULT,411,各駅停車(北綾瀬支線),カクエキテイシャ,Local,每站停车,각역정차,#009944,0,1,0,北綾瀬支線,COMPLETE -DEFAULT,412,ライナー,ライナー,Liner,Liner,정기선,#DC143C,0,2,0,,COMPLETE -DEFAULT,500,りょうもう(浅草〜伊勢崎),リョウモウ,Ryomo(Asakusa to Isesaki),Ryomo,료이제,#FF0000,0,4,0,,COMPLETE -DEFAULT,501,りょうもう(浅草〜葛生),リョウモウ,Ryomo(Asakusa to Kuzū),Ryomo,료이제,#FF0000,0,4,0,,COMPLETE -DEFAULT,502,りょうもう(浅草〜赤城),リョウモウ,Ryomo(Asakusa to Akagi),Ryomo,료이제,#FF0000,0,4,0,,COMPLETE -DEFAULT,503,スカイライナー,スカイライナー,Skyliner,Skyliner,스카이라이너,#0A3788,0,4,0,,COMPLETE -DEFAULT,504,小江戸号,コエドゴウ,Koedo,小江户,고에도,#E73042,0,4,0,,COMPLETE -DEFAULT,505,川越特急,カワゴエトッキュウ,Kawagoe Limited Express,川越特快,가와고에 특급,#E73799,0,4,0,,COMPLETE -DEFAULT,506,サザン,サザン,Southern,南方,남부,#3366CC,0,4,0,,COMPLETE -DEFAULT,507,ラピートα,ラピートアルファ,rapi:tα,rapi:tα,라피트α,#0065AF,0,4,0,,COMPLETE -DEFAULT,508,ラピートβ,ラピートベータ,rapi:tβ,rapi:tβ,라피트β,#0065AF,0,4,0,,COMPLETE -DEFAULT,509,ちちぶ,チチブ,Chichibu,秩父,지치부,#FF6600,0,4,0,,COMPLETE -DEFAULT,510,Mt.TAKAO,マウントタカオ,Mt.TAKAO,Mt.TAKAO,Mt.TAKAO,#57A100,0,4,0,,COMPLETE -DEFAULT,511,ミュースカイ,ミュースカイ,μ-SKY,μ-SKY,μ-SKY,#FAA902,0,4,0,,COMPLETE -DEFAULT,512,ひのとり,ヒノトリ,HINOTORI,HINOTORI,HINOTORI,#AD2320,0,4,0,,COMPLETE -DEFAULT,513,こうや,コウヤ,KŌYA,高野,코야,#009A41,0,4,0,,COMPLETE -DEFAULT,514,りんかん,リンカン,RINKAN,林间,린칸,#009A42,0,4,0,,COMPLETE -DEFAULT,515,はしだて,ハシダテ,Hashidate,桥立,하시다테,#E80000,0,4,0,,COMPLETE -DEFAULT,516,スーパーはこね,スーパーハコネ,Super Hakone,超级箱根,슈퍼 하코네,#2288CC,0,4,0,,COMPLETE -DEFAULT,517,はこね,ハコネ,Hakone,箱根,하코네,#2288CC,0,4,0,,COMPLETE -DEFAULT,518,メトロはこね,メトロハコネ,Metro Hakone,地下铁箱根,메트로 하코네,#2288CC,0,4,0,,COMPLETE -DEFAULT,519,THライナー,THライナー,TH Liner,TH Liner,TH Liner,#B50033,0,2,0,,COMPLETE -DEFAULT,520,けごん・きぬ,ケゴン・キヌ,Kegon/Kinu,华严・绢,케곤・키누,#00458F,0,4,0,,COMPLETE -DEFAULT,521,きぬがわ,キヌガワ,Kinugawa,鬼怒川,기누가와,#378640,0,4,0,,COMPLETE -DEFAULT,522,会津,アイヅ,Aizu,会津,아이즈,#009F49,0,4,0,,COMPLETE -DEFAULT,523,スペーシアX(7号・8号),スペーシアX(7ゴウ・8ゴウ),SPACIA X(No.7/No.8),SPACIA X(7号/8号),SPACIA X(7호/8호),#221614,0,4,0,,COMPLETE -DEFAULT,524,スペーシアX(1号〜6号),スペーシアX(1ゴウ〜6ゴウ),SPACIA X(No.1 through No.6),SPACIA X(1号~6号),SPACIA X(7호~8호),#221614,0,4,0,,COMPLETE -DEFAULT,525,日光,ニッコウ,Nikkō,日光,햇빛,#378640,0,4,0,,COMPLETE -DEFAULT,526,さがみ,サガミ,Sagami,相模,사가미,#2288CC,0,4,0,,COMPLETE -DEFAULT,527,モーニングウェイ,モーニングウェイ,Morning Way,早晨的方式,모닝웨이,#2288CC,0,4,0,,COMPLETE -DEFAULT,528,ホームウェイ,ホームウェイ,Home way,回家的路,홈웨이,#2288CC,0,4,0,,COMPLETE -DEFAULT,529,メトロモーニングウェイ,メトロモーニングウェイ,Metro Morning Way,地下铁早晨的方式,메트로 모닝웨이,#2288CC,0,4,0,,COMPLETE -DEFAULT,530,メトロホームウェイ,メトロホームウェイ,Metro Home way,地下铁回家的路,메트로 홈웨이,#2288CC,0,4,0,,COMPLETE -DEFAULT,531,えのしま,エノシマ,Enoshima,江之岛,에노시마,#2288CC,0,4,0,,COMPLETE -DEFAULT,532,メトロえのしま,メトロエノシマ,Metro Enoshima,地下铁江之岛,메트로 에노시마,#2288CC,0,4,0,,COMPLETE -DEFAULT,533,ふじさん,フジサン,Mt. Fuji,富士山,후지 씨,#2288CC,0,4,0,,COMPLETE -DEFAULT,534,スカイツリーライナー,スカイツリーライナー,Skytree Liner,天空树衬里,스카이 트리 라이너,#87ceeb,0,4,0,,COMPLETE -DEFAULT,535,むさし,ムサシ,Musashi,武藏,무사시,#FF6600,0,4,0,,COMPLETE -DEFAULT,536,ドーム,ドーム,dome,圆顶,돔,#696969,0,4,0,,COMPLETE -DEFAULT,537,シティライナー,シティライナー,City Liner,City Liner,시티 라이너,#1e90ff,0,4,0,,COMPLETE -DEFAULT,538,モーニングライナー,モーニングライナー,Morning Liner,Morning Liner,모닝 라이너,#9400d3,0,4,0,,COMPLETE -DEFAULT,539,イブニングライナー,イブニングライナー,Evening Liner,Evening Liner,이브닝 라이너,#9400d3,0,4,0,,COMPLETE -DEFAULT,540,臨時ライナー,リンジライナー,Special Liner,临时Liner,임시 라이너,#add8e6,0,4,0,,COMPLETE -DEFAULT,541,GRAN 天空,グランテンクウ,GRAN Tenkū,GRAN 天空,GRAN 텐쿠,#AD7E2A,0,4,0,,COMPLETE +id,type_cd,type_name,type_name_k,type_name_r,type_name_zh,type_name_ko,color,direction,kind,priority,#メモ,#着手済 +DEFAULT,1,のぞみ,ノゾミ,Nozomi,希望,노조미,#FFD400,0,4,0,,COMPLETE +DEFAULT,2,ひかり,ヒカリ,Hikari,光,히카리,#FF0000,0,4,0,,COMPLETE +DEFAULT,3,こだま,コダマ,Kodama,回声,고다마,#3050FF,0,4,0,,COMPLETE +DEFAULT,4,みずほ,ミズホ,Mizuho,瑞穗,미즈호,#FFA500,0,4,0,,COMPLETE +DEFAULT,5,さくら,サクラ,Sakura,樱,사쿠라,#FF69B4,0,4,0,,COMPLETE +DEFAULT,6,つばめ,ツバメ,Tsubame,燕,쓰바메,#40E0D0,0,4,0,,COMPLETE +DEFAULT,7,はやぶさ,ハヤブサ,Hayabusa,隼,하야부사,#008000,0,4,0,,COMPLETE +DEFAULT,8,はやて,ハヤテ,Hayate,疾风,하야테,#008000,0,4,0,,COMPLETE +DEFAULT,9,やまびこ,ヤマビコ,Yamabiko,山彦,야마비코,#008001,0,4,0,,COMPLETE +DEFAULT,10,なすの,ナスノ,Nasuno,那须野,나스노,#008002,0,4,0,,COMPLETE +DEFAULT,11,こまち,コマチ,Komachi,小町,고마치,#FF0080,0,4,0,,COMPLETE +DEFAULT,12,つばさ,ツバサ,Tsubasa,翼,쓰바사,#FF8000,0,4,0,,COMPLETE +DEFAULT,13,とき,トキ,Toki,朱鹭,도키,#008000,0,4,0,,COMPLETE +DEFAULT,14,たにがわ,タニガワ,Tanigawa,谷川,다니가와,#0000FF,0,4,0,,COMPLETE +DEFAULT,15,かがやき,カガヤキ,Kagayaki,光辉,가가야키,#FFD400,0,4,0,,COMPLETE +DEFAULT,16,はくたか,ハクタカ,Hakutaka,白鹰,하쿠타카,#FF0000,0,4,0,,COMPLETE +DEFAULT,17,あさま,アサマ,Asama,浅间,아사마,#0000FF,0,4,0,,COMPLETE +DEFAULT,18,つるぎ,ツルギ,Tsurugi,剑,쓰루기,#3050FF,0,4,0,,COMPLETE +DEFAULT,19,かもめ,カモメ,KAMOME,海鸥,카모메,#E10017,0,4,0,,COMPLETE +DEFAULT,100,普通,フツウ,Local,慢车,보통,#1F63C6,0,0,2,,PARTIAL +DEFAULT,101,各駅停車,カクエキテイシャ,Local,每站停车,각역정차,#1F63C6,0,0,2,,PARTIAL +DEFAULT,102,快速,カイソク,Rapid,快车,쾌속,#DC143C,0,2,0,,PARTIAL +DEFAULT,103,特別快速,トクベツカイソク,Special Rapid,特别快车,특별쾌속,#DC143C,0,2,0,,COMPLETE +DEFAULT,104,通勤快速,ツウキンカイソク,Commuter Rapid,通勤快车,통근쾌속,#581882,0,6,0,,COMPLETE +DEFAULT,105,快速(赤),カイソク(アカ),Rapid(Red),快车,쾌속,#FF0000,0,2,0,,NOT +DEFAULT,106,快速(緑),カイソク(ミドリ),Rapid(Green),快车,쾌속,#00FF00,0,2,0,,NOT +DEFAULT,107,ホームライナー,ホームライナー,Home Liner,家用班轮,홈 라이너,#DC143C,0,2,0,,NOT +DEFAULT,108,区間快速,クカンカイソク,Regional Rapid,区域快车,구간쾌속,#DC143C,0,2,0,,PARTIAL +DEFAULT,109,快速みえ,カイソクミエ,Rapid Mie,快速三重,쾌속미에,#DC143C,0,2,0,,COMPLETE +DEFAULT,110,新快速,シンカイソク,Special Rapid,新快速,새쾌속,#0071BE,0,5,0,JR西日本用,COMPLETE +DEFAULT,111,直通快速,チョクツウカイソク,Direct Rapid,直接快速,직통쾌속,#F5A200,0,2,0,,COMPLETE +DEFAULT,112,B快速,Bカイソク,B Rapid,B快速,B쾌속,#0071BE,0,2,0,,COMPLETE +DEFAULT,113,おくたま号,オクタマゴウ,Okutama,奧多摩号,오쿠타마호,#F15A22,0,2,0,,COMPLETE +DEFAULT,114,大和路快速,ヤマトジカイソク,Yamatoji Rapid,大和路快速,야마토지 쾌속,#02AD73,0,2,0,,COMPLETE +DEFAULT,115,丹波路快速,タンバジカイソク,Tambaji Rapid,坦巴路快速,단바로 쾌속,#FEC210,0,2,0,,COMPLETE +DEFAULT,116,みやこ路快速,ミヤコジカイソク,Miyakoji Rapid,都路快速,미야코지 쾌속,#FEC210,0,2,0,,COMPLETE +DEFAULT,117,関空快速,カンクウカイソク,Kansai Airport Rapid,关空快速,간쿠 쾌속,#007AC2,0,2,0,,COMPLETE +DEFAULT,118,紀州路快速,キシュウジカイソク,Kishūji Rapid,紀州路快速,기슈로 쾌속,#FD7E00,0,2,0,,COMPLETE +DEFAULT,119,青梅特快,オウメトッカイ,Ōme Special Rapid,青梅特快,오메특쾌,#44984D,0,2,0,,COMPLETE +DEFAULT,120,中央特快,チュウオウトッカイ,Chūō Special Rapid,中央特快,중앙특쾌,#2C67B2,0,2,0,,COMPLETE +DEFAULT,121,通勤特快,ツウキントッカイ,Commuter Special Rapid,通勤特快,통근특쾌,#D42D22,0,2,0,,COMPLETE +DEFAULT,122,サンライナー,サンライナー,Sun Liner,Sun Liner,산 라이너,#DC143C,0,2,0,,COMPLETE +DEFAULT,123,マリンライナー,マリンライナー,Marine Liner,Marine Liner,마린라이나,#DC143C,0,5,0,,COMPLETE +DEFAULT,124,快速ことぶき,カイソクコトブキ,Rapid Kotobuki,快速寿,쾌속 축수,#DC143C,0,2,0,,NOT +DEFAULT,125,シティライナー,シティライナー,City Liner,City Liner,시티 라이너,#DC143C,0,2,0,,NOT +DEFAULT,126,通勤ライナー,ツウキンライナー,Commuter Liner,通勤Liner,통근 라이너,#DC143C,0,2,0,,NOT +DEFAULT,127,安芸路ライナー,アキジライナー,Akiji Liner,安藝路Liner,아키로 라이너,#DC143C,0,2,0,,NOT +DEFAULT,128,みよしライナー,ミヨシライナー,Miyoshi Liner,三吉Liner,미요시 라이너,#DC143C,0,2,0,,NOT +DEFAULT,129,とっとりライナー,トットリライナー,Tottori Liner,鳥取Liner,돗토리 라이너,#DC143C,0,2,0,,NOT +DEFAULT,130,アクアライナー,アクアライナー,Aqua Liner,Aqua Liner,아쿠아 라이너,#DC143C,0,2,0,,NOT +DEFAULT,131,快速(青),カイソク(アオ),Rapid(Blue),快车,쾌속,#0000FF,0,2,0,,NOT +DEFAULT,132,各駅停車(南武支線),カクエキテイシャ,Local(Nambu Branch Line),每站停车(南埠支线),각역정차(난부 지선),#FFD400,0,1,0,,COMPLETE +DEFAULT,133,普通(成田空港方面),フツウ,Local(for Narita Airport),慢车(成田机场),보통(나리타 공항),#00B261,0,1,0,,COMPLETE +DEFAULT,134,区間快速(加茂方面),クカンカイソク,Regional Rapid(for Kamo),区间快速,구간쾌속,#02AD73,0,2,0,,COMPLETE +DEFAULT,135,区間快速(和歌山方面),クカンカイソク,Regional Rapid(for Wakayama),区间快速,구간쾌속,#F89C1C,0,2,0,,COMPLETE +DEFAULT,136,直通快速(和歌山方面),チョクツウカイソク,Direct Rapid(for Wakayama),直接快速,직통쾌속,#F89C1C,0,2,0,,COMPLETE +DEFAULT,137,直通快速(関西空港方面),チョクツウカイソク,Direct Rapid(for Kansai Airport),直接快速,직통쾌속,#007AC2,0,2,0,,COMPLETE +DEFAULT,138,新快速,シンカイソク,New Rapid,新快速,신쾌속,#FF4500,0,2,0,JR東海用,COMPLETE +DEFAULT,139,普通(辰野支線),フツウ,Local(Tatsuno Branch Line),慢车(辰野支线),보통(다쓰노 지선),#0074BE,0,1,0,,COMPLETE +DEFAULT,140,普通(我孫子支線),フツウ,Local(Abiko Branch Line),慢车(我孫子支线),보통(아비코 지선),#00B261,0,1,0,,COMPLETE +DEFAULT,141,普通(利府支線),フツウ,Local(Rifu Branch Line),慢车(利府线),보통(리후선),#3CB371,0,1,0,,COMPLETE +DEFAULT,142,普通(長与経由),フツウ,Local(Nagayo Branch Line),慢车(长与支线),보통(나가요 경로),#FAAF18,0,1,0,,COMPLETE +DEFAULT,143,普通(新千歳空港方面),フツウ,Local(for New Chitose Airport),慢车,보통,#00B2EB,0,1,0,,COMPLETE +DEFAULT,144,普通(砂原線経由),フツウ,Local(Sawara Branch Line),慢车(砂原支线),보통(사와라 지선),#0072BC,0,1,0,,COMPLETE +DEFAULT,145,普通(室蘭方面),フツウ,Local(for Muroran),慢车,보통,#2CB431,0,1,0,,COMPLETE +DEFAULT,146,シーサイドライナー,シーサイドライナー,Sea Side Liner,滨海快线,바다 사이드 라이너,#0095D9,0,2,0,,COMPLETE +DEFAULT,147,エアポート,エアポート,Airport,机场号,에어포트,#FF0080,0,5,0,,COMPLETE +DEFAULT,148,ニセコライナー,ニセコライナー,Niseko Liner,二世谷快车,니세코라이너,#0098E1,0,2,0,,COMPLETE +DEFAULT,149,普通(美濃赤坂線),フツウ,Local(Mino-Akasaka Line),慢车(美浓赤坂线),보통(미노아카사카 지선),#F68B1E,0,1,0,,COMPLETE +DEFAULT,150,普通(本山支線),フツウ,Local(Motoyama Branch Line),慢车(本山支线),보통(모토야마 지선),#695FAA,0,1,0,小野田線,COMPLETE +DEFAULT,151,あきがわ号,アキガワゴウ,Akigawa,秋川号,아키가와호,#F15A22,0,2,0,,COMPLETE +DEFAULT,152,普通,フツウ,Local,慢车,보통,#1F63C6,1,0,0,上り系統,PARTIAL +DEFAULT,153,普通,フツウ,Local,慢车,보통,#1F63C6,2,0,0,下り系統,PARTIAL +DEFAULT,154,快速,カイソク,Rapid,快车,쾌속,#DC143C,0,2,1,自動選択用,COMPLETE +DEFAULT,155,区間快速エアポート,クカンカイソクエアポート,Semi Rapid Airport,区域快车机场号,구간쾌속에어포트,#33ff33,0,5,0,,COMPLETE +DEFAULT,156,快速エアポート,カイソクエアポート,Rapid Airport,快车机场号,쾌속에어포트,#FF6600,0,5,0,,COMPLETE +DEFAULT,157,特別快速エアポート,トクベツカイソクエアポート,Special Rapid Airport,特别快车机场号,특별쾌속에어포트,#FF3300,0,5,0,,COMPLETE +DEFAULT,158,快速サンポート,カイソクサンポート,Rapid Sunport,快车太陽港号,쾌속선포트,#F39800,0,2,0,,PARTIAL +DEFAULT,159,普通(桜島方面),フツウ,Local(For Sakurajima),慢车,보통,#1F63C6,0,1,0,,COMPLETE +DEFAULT,160,快速きたみ,カイソクキタミ,Rapid Kitami,快车北见,쾌속니시기타미,#FF6600,0,2,0,,COMPLETE +DEFAULT,161,特別快速大雪,トクベツカイソクタイセツ,Special Rapid Taisetsu,特别快车大雪,특별쾌속타이세츠,#FF3300,0,2,0,,COMPLETE +DEFAULT,162,エキスポライナー,エキスポライナー,Expo Liner,世博会Liner,박람회 라이너,#0000ff,0,2,0,,COMPLETE +DEFAULT,163,快速,カイソク,Rapid,快车,쾌속,#DC143C,0,5,1,常磐線用,COMPLETE +DEFAULT,164,特別快速,トクベツカイソク,Special Rapid,特别快车,특별쾌속,#DC143C,0,5,0,常磐線用,COMPLETE +DEFAULT,165,通勤快速,ツウキンカイソク,Commuter Rapid,通勤快车,통근쾌속,#DC143C,0,6,0,TX用,COMPLETE +DEFAULT,166,快速,カイソク,Rapid,快车,쾌속,#DC143C,0,5,0,TX用,COMPLETE +DEFAULT,200,踊り子(池袋〜伊豆急下田),オドリコ,Odoriko(Ikebukuro to Izukyū-shimoda),踊子,무희,#035D67,0,4,0,,COMPLETE +DEFAULT,201,踊り子(東京〜伊豆急下田),オドリコ,Odoriko(Tokyo to Izukyū-shimoda),踊子,무희,#035D67,0,4,0,,COMPLETE +DEFAULT,202,踊り子(池袋〜修善寺),オドリコ,Odoriko(Ikebukuro to Shuzenji),踊子,무희,#035D67,0,4,0,,COMPLETE +DEFAULT,203,踊り子(東京〜修善寺),オドリコ,Odoriko(Tokyo to Shuzenji),踊子,무희,#035D67,0,4,0,,COMPLETE +DEFAULT,204,ひたち,ヒタチ,Hitachi,常陆,히타치,#035D67,0,4,0,,COMPLETE +DEFAULT,205,ときわ,トキワ,Tokiwa,常轮,토키와,#035D67,0,4,0,,COMPLETE +DEFAULT,206,北斗,ホクト,Hokuto,北斗,북두,#0072BC,0,4,0,,COMPLETE +DEFAULT,207,すずらん,スズラン,Suzuran,铃兰,은방울꽃,#0072BC,0,4,0,,COMPLETE +DEFAULT,208,ソニック,ソニック,Sonic,索尼克,소닉,#0095D9,0,4,0,,COMPLETE +DEFAULT,209,かいじ,カイジ,Kaiji,甲斐路,가이지,#0074BE,0,4,0,,COMPLETE +DEFAULT,210,あずさ,アズサ,Azusa,梓,아즈사,#0074BE,0,4,0,,COMPLETE +DEFAULT,211,サンライズ瀬戸,サンライズセト,Sunrise Seto,日出濑户,선라이즈 세토,#AA8D01,0,4,0,,COMPLETE +DEFAULT,212,サンライズ出雲,サンライズイズモ,Sunrise Izumo,日出出云,선라이즈 이즈모,#AA8D01,0,4,0,,COMPLETE +DEFAULT,213,サロベツ,サロベツ,Sarobetsu,佐呂別,살로베츠,#2CB431,0,4,0,,COMPLETE +DEFAULT,214,ライラック,ライラック,Lilac,丁香,라일락,#2CB431,0,4,0,,COMPLETE +DEFAULT,215,カムイ,カムイ,Kamui,神威,카무이,#2CB431,0,4,0,,COMPLETE +DEFAULT,216,宗谷,ソウヤ,Sōya,宗谷,소야,#2CB432,1,4,0,上り,COMPLETE +DEFAULT,217,宗谷,ソウヤ,Sōya,宗谷,소야,#2CB432,2,4,0,下り,COMPLETE +DEFAULT,218,オホーツク,オホーツク,Okhotsk,鄂霍次克,오호츠크,#2CB431,0,4,0,,COMPLETE +DEFAULT,219,大雪,タイセツ,Taisetsu,大雪,타이세츠,#2CB431,0,4,0,,COMPLETE +DEFAULT,220,南風,ナンプウ,Nanpū,南风,남풍,#E25885,0,4,0,,COMPLETE +DEFAULT,221,うずしお,ウズシオ,Uzushio,涡潮,우즈시오,#1CADCA,0,4,0,,COMPLETE +DEFAULT,222,こうのとり,コウノトリ,Kounotori,东方白鹳,고노토리,#FFCC00,0,4,0,,COMPLETE +DEFAULT,223,サンダーバード,サンダーバード,Thunderbird,雷鸟,선더버드,#0072BA,0,4,0,,COMPLETE +DEFAULT,224,ひだ(大阪〜富山),ヒダ,Hida(Osaka to Toyama),飞驒,히다,#F77321,0,4,0,,COMPLETE +DEFAULT,225,ひだ(名古屋発着),ヒダ,Hida(Nagoya to Toyama),飞驒,히다,#F77321,0,4,0,,COMPLETE +DEFAULT,226,富士回遊,フジカイユウ,FUJI EXCURSION,富士回游,후지카이유,#7B68EE,0,4,0,中央線-富士急行直通用,COMPLETE +DEFAULT,227,はちおうじ,ハチオウジ,Hachioji,八王子,하치오지,#F15A22,0,4,0,,COMPLETE +DEFAULT,228,おうめ,オウメ,Ome,青梅,오메,#F15A22,0,4,0,,COMPLETE +DEFAULT,229,しなの,シナノ,Shinano,信浓,시나노,#D56A29,0,4,0,,COMPLETE +DEFAULT,230,成田エクスプレス,ナリタエクスプレス,Narita Express,成田特快,나리타 익스프레스,#FF3333,0,4,0,,COMPLETE +DEFAULT,231,リレーかもめ,リレーカモメ,Relay KAMOME,接力海鸥,릴레이 카모메,#E10018,0,4,0,,COMPLETE +DEFAULT,232,あかぎ,アカギ,Akagi,赤城,아카기,#008000,0,4,0,,COMPLETE +DEFAULT,233,草津・四万,クサツ・シマ,Kusatsu/Shima,草津・四万,구사쓰・시마,#008000,0,4,0,,COMPLETE +DEFAULT,234,湘南(新宿発着),ショウナン,Shōnan(for Shinjuku or Odawara),湘南,쇼난,#F68B1E,0,4,0,,COMPLETE +DEFAULT,235,湘南(東京発着),ショウナン,Shōnan(for Tokyo or Odawara),湘南,쇼난,#F68B1E,0,4,0,,COMPLETE +DEFAULT,236,"SLぐんま +みなかみ",SLグンマ ミナカミ,"SL Gunma +Minakami","SL群马 +水上","SL군마 +미나카미",#0D0C09,0,2,0,,COMPLETE +DEFAULT,237,"SLぐんま +よこかわ",SLグンマ ヨコカワ,"SL Gunma +Yokokawa","SL群马 +横川","SL군마 +요코카와",#0D0C09,0,2,0,,COMPLETE +DEFAULT,238,やくも,ヤクモ,Yakumo,八雲,야쿠모,#bb5535,0,4,0,,COMPLETE +DEFAULT,239,スーパーまつかぜ,スーパーマツカゼ,Super Matsukaze,超松風,슈퍼마츠카제,#f8b500,0,4,0,,COMPLETE +DEFAULT,240,スーパーおき,スーパーオキ,Super Oki,超隱岐,슈퍼오키,#f8b500,0,4,0,,COMPLETE +DEFAULT,241,しまんと,シマント,Shimanto,四萬十,시만토,#E25885,0,4,0,,COMPLETE +DEFAULT,242,あしずり,アシズリ,Ashizuri,足折,아시즈리,#E25885,0,4,0,,COMPLETE +DEFAULT,243,しおかぜ,シオカゼ,Shiokaze,海風,바닷바람,#1CADCA,0,4,0,,COMPLETE +DEFAULT,244,いしづち,イシヅチ,Ishizuchi,石鎚,석진,#1CADCA,0,4,0,,COMPLETE +DEFAULT,245,おおぞら,オオゾラ,Ōzora,大空,큰 하늘,#2CB431,0,4,0,,COMPLETE +DEFAULT,246,とかち,トカチ,Tokachi,十勝,도카치,#2CB431,0,4,0,,COMPLETE +DEFAULT,247,きのさき,キノサキ,Kinosaki,城崎,시로사키,#800080,0,4,0,,COMPLETE +DEFAULT,248,はしだて,ハシダテ,Hashidate,橋立,하시다테,#ff0000,0,4,0,,COMPLETE +DEFAULT,249,まいづる,マイヅル,Maizuru,舞鶴,마이즈루,#ff8c00,0,4,0,,COMPLETE +DEFAULT,250,しらさぎ,シラサギ,Shirasagi,白鷺,백로,#f0e68c,0,4,0,,COMPLETE +DEFAULT,251,くろしお,クロシオ,Kuroshio,黑潮,구로시오,#40e0d0,0,4,0,,COMPLETE +DEFAULT,252,はるか,ハルカ,Haruka,遙,하루카,#00008b,0,4,0,,COMPLETE +DEFAULT,253,スーパーはくと,スーパーハクト,Super Hakuto,超級白兔,슈퍼 하쿠토,#0000ff,0,4,0,,COMPLETE +DEFAULT,254,スーパーいなば,スーパーイナバ,Super Inaba,超級因幡,슈퍼 요시만,#7cfc00,0,4,0,,COMPLETE +DEFAULT,255,宇和海,ウワカイ,Uwakai,宇和海,우와해,#00bfff,0,4,0,,COMPLETE +DEFAULT,256,剣山,ツルギサン,Tsurugisan,劍山,검산,#00008b,0,4,0,,COMPLETE +DEFAULT,257,むろと,ムロト,Muroto,室戶,무로토,#00bfff,0,4,0,,COMPLETE +DEFAULT,258,みどり,ミドリ,Midori,綠,미도리의,#008000,0,4,0,,COMPLETE +DEFAULT,259,ハウステンボス,ハウステンボス,Huis Ten Bosch,豪斯登堡,하우스텐보스,#ff8c00,0,4,0,,COMPLETE +DEFAULT,260,かささぎ,カササギ,Kasasagi,喜鵲,가사기,#dc143c,0,4,0,,COMPLETE +DEFAULT,261,きらめき,キラメキ,Kirameki,閃耀,반짝임,#ff0000,0,4,0,,COMPLETE +DEFAULT,262,にちりん,ニチリン,Nichirin,日輪,일륜,#ffa500,0,4,0,,COMPLETE +DEFAULT,263,にちりんシーガイア,ニチリンシーガイア,Nichirin Sea Gaia,日輪喜凱亞,일륜 시가이아,#ffa500,0,4,0,,COMPLETE +DEFAULT,264,ひゅうが,ヒュウガ,Hyuga,日向,휴가,#ff0000,0,4,0,,COMPLETE +DEFAULT,265,きりしま,キリシマ,Kirishima,霧島,기리시마,#006400,0,4,0,,COMPLETE +DEFAULT,266,かいおう,カイオウ,Kaiō,魁皇,카이오,#8b0000,0,4,0,,COMPLETE +DEFAULT,267,ゆふ,ユフ,Yufu,由布,유후,#ffff00,0,4,0,,COMPLETE +DEFAULT,268,ゆふいんの森,ユフインノモリ,Yufuin no Mori,由布院之森,유후인노모리,#228b22,0,4,0,,COMPLETE +DEFAULT,269,有明,アリアケ,Ariake,有明,아리아케,#daa520,0,4,0,,COMPLETE +DEFAULT,270,九州横断特急,キュウシュウオウダントッキュウ,Trans-Kyushu Limited Express,九州橫斷特急,규슈 횡단 특급,#dc143c,0,4,0,,COMPLETE +DEFAULT,271,南紀,ナンキ,Nanki,南紀,난키,#00bfff,0,4,0,,COMPLETE +DEFAULT,272,伊那路,イナジ,Inaji,伊那路,이나로,#228b22,0,4,0,,COMPLETE +DEFAULT,273,東海,トウカイ,Tōkai,東海,도카이,#ff8c00,0,4,0,,COMPLETE +DEFAULT,274,ふじかわ,フジカワ,Fujikawa,富士川,후지카와,#90ee90,0,4,0,,COMPLETE +DEFAULT,275,わかしお,ワカシオ,Wakashio,若潮,와카시오,#ff0000,0,4,0,,COMPLETE +DEFAULT,276,新宿わかしお,シンジュクワカシオ,Shinjuku Wakashio,新宿若潮,신주쿠와카시오의,#ff0000,0,4,0,,COMPLETE +DEFAULT,277,さざなみ,サザナミ,Sazanami,细波,사자나미,#00bfff,0,4,0,,COMPLETE +DEFAULT,278,新宿さざなみ,シンジュクサザナミ,Shinjuku Sazanami,新宿细波,신주쿠사자나미,#00bfff,0,4,0,,COMPLETE +DEFAULT,279,しおさい,シオサイ,Shiosai,潮骚,시오사이,#ffff00,0,4,0,,COMPLETE +DEFAULT,280,あやめ,アヤメ,Ayame,菖蒲,아야메,#ffd700,0,4,0,,COMPLETE +DEFAULT,281,つがる,ツガル,Tsugaru,津輕,쓰가루,#ff0000,0,4,0,,COMPLETE +DEFAULT,282,いなほ,イナホ,Inaho,稻穗,이나호,#ffa500,0,4,0,,COMPLETE +DEFAULT,283,北越,ホクエツ,Hokuetsu,北越,호쿠코시,#00ffff,0,4,0,,COMPLETE +DEFAULT,284,しらゆき,シラユキ,Shirayuki,白雪,백설,#800080,0,4,0,,COMPLETE +DEFAULT,285,ダイナスター,ダイナスター,Dinostar,恐龍星,다이노스타,#191970,0,4,0,,COMPLETE +DEFAULT,286,能登かがり火,ノトカガリビ,Noto Kagaribi,能登篝火,노토 카오리 불,#dc143c,0,4,0,,COMPLETE +DEFAULT,287,サフィール踊り子,サフィールオドリコ,Saphir Odoriko,蓝宝石踊子,사필 무희,#035D67,0,4,0,,COMPLETE +DEFAULT,288,はまかぜ,ハマカゼ,Hamakaze,濱風,하마카제,#b22222,0,4,0,,COMPLETE +DEFAULT,289,らくラクはりま,ラクラクハリマ,Rakuraku Harima,简单播磨,라쿠 라쿠 하리마,#00bfff,0,4,0,,COMPLETE +DEFAULT,290,らくラクびわこ,ラクラクビワコ,Rakuraku Biwako,简单琵琶湖,라쿠 라쿠 비와코,#0000ff,0,4,0,,COMPLETE +DEFAULT,291,らくラクやまと,ラクラクヤマト,Rakuraku Yamato,简单大和,라쿠 라쿠 야마토,#90ee90,0,4,0,,COMPLETE +DEFAULT,292,まほろば,マホロバ,Mahoroba,真秀场,마호로바,#008000,0,4,0,,COMPLETE +DEFAULT,293,信州,シンシュウ,Shinshu,信州,신슈,#800080,0,4,0,,COMPLETE +DEFAULT,294,ニセコ,ニセコ,Niseko,二世谷,니세코,#0098E1,0,4,0,,COMPLETE +DEFAULT,295,フラノラベンダーエクスプレス,フラノラベンダーエクスプレス,Furano Lavender Express,富良野薰衣草特快,푸라노 라벤더 익스프레스,#da70d6,0,4,0,,COMPLETE +DEFAULT,296,鎌倉,カマクラ,Kamakura,镰仓,가마쿠라,#00008b,0,4,0,,COMPLETE +DEFAULT,297,いにしへ,イニシヘ,Inishihe,在过去,어서,#8b0000,0,4,0,,COMPLETE +DEFAULT,300,普通,フツウ,Local,慢车,보통,#1F63C6,0,0,0,優先度0,PARTIAL +DEFAULT,301,各駅停車,カクエキテイシャ,Local,每站停车,각역정차,#1F63C6,0,0,0,優先度0,PARTIAL +DEFAULT,302,快速,カイソク,Rapid,快车,쾌속,#DC143C,0,2,0,廃止済み 102に移行,NOT +DEFAULT,303,区間急行,クカンキュウコウ,Semi Express,区域特快,구간급행,#D8CA00,0,3,0,,PARTIAL +DEFAULT,304,急行,キュウコウ,Express,特快,급행,#DC143C,0,3,0,,PARTIAL +DEFAULT,306,特急,トッキュウ,Limited Express,特快,특급,#DC143C,0,4,0,,COMPLETE +DEFAULT,307,エアポート快特,エアポートカイトク,Airport Limited Express,机场特快,공항쾌특,#FA9715,0,3,0,,COMPLETE +DEFAULT,308,快特(泉岳寺〜三崎口),カイトク,Limited Express(Sengakuji to Misakiguchi),特快,쾌특,#379412,0,3,0,,COMPLETE +DEFAULT,309,快特(泉岳寺〜羽田空港),カイトク,Limited Express(Sengakuji to Haneda Airport),特快,쾌특,#379412,0,3,0,,COMPLETE +DEFAULT,310,急行(泉岳寺〜羽田空港),キュウコウ,Express(Haneda Airport to Sengakuji),特快,급행,#0D83C3,0,3,0,,COMPLETE +DEFAULT,311,急行(逗子・葉山〜羽田空港),キュウコウ,Express(Haneda Airport to Zushi・Hayama),特快,급행,#0D83C3,0,3,0,,COMPLETE +DEFAULT,312,特急(泉岳寺〜三崎口),トッキュウ,Limited Express(Sengakuji to Misakiguchi),特快,특급,#EA0104,0,3,0,,COMPLETE +DEFAULT,313,特急(泉岳寺〜浦賀),トッキュウ,Limited Express(Sengakuji to Uraga),特快,특급,#EA0104,0,3,0,,PARTIAL +DEFAULT,314,通勤急行,ツウキンキュウコウ,Commuter Express,通勤快车,통근급행,#EEAA66,0,3,0,,PARTIAL +DEFAULT,315,準急,ジュンキュウ,Semi Express,准急,준급,#2EAB8D,0,3,0,,PARTIAL +DEFAULT,316,S-TRAIN(平日運行),エストレイン,S-TRAIN(Weekday),S-TRAIN,S-TRAIN,#8EC21F,0,2,0,,COMPLETE +DEFAULT,317,通勤特急,ツウキントッキュウ,Commuter Express,通勤特快,통근특급,#DC143C,0,4,0,,PARTIAL +DEFAULT,318,区間準急,クカンジュンキュウ,Section Semi Express,区间准急,구간준급,#00FF00,0,3,0,,PARTIAL +DEFAULT,319,区間急行,クカンキュウコウ,Section Express,区间快速,구간급행,#FF99FF,0,3,0,,PARTIAL +DEFAULT,320,空港快速,クウコウカイソク,Haneda Express,机场快速,공항쾌속,#DC143C,0,2,0,,COMPLETE +DEFAULT,321,区間快速,クカンカイソク,Rapid,区间快速,구간쾌속,#FFAE00,0,2,0,,COMPLETE +DEFAULT,322,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#F7931D,0,3,0,(小田原〜新宿),COMPLETE +DEFAULT,323,通勤準急,ツウキンジュンキュウ,Commuter Semi Express,通勤准急,통근준급,#00B66B,0,3,0,,COMPLETE +DEFAULT,324,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#F7931D,0,3,0,(唐木田〜新宿),COMPLETE +DEFAULT,325,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#F7931D,0,3,0,(片瀬江ノ島〜新宿),COMPLETE +DEFAULT,326,急行,キュウコウ,Express,特快,급행,#DC143C,0,3,0,(小田原〜新宿),COMPLETE +DEFAULT,327,急行,キュウコウ,Express,特快,급행,#DC143C,0,3,0,(唐木田〜新宿),COMPLETE +DEFAULT,328,急行,キュウコウ,Express,特快,급행,#DC143C,0,3,0,(片瀬江ノ島〜新宿),COMPLETE +DEFAULT,330,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#F7931D,0,3,0,小田急用,COMPLETE +DEFAULT,331,快速特急,カイソクトッキュウ,Limited Express,快速特快,쾌속특쾌,#049C5E,0,4,0,,COMPLETE +DEFAULT,332,アクセス特急,アクセストッキュウ,Access Express,访问特快,액세스 특급,#ED7D00,0,4,1,,PARTIAL +DEFAULT,333,準急,ジュンキュウ,Semi-Express,准急,준급,#2A9B50,0,3,0,堺筋準急,PARTIAL +DEFAULT,334,直通特急,チョクツウトッキュウ,Limited Express,直通特急,직통특급,#DD2E1E,0,4,0,山陽電車,COMPLETE +DEFAULT,335,区間快速,クカンカイソク,Semi Rapid,区间快速,구간쾌속,#000084,0,5,0,TX用,COMPLETE +DEFAULT,336,通勤快速,ツウキンカイソク,Commuter Rapid,通勤快车,통근쾌속,#FFA500,0,6,0,廃止済み 104に移行,NOT +DEFAULT,337,準特急,ジュントッキュウ,Semi-Limited Express,准特急,준특급,#FF6E00,0,4,0,,COMPLETE +DEFAULT,338,区間急行,クカンキュウコウ,Sub Express,区间快速,구간급행,#009A41,0,3,0,南海電車用,COMPLETE +DEFAULT,339,S-TRAIN(土休日運行),エストレイン,S-TRAIN(Holiday),S-TRAIN,S-TRAIN,#8EC21F,0,2,0,,COMPLETE +DEFAULT,340,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#C05EC4,0,3,0,西武用,COMPLETE +DEFAULT,341,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#004098,0,3,0,東武用,COMPLETE +DEFAULT,342,快速特急,カイソクトッキュウ,Rapid Limited Express,快速特快,쾌속특급,#C51C40,0,4,0,名鉄用,COMPLETE +DEFAULT,343,特急,トッキュウ,Limited Express,特快,특급,#E03837,0,4,0,名鉄用,COMPLETE +DEFAULT,344,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#034F98,0,3,0,名鉄用,COMPLETE +DEFAULT,345,急行,キュウコウ,Express,特快,급행,#00BEFE,0,3,0,名鉄用,COMPLETE +DEFAULT,346,準急,ジュンキュウ,Semi Express,准急,준급,#009945,0,3,0,名鉄用,COMPLETE +DEFAULT,347,普通,フツウ,Local,慢车,보통,#333333,0,0,0,名鉄用,COMPLETE +DEFAULT,348,空港急行,クウコウキュウコウ,Airport Express,机场快速,공항급행,#FF7F27,0,3,0,南海電車用,COMPLETE +DEFAULT,349,区間特急,クカントッキュウ,Limited Express,直通特急,구간특급,#A349A4,0,4,0,阪神電車,COMPLETE +DEFAULT,350,S特急,エストッキュウ,Limited Express,S特急,S특급,#22B14C,0,4,0,山陽電車,COMPLETE +DEFAULT,351,快速急行(新松田より急行),カイソクキュウコウ,Rapid Express(Express from Shin-Matsuda),快速急行,쾌속급행,#F7931D,0,3,0,,COMPLETE +DEFAULT,352,急行(新松田より各駅停車),キュウコウ,Express(Local from Shin-Matsuda),特快,급행,#DC143C,0,3,0,,COMPLETE +DEFAULT,353,各駅停車(新松田より急行),カクエキテイシャ,Local(Express from Shin-Matsuda),每站停车,각역정차,#1F63C6,0,0,0,,COMPLETE +DEFAULT,354,特急,トッキュウ,Special Express,特快,특급,#DC143C,0,4,0,京王線用,COMPLETE +DEFAULT,355,普通,フツウ,Local,慢车,보통,#000000,0,0,2,京急京成用,COMPLETE +DEFAULT,356,普通(西馬込方面),フツウ,Local(For Nishi-magome),慢车,보통,#000000,0,0,0,都営浅草線用,COMPLETE +DEFAULT,357,普通(押上方面),フツウ,Local(For Oshiage),慢车,보통,#000000,0,0,0,都営浅草線用,COMPLETE +DEFAULT,358,急行,キュウコウ,Express,特快,급행,#0D83C3,0,3,0,都営浅草線用,COMPLETE +DEFAULT,359,快速,カイソク,Rapid,快车,쾌속,#ff69b4,0,2,0,都営浅草線用,COMPLETE +DEFAULT,360,通勤特急,ツウキントッキュウ,Commuter Express,通勤特快,통근특급,#00bfff,0,4,0,都営浅草線用,COMPLETE +DEFAULT,361,特急(泉岳寺方面),トッキュウ,Limited Express(For Sengakuji),特快,특급,#DC143C,0,4,0,都営浅草線用,COMPLETE +DEFAULT,362,特急(押上方面),トッキュウ,Limited Express(For Oshiage),特快,특급,#DC143C,0,4,0,都営浅草線用,COMPLETE +DEFAULT,363,快特(泉岳寺方面),カイトク,Limited Express(For Sengakuji),特快,쾌특,#379412,0,3,0,都営浅草線用,COMPLETE +DEFAULT,364,快速特急(押上方面),カイソクトッキュウ,Limited Express(For Oshiage),快速特快,쾌속특쾌,#049C5E,0,4,0,都営浅草線用,COMPLETE +DEFAULT,365,通勤快急,ツウキンカイキュウ,Commuter Rapid Express,通勤快急,통근쾌급,#C05EC4,0,3,0,,COMPLETE +DEFAULT,366,特快速,トッカイソク,Special Rapid Express,特快车,특쾌속,#DC143C,0,3,0,,COMPLETE +DEFAULT,367,快速(芝山千代田方面),カイソク,Rapid(For Shibayama-Chiyoda),快车,쾌속,#ff69b4,0,2,0,都営浅草線用,COMPLETE +DEFAULT,368,ノンストップ,ノンストップ,Nonstop,马不停蹄,논스톱,#4169e1,0,2,0,,COMPLETE +DEFAULT,369,普通(名古屋港方面),フツウ,Local(For Nagoyako),慢车,보통,#1F63C6,0,1,0,,COMPLETE +DEFAULT,370,通勤準急,ツウキンジュンキュウ,Commuter Semi Express,通勤准急,통근준급,#0072BA,0,3,0,西武線用,COMPLETE +DEFAULT,371,A特急,Aトッキュウ,A Limited Express,A特快,A특급,#DC143C,0,4,0,,COMPLETE +DEFAULT,372,B特急,Bトッキュウ,B Limited Express,B特快,B특급,#DC143C,0,4,0,,COMPLETE +DEFAULT,373,区間準急,クカンジュンキュウ,Sub. Semi-Express,区间准急,구간준급,#00FF00,0,3,0,近鉄奈良線・難波線・大阪線、阪神なんば線・阪神本線用,PARTIAL +DEFAULT,374,区間急行,クカンキュウコウ,Sub. Express,区间快速,구간급행,#F7931D,0,3,0,近鉄用,COMPLETE +DEFAULT,375,急行,キュウコウ,Express,特快,급행,#F7931D,0,3,0,近鉄用,COMPLETE +DEFAULT,376,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#DC143C,0,3,0,近鉄用,COMPLETE +DEFAULT,377,快速急行,カイソクキュウコウ,Rapid Express,快速急行,쾌속급행,#00BFFF,0,3,0,阪神なんば線・阪神本線用,COMPLETE +DEFAULT,378,快速,カイソク,Rapid,快车,쾌속,#0000FF,0,2,0,京王用,PARTIAL +DEFAULT,379,快速,カイソク,Rapid,快车,쾌속,#00BFFF,0,2,0,西武用,PARTIAL +DEFAULT,380,急行,キュウコウ,Express,特快,급행,#F7931D,0,3,0,阪急用,COMPLETE +DEFAULT,381,通勤急行,ツウキンキュウコウ,Commuter Express,通勤快车,통근급행,#FFFF00,0,3,0,西武・阪急用,PARTIAL +DEFAULT,382,急行,キュウコウ,Express,特快,급행,#008000,0,3,0,京王・西鉄用,PARTIAL +DEFAULT,383,区間急行,クカンキュウコウ,Semi Express,区域特快,구간급행,#009A41,0,3,0,京阪用,PARTIAL +DEFAULT,384,準急,ジュンキュウ,Sub Express,准急,준급,#0000FF,0,3,0,京阪用,PARTIAL +DEFAULT,385,準急,ジュンキュウ,Semi Express,准急,준급,#0000FF,0,3,0,南海用,PARTIAL +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,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 +DEFAULT,405,拝島ライナー,ハイジマライナー,Haijima Liner,拜岛Liner,하이지마 라이너,#B4C300,0,2,0,,COMPLETE +DEFAULT,406,TJライナー(下り),TJライナー,TJ Liner(Ikebukuro to Ogawamachi),TJ Liner,TJ Liner,#FF710A,2,2,0,,COMPLETE +DEFAULT,407,TJライナー(上り),TJライナー,TJ Liner(Ogawamachi to Ikebukuro),TJ Liner,TJ Liner,#008CD6,1,2,0,,COMPLETE +DEFAULT,408,各駅停車(北埠頭方面),カクエキテイシャ,Local,每站停车,각역정차,#9686BD,0,1,0,ポートアイランド線用,COMPLETE +DEFAULT,409,各駅停車(田園都市線経由),カクエキテイシャ,Local,每站停车,각역정차,#1F63C7,0,0,0,大井町線用,COMPLETE +DEFAULT,410,泉北ライナー,センボクライナー,Semboku Liner,泉北Liner,센보쿠라이너,#E6B422,0,2,0,,COMPLETE +DEFAULT,411,各駅停車(北綾瀬支線),カクエキテイシャ,Local,每站停车,각역정차,#009944,0,1,0,北綾瀬支線,COMPLETE +DEFAULT,412,ライナー,ライナー,Liner,Liner,정기선,#DC143C,0,2,0,,COMPLETE +DEFAULT,500,りょうもう(浅草〜伊勢崎),リョウモウ,Ryomo(Asakusa to Isesaki),Ryomo,료이제,#FF0000,0,4,0,,COMPLETE +DEFAULT,501,りょうもう(浅草〜葛生),リョウモウ,Ryomo(Asakusa to Kuzū),Ryomo,료이제,#FF0000,0,4,0,,COMPLETE +DEFAULT,502,りょうもう(浅草〜赤城),リョウモウ,Ryomo(Asakusa to Akagi),Ryomo,료이제,#FF0000,0,4,0,,COMPLETE +DEFAULT,503,スカイライナー,スカイライナー,Skyliner,Skyliner,스카이라이너,#0A3788,0,4,0,,COMPLETE +DEFAULT,504,小江戸号,コエドゴウ,Koedo,小江户,고에도,#E73042,0,4,0,,COMPLETE +DEFAULT,505,川越特急,カワゴエトッキュウ,Kawagoe Limited Express,川越特快,가와고에 특급,#E73799,0,4,0,,COMPLETE +DEFAULT,506,サザン,サザン,Southern,南方,남부,#3366CC,0,4,0,,COMPLETE +DEFAULT,507,ラピートα,ラピートアルファ,rapi:tα,rapi:tα,라피트α,#0065AF,0,4,0,,COMPLETE +DEFAULT,508,ラピートβ,ラピートベータ,rapi:tβ,rapi:tβ,라피트β,#0065AF,0,4,0,,COMPLETE +DEFAULT,509,ちちぶ,チチブ,Chichibu,秩父,지치부,#FF6600,0,4,0,,COMPLETE +DEFAULT,510,Mt.TAKAO,マウントタカオ,Mt.TAKAO,Mt.TAKAO,Mt.TAKAO,#57A100,0,4,0,,COMPLETE +DEFAULT,511,ミュースカイ,ミュースカイ,μ-SKY,μ-SKY,μ-SKY,#FAA902,0,4,0,,COMPLETE +DEFAULT,512,ひのとり,ヒノトリ,HINOTORI,HINOTORI,HINOTORI,#AD2320,0,4,0,,COMPLETE +DEFAULT,513,こうや,コウヤ,KŌYA,高野,코야,#009A41,0,4,0,,COMPLETE +DEFAULT,514,りんかん,リンカン,RINKAN,林间,린칸,#009A42,0,4,0,,COMPLETE +DEFAULT,515,はしだて,ハシダテ,Hashidate,桥立,하시다테,#E80000,0,4,0,,COMPLETE +DEFAULT,516,スーパーはこね,スーパーハコネ,Super Hakone,超级箱根,슈퍼 하코네,#2288CC,0,4,0,,COMPLETE +DEFAULT,517,はこね,ハコネ,Hakone,箱根,하코네,#2288CC,0,4,0,,COMPLETE +DEFAULT,518,メトロはこね,メトロハコネ,Metro Hakone,地下铁箱根,메트로 하코네,#2288CC,0,4,0,,COMPLETE +DEFAULT,519,THライナー,THライナー,TH Liner,TH Liner,TH Liner,#B50033,0,2,0,,COMPLETE +DEFAULT,520,けごん・きぬ,ケゴン・キヌ,Kegon/Kinu,华严・绢,케곤・키누,#00458F,0,4,0,,COMPLETE +DEFAULT,521,きぬがわ,キヌガワ,Kinugawa,鬼怒川,기누가와,#378640,0,4,0,,COMPLETE +DEFAULT,522,会津,アイヅ,Aizu,会津,아이즈,#009F49,0,4,0,,COMPLETE +DEFAULT,523,スペーシアX(7号・8号),スペーシアX(7ゴウ・8ゴウ),SPACIA X(No.7/No.8),SPACIA X(7号/8号),SPACIA X(7호/8호),#221614,0,4,0,,COMPLETE +DEFAULT,524,スペーシアX(1号〜6号),スペーシアX(1ゴウ〜6ゴウ),SPACIA X(No.1 through No.6),SPACIA X(1号~6号),SPACIA X(7호~8호),#221614,0,4,0,,COMPLETE +DEFAULT,525,日光,ニッコウ,Nikkō,日光,햇빛,#378640,0,4,0,,COMPLETE +DEFAULT,526,さがみ,サガミ,Sagami,相模,사가미,#2288CC,0,4,0,,COMPLETE +DEFAULT,527,モーニングウェイ,モーニングウェイ,Morning Way,早晨的方式,모닝웨이,#2288CC,0,4,0,,COMPLETE +DEFAULT,528,ホームウェイ,ホームウェイ,Home way,回家的路,홈웨이,#2288CC,0,4,0,,COMPLETE +DEFAULT,529,メトロモーニングウェイ,メトロモーニングウェイ,Metro Morning Way,地下铁早晨的方式,메트로 모닝웨이,#2288CC,0,4,0,,COMPLETE +DEFAULT,530,メトロホームウェイ,メトロホームウェイ,Metro Home way,地下铁回家的路,메트로 홈웨이,#2288CC,0,4,0,,COMPLETE +DEFAULT,531,えのしま,エノシマ,Enoshima,江之岛,에노시마,#2288CC,0,4,0,,COMPLETE +DEFAULT,532,メトロえのしま,メトロエノシマ,Metro Enoshima,地下铁江之岛,메트로 에노시마,#2288CC,0,4,0,,COMPLETE +DEFAULT,533,ふじさん,フジサン,Mt. Fuji,富士山,후지 씨,#2288CC,0,4,0,,COMPLETE +DEFAULT,534,スカイツリーライナー,スカイツリーライナー,Skytree Liner,天空树衬里,스카이 트리 라이너,#87ceeb,0,4,0,,COMPLETE +DEFAULT,535,むさし,ムサシ,Musashi,武藏,무사시,#FF6600,0,4,0,,COMPLETE +DEFAULT,536,ドーム,ドーム,dome,圆顶,돔,#696969,0,4,0,,COMPLETE +DEFAULT,537,シティライナー,シティライナー,City Liner,City Liner,시티 라이너,#1e90ff,0,4,0,,COMPLETE +DEFAULT,538,モーニングライナー,モーニングライナー,Morning Liner,Morning Liner,모닝 라이너,#9400d3,0,4,0,,COMPLETE +DEFAULT,539,イブニングライナー,イブニングライナー,Evening Liner,Evening Liner,이브닝 라이너,#9400d3,0,4,0,,COMPLETE +DEFAULT,540,臨時ライナー,リンジライナー,Special Liner,临时Liner,임시 라이너,#add8e6,0,4,0,,COMPLETE +DEFAULT,541,GRAN 天空,グランテンクウ,GRAN Tenkū,GRAN 天空,GRAN 텐쿠,#AD7E2A,0,4,0,,COMPLETE diff --git a/data_validator/src/main.rs b/data_validator/src/main.rs index a9bc1b7a..9510049d 100644 --- a/data_validator/src/main.rs +++ b/data_validator/src/main.rs @@ -4,16 +4,43 @@ use std::path::Path; use csv::{ReaderBuilder, StringRecord}; +/// `3!stations.csv` の列インデックス。 +const STATIONS_COL_STATION_CD: usize = 0; +const STATIONS_COL_LINE_CD: usize = 13; +const STATIONS_COL_E_STATUS: usize = 21; +const STATIONS_COL_E_SORT: usize = 22; + +/// 並び順(`ORDER BY e_sort, station_cd`)が崩れると API の経路スライスから +/// 駅が欠落する箇所の期待並び。`(line_cd, 連続して並ぶべき station_cd 列)`。 +/// +/// 都営大江戸線は都庁前が環状部始端(9930100)と放射部接続側(9930101)の +/// 2レコードで表現される「6の字」路線で、放射部側の都庁前が +/// 「…→新宿→都庁前→西新宿五丁目→…」の位置から外れると、新宿⇔放射部を +/// 跨ぐ区間の到着推定から都庁前が丸ごと欠落し、ETAが一駅分短くなる +/// (#1589 で e_sort 重複時の station_cd タイブレークが反転して発生、 +/// #1595 で修正)。この退行を CI で検知する。 +const EXPECTED_CONSECUTIVE_STATION_ORDERS: &[(u32, &[u32])] = &[ + // 都営大江戸線: 環状部始端の都庁前の直後は新宿西口。 + (99301, &[9930100, 9930102]), + // 都営大江戸線: 新宿 → 都庁前(放射部側) → 西新宿五丁目。 + (99301, &[9930128, 9930101, 9930129]), +]; + fn main() -> Result<(), Box> { let mut invalid_station_ids: Vec = Vec::new(); let mut invalid_type_ids: Vec = Vec::new(); let data_path: &Path = Path::new("data"); let mut rdr = ReaderBuilder::new().from_path(data_path.join("3!stations.csv"))?; - let records: Vec = rdr.records().collect::, _>>()?; - let station_ids: HashSet = records + let station_records: Vec = rdr.records().collect::, _>>()?; + let station_ids: HashSet = station_records .iter() - .map(|row| row.get(0).unwrap().parse::().unwrap()) + .map(|row| { + row.get(STATIONS_COL_STATION_CD) + .unwrap() + .parse::() + .unwrap() + }) .collect(); let mut rdr = ReaderBuilder::new().from_path(data_path.join("4!types.csv"))?; @@ -56,10 +83,21 @@ fn main() -> Result<(), Box> { } } - let has_err = !invalid_station_ids.is_empty() || !invalid_type_ids.is_empty(); + let invalid_station_orders = validate_station_orders(&station_records); + for message in &invalid_station_orders { + println!("[INVALID] {message}"); + } + + let has_err = !invalid_station_ids.is_empty() + || !invalid_type_ids.is_empty() + || !invalid_station_orders.is_empty(); if has_err { - let report = build_markdown_report(&invalid_station_ids, &invalid_type_ids); + let report = build_markdown_report( + &invalid_station_ids, + &invalid_type_ids, + &invalid_station_orders, + ); let report_path = std::env::var("VALIDATION_REPORT_PATH").unwrap_or("/tmp/validation_report.md".into()); std::fs::write(&report_path, &report)?; @@ -71,12 +109,69 @@ fn main() -> Result<(), Box> { Ok(()) } -fn build_markdown_report(invalid_station_ids: &[String], invalid_type_ids: &[String]) -> String { +/// `EXPECTED_CONSECUTIVE_STATION_ORDERS` の各エントリについて、対象路線を +/// API と同じ `ORDER BY e_sort, station_cd` で並べたとき期待の駅列が +/// この順で連続して現れることを検証する。 +fn validate_station_orders(station_records: &[StringRecord]) -> Vec { + let mut errors: Vec = Vec::new(); + + for &(line_cd, expected) in EXPECTED_CONSECUTIVE_STATION_ORDERS { + // (e_sort, station_cd) で昇順ソート(SQL の ORDER BY と同じタイブレーク)。 + let mut line_stations: Vec<(u32, u32)> = station_records + .iter() + .filter(|row| { + row.get(STATIONS_COL_LINE_CD) + .and_then(|v| v.parse::().ok()) + == Some(line_cd) + && row.get(STATIONS_COL_E_STATUS) == Some("0") + }) + .filter_map(|row| { + let e_sort = row + .get(STATIONS_COL_E_SORT) + .and_then(|v| v.parse::().ok())?; + let station_cd = row + .get(STATIONS_COL_STATION_CD) + .and_then(|v| v.parse::().ok())?; + Some((e_sort, station_cd)) + }) + .collect(); + line_stations.sort_unstable(); + let ordered: Vec = line_stations.iter().map(|&(_, cd)| cd).collect(); + + let Some(start) = ordered.iter().position(|&cd| cd == expected[0]) else { + errors.push(format!( + "line_cd {line_cd}: station_cd {} が見つかりません", + expected[0] + )); + continue; + }; + let actual = &ordered[start..(start + expected.len()).min(ordered.len())]; + if actual != expected { + errors.push(format!( + "line_cd {line_cd}: e_sort 順で {expected:?} の並びを期待しましたが {actual:?} でした。\ + e_sort の重複や採番ミスで経路の並び順が崩れると、到着推定(ETA)から駅が欠落します" + )); + } + } + + errors +} + +fn build_markdown_report( + invalid_station_ids: &[String], + invalid_type_ids: &[String], + invalid_station_orders: &[String], +) -> String { let mut md = String::new(); md.push_str("\n"); md.push_str("## :x: データ整合性チェックに失敗しました\n\n"); - md.push_str("`5!station_station_types.csv` に存在しない外部キーへの参照が含まれています。\n\n"); + + if !invalid_station_ids.is_empty() || !invalid_type_ids.is_empty() { + md.push_str( + "`5!station_station_types.csv` に存在しない外部キーへの参照が含まれています。\n\n", + ); + } if !invalid_station_ids.is_empty() { md.push_str(&format!( @@ -106,6 +201,20 @@ fn build_markdown_report(invalid_station_ids: &[String], invalid_type_ids: &[Str md.push_str("\n\n\n"); } + if !invalid_station_orders.is_empty() { + md.push_str(&format!( + "### 駅の並び順エラー ({} 件)\n\n", + invalid_station_orders.len() + )); + md.push_str( + "`3!stations.csv` の `e_sort` 順(同値は `station_cd` 順)が期待する駅の並びと一致しません。\n\n", + ); + for message in invalid_station_orders { + md.push_str(&format!("- {}\n", escape_markdown_cell(message))); + } + md.push('\n'); + } + md } diff --git a/docs/architecture.md b/docs/architecture.md index 37b3e62c..8ffdf295 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -1,457 +1,457 @@ -# StationAPI アーキテクチャドキュメント - -> 最終更新: 2026年5月 - -## 目次 - -- [概要](#概要) -- [レイヤー構造](#レイヤー構造) -- [データベース設計](#データベース設計) -- [gRPC/スキーマ設計](#grpcスキーマ設計) -- [命名規則](#命名規則) -- [キャッシュ戦略](#キャッシュ戦略) -- [データフロー](#データフロー) -- [ディレクトリ構造](#ディレクトリ構造) - ---- - -## 概要 - -StationAPI は日本の鉄道駅情報を提供する gRPC API です。**クリーンアーキテクチャ**に基づいた4層構造を採用し、ビジネスロジックと技術的関心事を明確に分離しています。 - -### 技術スタック - -| 項目 | 技術 | -|------|------| -| 言語 | Rust (Edition 2021) | -| ランタイム | tokio | -| データベース | PostgreSQL 15+ | -| ORM | sqlx (コンパイル時クエリ検証) | -| API | gRPC (tonic) | -| シリアライズ | Protocol Buffers | - ---- - -## レイヤー構造 - -StationAPI は4つの層で構成されています。各層は依存性の方向が内側(Domain)に向かうよう設計されています。 - -```txt -┌─────────────────────────────────────────────────────────┐ -│ Presentation 層 │ -│ (gRPC Controller, エラーハンドリング) │ -└─────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────┐ -│ UseCase 層 │ -│ (Interactor, DTO, ビジネスロジック) │ -└─────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────┐ -│ Infrastructure 層 │ -│ (Repository実装, Row構造体, DB接続) │ -└─────────────────────────────────────────────────────────┘ - ↓ -┌─────────────────────────────────────────────────────────┐ -│ Domain 層 │ -│ (Entity, Repository Interface, ビジネスルール) │ -└─────────────────────────────────────────────────────────┘ -``` - -### Domain 層 (`src/domain/`) - -**責務**: コアビジネスロジックとデータモデルの定義 - -| ディレクトリ/ファイル | 内容 | -|---------------------|------| -| `entity/` | ドメインエンティティ(Station, Line, TrainType, Company など) | -| `repository/` | リポジトリインターフェース(`async_trait` を使用) | -| `normalize.rs` | テキスト正規化(ひらがな↔カタカナ、全角↔半角変換) | -| `error.rs` | ドメインエラー型(NotFound, InfrastructureError, Unexpected) | - -**設計原則**: -- 外部依存を持たない純粋な Rust コード -- リポジトリは trait として定義し、実装を Infrastructure 層に委譲 -- 多言語対応(日本語、カタカナ、ローマ字、中国語、韓国語) - -### UseCase 層 (`src/use_case/`) - -**責務**: アプリケーションビジネスロジックとデータ変換 - -| ディレクトリ/ファイル | 内容 | -|---------------------|------| -| `interactor/query.rs` | `QueryInteractor` - 主要なユースケース実装(約950行) | -| `traits/query.rs` | `QueryUseCase` トレイト定義(20以上の非同期メソッド) | -| `dto/` | データ変換オブジェクト(Entity ↔ gRPC メッセージ) | -| `error.rs` | ユースケースエラー型 | - -**重要なメソッド**: - -```rust -// update_station_vec_with_attributes (query.rs:169-265) -// - 駅データにライン、会社、列車種別を付加 -// - N+1問題を回避するバッチクエリ設計 -async fn update_station_vec_with_attributes( - &self, - mut stations: Vec, - line_group_id: Option, -) -> Result, UseCaseError> -``` - -### Infrastructure 層 (`src/infrastructure/`) - -**責務**: データ永続化と外部システム連携 - -| ファイル | 内容 | -|---------|------| -| `station_repository.rs` | `StationRow` + `MyStationRepository` 実装 | -| `line_repository.rs` | `LineRow` + `MyLineRepository` 実装 | -| `train_type_repository.rs` | `TrainTypeRow` + `MyTrainTypeRepository` 実装 | -| `company_repository.rs` | `CompanyRow` + `MyCompanyRepository` 実装 | - -**設計パターン**: -- 各 Repository は `Arc>` をラップ -- `Internal*Repository` 構造体に実際の SQL 実行を委譲 -- `#[derive(sqlx::FromRow)]` による型安全な Row マッピング - -### Presentation 層 (`src/presentation/`) - -**責務**: 外部 API の公開とリクエスト/レスポンスハンドリング - -| ファイル | 内容 | -|---------|------| -| `controller/grpc.rs` | `MyApi` - 14の gRPC エンドポイント実装 | -| `error.rs` | `PresentationalError` と `tonic::Status` への変換 | - ---- - -## データベース設計 - -### テーブル構成 - -すべてのテーブルは `UNLOGGED` として作成されパフォーマンスを優先しています。 - -| テーブル | 主キー | 概要 | -|---------|-------|------| -| `companies` | company_cd | 鉄道会社情報 | -| `lines` | line_cd | 路線情報 | -| `stations` | station_cd | 駅情報 | -| `types` | id | 列車種別 | -| `station_station_types` | id | 駅と列車種別の関連 | -| `line_aliases` | id | 路線エイリアス | -| `connections` | - | 駅間接続 | -| `aliases` | - | 検索用エイリアス | - -### パフォーマンス最適化 - -```sql --- 使用している PostgreSQL 拡張 -CREATE EXTENSION IF NOT EXISTS pg_trgm; -- トライグラム検索 -CREATE EXTENSION IF NOT EXISTS btree_gist; -- GiST インデックス - --- 主要インデックス -CREATE INDEX idx_stations_station_g_cd ON stations(station_g_cd); -CREATE INDEX idx_stations_line_cd ON stations(line_cd); -CREATE INDEX idx_performance_station_name_trgm ON stations - USING gin(station_name gin_trgm_ops); -- あいまい検索用 -``` - -### スキーマ更新時の注意点 - -1. **マイグレーション**: `data/create_table.sql` を更新 -2. **Row 構造体**: 対応する `*Row` 構造体を Infrastructure 層で更新 -3. **Entity**: 必要に応じて Domain 層の Entity を更新 -4. **変換ロジック**: `impl From for Xxx` を更新 -5. **DTO**: gRPC メッセージへの変換を `use_case/dto/` で更新 - -### バス (GTFS) データの統合 - -`stations` / `lines` / `types` / `station_station_types` は鉄道とバスの両方を保持し、`stations.transport_type` / `lines.transport_type` (0: 鉄道, 1: バス) でフィルタリングします。バスデータの取り込みは `src/import.rs` の `integrate_gtfs_to_stations()` が起動時に実行し、ODPT 公開の GTFS を `gtfs_*` テーブルに展開してから既存テーブルへ統合します。既定では安定フィードの Toei Bus のみを使用し、`ENABLE_EXPERIMENTAL_BUS_FEATURE=true` の場合だけ Seibu Bus を含む全GTFSフィードを使用します。Seibu Bus のダウンロードには `.env.local` の `ODPT_ACCESS_TOKEN` を使用します。 - -| 鉄道側の概念 | バス側の対応 | -|---|---| -| `companies` | GTFS フィードごとに会社を決定。Toei Bus は東京都交通局 (`company_cd=119`)、Seibu Bus は西武バス (`company_cd=253`) | -| `lines` | GTFS `routes` を 1:1 で `lines` に登録。`line_cd` はフィード接頭辞付き `route_id` の fnv1a ハッシュで 100,000,000+ 空間に決定的に生成 | -| `stations` | GTFS `stops` (親停留所) を `(stop_id, route_id)` 単位で `stations` に登録。`station_cd` / `station_g_cd` もフィード接頭辞付き ID から 200,000,000+ 空間にハッシュ生成 | -| `types` | GTFS の `(route_id, shape_id)` バリエーション (フルループ / 短ターン / 支線など) を `kind = TrainTypeKind::BusRoute (= 7)` の TrainType として登録。**停留所集合が完全に同じ shape ペア (上下方向違いのみ) は 1 つの TrainType に畳み、`direction = Both` を設定**。`type_name` は循環なら ` (循環)`、双方向ペアなら ``、片方向なら `<始発停留所> → ` | -| `station_station_types` | 各バリエーションの代表 trip の停留所を `stop_sequence` 順に挿入し、`SERIAL id` がそのまま停留所順序として機能 | - -バス系統の代表シェイプ (canonical_shape) は `COUNT(DISTINCT stop_id) DESC → MAX(shape_dist_traveled) → direction_id` の順で決定します。詳しくは `import.rs:build_stop_route_mapping` のコメント参照。 - ---- - -## gRPC/スキーマ設計 - -### サービスエンドポイント - -`stationapi.proto` で17のエンドポイントを定義: - -| カテゴリ | メソッド | -|---------|---------| -| 駅検索 | `GetStationById`, `GetStationByIdList`, `GetStationsByGroupId`, `GetStationsByCoordinates`, `GetStationsByLineId`, `GetStationsByLineIdList`, `GetStationsByName`, `GetStationsByLineGroupId`, `GetStationsByLineGroupIdList` | -| 路線検索 | `GetLineById`, `GetLinesByIdList`, `GetLinesByName` | -| 経路検索 | `GetRoutes`, `GetRoutesMinimal`, `GetConnectedRoutes` | -| 列車種別 | `GetTrainTypesByStationId`, `GetRouteTypes` | - -### Proto 更新時の注意点 - -1. **後方互換性**: 新フィールドには `optional` キーワードを使用 -2. **ビルド設定**: `build.rs` で `serde` トレイトを追加 -3. **DTO 更新**: `src/use_case/dto/*.rs` のマッピングを更新 -4. **テスト更新**: 新フィールドの統合テストを追加 - -```protobuf -// 後方互換性のある追加例 -message Station { - // 既存フィールド... - optional string new_field = 25; // optional で追加 -} -``` - ---- - -## 命名規則 - -### Row 構造体 vs Entity の区別 - -| 種別 | 場所 | 目的 | 特徴 | -|------|------|------|------| -| **Row** | `infrastructure/*.rs` | DB行の直接マッピング | `#[derive(sqlx::FromRow)]`、DBカラム名と一致 | -| **Entity** | `domain/entity/*.rs` | ドメインモデル | ビジネスロジック、ネスト構造、多言語対応 | - -### Row 構造体 - -```rust -// infrastructure/station_repository.rs -#[derive(sqlx::FromRow, Clone)] -pub struct StationRow { - pub station_cd: i32, // DBカラム名と一致 - pub station_g_cd: i32, - pub station_name: String, - pub line_cd: i32, - // ... 約19フィールド -} -``` - -**特徴**: -- フィールド名は PostgreSQL カラム名と**完全一致**(snake_case) -- データベースネイティブ型を使用: `i32`, `i64`, `f64`, `Option`, `String` -- ロジックを持たない純粋なデータホルダー - -### Entity 構造体 - -```rust -// domain/entity/station.rs -pub struct Station { - pub station_cd: u32, // ビジネス型(符号なし) - pub station_g_cd: u32, - pub station_name: String, - pub line: Option>, // ネスト構造 - pub lines: Vec, // コレクション - pub train_type: Option>, - pub station_numbers: Vec, - // ... 約66フィールド -} -``` - -**特徴**: -- ビジネスセマンティクスを反映した型(例: `StopCondition` 列挙型) -- ネスト構造を含む(`Option>`, `Vec` など) -- 多言語名をサポート: `station_name_r`(ローマ字), `station_name_zh`(中国語), `station_name_ko`(韓国語) -- `Clone`, `Debug`, `Serialize`, `Deserialize`, `PartialEq` を実装 - -### 変換フロー - -```txt -Database (PostgreSQL) - ↓ -Row (sqlx::FromRow) ← 直接マッピング: StationRow - ↓ -Entity (From) ← 型変換、None初期化: Station - ↓ -Enriched Entity ← UseCase層でネストデータ追加 - ↓ -gRPC Message ← Proto変換: proto::Station - ↓ -Network Response -``` - ---- - -## キャッシュ戦略 - -### 現在の設計: 明示的キャッシュなし - -StationAPI は現時点で明示的なインメモリキャッシュを実装していません。その代わり、以下の最適化戦略を採用しています。 - -### バッチクエリによる暗黙的キャッシュ - -`query.rs:169-265` の `update_station_vec_with_attributes` メソッドでは、N+1問題を回避するためにバッチクエリを使用しています。 - -```rust -// 1. すべての station_g_cd を抽出 -let station_group_ids = stations.iter() - .map(|s| s.station_g_cd as u32) - .collect::>(); - -// 2. 一括クエリで関連データを取得(N+1回避) -let stations_by_group_ids = self - .get_stations_by_group_id_vec(&station_group_ids).await?; -let lines = self - .get_lines_by_station_group_id_vec(&station_group_ids).await?; -let train_types = self - .get_train_types_by_station_id_vec(&station_ids, line_group_id).await?; - -// 3. メモリ上で関連付け(O(1)クエリ/エンリッチメント) -``` - -**結果**: エンリッチメント処理あたり**O(1)クエリ**(N駅に対してN回のクエリではない) - -### HashSet による重複排除 - -`query.rs:223` 付近でインメモリ重複排除を実施: - -```rust -let mut seen_line_cds = std::collections::HashSet::new(); -let lines: Vec = lines - .iter() - .filter(|&l| { - l.station_g_cd.unwrap_or(0) == station.station_g_cd - && seen_line_cds.insert(l.line_cd) // HashSetで重複防止 - }) - .cloned() - .collect(); -``` - -### キャッシュを実装しない理由 - -1. **データ規模**: 日本の鉄道データは比較的小規模(約9,000駅) -2. **更新頻度**: CSV インポートによるデータ更新が前提 -3. **ステートレス設計**: 各リクエストは独立して処理 -4. **PostgreSQL の最適化**: インデックスとクエリプランナーによる効率化 - -### 将来の検討事項 - -大規模化や高頻度アクセスが必要な場合: -- `moka` や `lru` クレートによる有界インメモリキャッシュ -- CSV インポート時のキャッシュ無効化 -- `station_g_cd` 単位のタグベース無効化 - ---- - -## データフロー - -### 典型的なリクエストフロー - -```txt -[Client] - │ - ▼ gRPC Request -┌──────────────────────────────────────────────┐ -│ Presentation 層 (grpc.rs) │ -│ └─ MyApi::get_stations_by_id() │ -└──────────────────────────────────────────────┘ - │ - ▼ QueryUseCase メソッド呼び出し -┌──────────────────────────────────────────────┐ -│ UseCase 層 (query.rs) │ -│ ├─ QueryInteractor::get_station_by_id() │ -│ └─ update_station_vec_with_attributes() │ -│ ├─ 駅グループ一括取得 │ -│ ├─ 路線一括取得 │ -│ ├─ 会社一括取得 │ -│ └─ 列車種別一括取得 │ -└──────────────────────────────────────────────┘ - │ - ▼ Repository メソッド呼び出し -┌──────────────────────────────────────────────┐ -│ Infrastructure 層 (station_repository.rs) │ -│ └─ MyStationRepository::find_by_id() │ -│ └─ SQL クエリ実行 (sqlx) │ -└──────────────────────────────────────────────┘ - │ - ▼ Row → Entity 変換 -┌──────────────────────────────────────────────┐ -│ Domain 層 (entity/station.rs) │ -│ └─ impl From for Station │ -└──────────────────────────────────────────────┘ - │ - ▼ Entity → gRPC Message 変換 -┌──────────────────────────────────────────────┐ -│ UseCase 層 (dto/station.rs) │ -│ └─ impl From for proto::Station │ -└──────────────────────────────────────────────┘ - │ - ▼ gRPC Response -[Client] -``` - -### エラー伝播チェーン - -```txt -DomainError (sqlx エラー等) - ↓ ?演算子 -UseCaseError (ユースケース層) - ↓ From トレイト -PresentationalError (プレゼンテーション層) - ↓ Into トレイト -tonic::Status (gRPC ワイヤーフォーマット) -``` - ---- - -## ディレクトリ構造 - -```txt -stationapi/src/ -├── domain/ # コアビジネスロジック -│ ├── entity/ # ドメインエンティティ -│ │ ├── station.rs # Station (66フィールド) -│ │ ├── line.rs # Line (40フィールド) -│ │ ├── train_type.rs # TrainType -│ │ ├── company.rs # Company -│ │ ├── line_symbol.rs # LineSymbol -│ │ └── station_number.rs # StationNumber -│ ├── repository/ # 抽象インターフェース -│ │ ├── station_repository.rs -│ │ ├── line_repository.rs -│ │ ├── train_type_repository.rs -│ │ └── company_repository.rs -│ ├── normalize.rs # テキスト正規化 -│ └── error.rs # DomainError -│ -├── use_case/ # アプリケーションロジック -│ ├── interactor/ -│ │ └── query.rs # QueryInteractor (約950行) -│ ├── traits/ -│ │ └── query.rs # QueryUseCase トレイト -│ ├── dto/ # データ変換 -│ │ ├── station.rs -│ │ ├── line.rs -│ │ ├── train_type.rs -│ │ └── company.rs -│ └── error.rs # UseCaseError -│ -├── infrastructure/ # データ永続化 -│ ├── station_repository.rs # StationRow + MyStationRepository -│ ├── line_repository.rs # LineRow + MyLineRepository -│ ├── train_type_repository.rs # TrainTypeRow + MyTrainTypeRepository -│ ├── company_repository.rs # CompanyRow + MyCompanyRepository -│ └── error.rs # InfrastructureError -│ -├── presentation/ # 外部API -│ ├── controller/ -│ │ └── grpc.rs # MyApi (14エンドポイント) -│ └── error.rs # PresentationalError -│ -├── lib.rs # モジュール宣言 -└── main.rs # エントリーポイント -``` - ---- - -## 関連ドキュメント - -- [技術負債分析レポート](./technical_debt.md) -- [リポジトリテストガイド](./repository_testing.md) -- [データ貢献ガイドライン](../data/README.md) +# StationAPI アーキテクチャドキュメント + +> 最終更新: 2026年5月 + +## 目次 + +- [概要](#概要) +- [レイヤー構造](#レイヤー構造) +- [データベース設計](#データベース設計) +- [gRPC/スキーマ設計](#grpcスキーマ設計) +- [命名規則](#命名規則) +- [キャッシュ戦略](#キャッシュ戦略) +- [データフロー](#データフロー) +- [ディレクトリ構造](#ディレクトリ構造) + +--- + +## 概要 + +StationAPI は日本の鉄道駅情報を提供する gRPC API です。**クリーンアーキテクチャ**に基づいた4層構造を採用し、ビジネスロジックと技術的関心事を明確に分離しています。 + +### 技術スタック + +| 項目 | 技術 | +|------|------| +| 言語 | Rust (Edition 2021) | +| ランタイム | tokio | +| データベース | PostgreSQL 15+ | +| ORM | sqlx (コンパイル時クエリ検証) | +| API | gRPC (tonic) | +| シリアライズ | Protocol Buffers | + +--- + +## レイヤー構造 + +StationAPI は4つの層で構成されています。各層は依存性の方向が内側(Domain)に向かうよう設計されています。 + +```txt +┌─────────────────────────────────────────────────────────┐ +│ Presentation 層 │ +│ (gRPC Controller, エラーハンドリング) │ +└─────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────┐ +│ UseCase 層 │ +│ (Interactor, DTO, ビジネスロジック) │ +└─────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────┐ +│ Infrastructure 層 │ +│ (Repository実装, Row構造体, DB接続) │ +└─────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────┐ +│ Domain 層 │ +│ (Entity, Repository Interface, ビジネスルール) │ +└─────────────────────────────────────────────────────────┘ +``` + +### Domain 層 (`src/domain/`) + +**責務**: コアビジネスロジックとデータモデルの定義 + +| ディレクトリ/ファイル | 内容 | +|---------------------|------| +| `entity/` | ドメインエンティティ(Station, Line, TrainType, Company など) | +| `repository/` | リポジトリインターフェース(`async_trait` を使用) | +| `normalize.rs` | テキスト正規化(ひらがな↔カタカナ、全角↔半角変換) | +| `error.rs` | ドメインエラー型(NotFound, InfrastructureError, Unexpected) | + +**設計原則**: +- 外部依存を持たない純粋な Rust コード +- リポジトリは trait として定義し、実装を Infrastructure 層に委譲 +- 多言語対応(日本語、カタカナ、ローマ字、中国語、韓国語) + +### UseCase 層 (`src/use_case/`) + +**責務**: アプリケーションビジネスロジックとデータ変換 + +| ディレクトリ/ファイル | 内容 | +|---------------------|------| +| `interactor/query.rs` | `QueryInteractor` - 主要なユースケース実装(約950行) | +| `traits/query.rs` | `QueryUseCase` トレイト定義(20以上の非同期メソッド) | +| `dto/` | データ変換オブジェクト(Entity ↔ gRPC メッセージ) | +| `error.rs` | ユースケースエラー型 | + +**重要なメソッド**: + +```rust +// update_station_vec_with_attributes (query.rs:169-265) +// - 駅データにライン、会社、列車種別を付加 +// - N+1問題を回避するバッチクエリ設計 +async fn update_station_vec_with_attributes( + &self, + mut stations: Vec, + line_group_id: Option, +) -> Result, UseCaseError> +``` + +### Infrastructure 層 (`src/infrastructure/`) + +**責務**: データ永続化と外部システム連携 + +| ファイル | 内容 | +|---------|------| +| `station_repository.rs` | `StationRow` + `MyStationRepository` 実装 | +| `line_repository.rs` | `LineRow` + `MyLineRepository` 実装 | +| `train_type_repository.rs` | `TrainTypeRow` + `MyTrainTypeRepository` 実装 | +| `company_repository.rs` | `CompanyRow` + `MyCompanyRepository` 実装 | + +**設計パターン**: +- 各 Repository は `Arc>` をラップ +- `Internal*Repository` 構造体に実際の SQL 実行を委譲 +- `#[derive(sqlx::FromRow)]` による型安全な Row マッピング + +### Presentation 層 (`src/presentation/`) + +**責務**: 外部 API の公開とリクエスト/レスポンスハンドリング + +| ファイル | 内容 | +|---------|------| +| `controller/grpc.rs` | `MyApi` - 14の gRPC エンドポイント実装 | +| `error.rs` | `PresentationalError` と `tonic::Status` への変換 | + +--- + +## データベース設計 + +### テーブル構成 + +すべてのテーブルは `UNLOGGED` として作成されパフォーマンスを優先しています。 + +| テーブル | 主キー | 概要 | +|---------|-------|------| +| `companies` | company_cd | 鉄道会社情報 | +| `lines` | line_cd | 路線情報 | +| `stations` | station_cd | 駅情報 | +| `types` | id | 列車種別 | +| `station_station_types` | id | 駅と列車種別の関連 | +| `line_aliases` | id | 路線エイリアス | +| `connections` | - | 駅間接続 | +| `aliases` | - | 検索用エイリアス | + +### パフォーマンス最適化 + +```sql +-- 使用している PostgreSQL 拡張 +CREATE EXTENSION IF NOT EXISTS pg_trgm; -- トライグラム検索 +CREATE EXTENSION IF NOT EXISTS btree_gist; -- GiST インデックス + +-- 主要インデックス +CREATE INDEX idx_stations_station_g_cd ON stations(station_g_cd); +CREATE INDEX idx_stations_line_cd ON stations(line_cd); +CREATE INDEX idx_performance_station_name_trgm ON stations + USING gin(station_name gin_trgm_ops); -- あいまい検索用 +``` + +### スキーマ更新時の注意点 + +1. **マイグレーション**: `data/create_table.sql` を更新 +2. **Row 構造体**: 対応する `*Row` 構造体を Infrastructure 層で更新 +3. **Entity**: 必要に応じて Domain 層の Entity を更新 +4. **変換ロジック**: `impl From for Xxx` を更新 +5. **DTO**: gRPC メッセージへの変換を `use_case/dto/` で更新 + +### バス (GTFS) データの統合 + +`stations` / `lines` / `types` / `station_station_types` は鉄道とバスの両方を保持し、`stations.transport_type` / `lines.transport_type` (0: 鉄道, 1: バス) でフィルタリングします。バスデータの取り込みは `src/import.rs` の `integrate_gtfs_to_stations()` が起動時に実行し、ODPT 公開の GTFS を `gtfs_*` テーブルに展開してから既存テーブルへ統合します。Seibu Bus を含む設定済みの全GTFSフィードを使用します。Seibu Bus のダウンロードには `.env.local` の `ODPT_ACCESS_TOKEN` を使用します。 + +| 鉄道側の概念 | バス側の対応 | +|---|---| +| `companies` | GTFS フィードごとに会社を決定。Toei Bus は東京都交通局 (`company_cd=119`)、Seibu Bus は西武バス (`company_cd=253`) | +| `lines` | GTFS `routes` を 1:1 で `lines` に登録。`line_cd` はフィード接頭辞付き `route_id` の fnv1a ハッシュで 100,000,000+ 空間に決定的に生成 | +| `stations` | GTFS `stops` (親停留所) を `(stop_id, route_id)` 単位で `stations` に登録。`station_cd` / `station_g_cd` もフィード接頭辞付き ID から 200,000,000+ 空間にハッシュ生成 | +| `types` | GTFS の `(route_id, shape_id)` バリエーション (フルループ / 短ターン / 支線など) を `kind = TrainTypeKind::BusRoute (= 7)` の TrainType として登録。**停留所集合が完全に同じ shape ペア (上下方向違いのみ) は 1 つの TrainType に畳み、`direction = Both` を設定**。`type_name` は循環なら ` (循環)`、双方向ペアなら ``、片方向なら `<始発停留所> → ` | +| `station_station_types` | 各バリエーションの代表 trip の停留所を `stop_sequence` 順に挿入し、`SERIAL id` がそのまま停留所順序として機能 | + +バス系統の代表シェイプ (canonical_shape) は `COUNT(DISTINCT stop_id) DESC → MAX(shape_dist_traveled) → direction_id` の順で決定します。詳しくは `import.rs:build_stop_route_mapping` のコメント参照。 + +--- + +## gRPC/スキーマ設計 + +### サービスエンドポイント + +`stationapi.proto` で17のエンドポイントを定義: + +| カテゴリ | メソッド | +|---------|---------| +| 駅検索 | `GetStationById`, `GetStationByIdList`, `GetStationsByGroupId`, `GetStationsByCoordinates`, `GetStationsByLineId`, `GetStationsByLineIdList`, `GetStationsByName`, `GetStationsByLineGroupId`, `GetStationsByLineGroupIdList` | +| 路線検索 | `GetLineById`, `GetLinesByIdList`, `GetLinesByName` | +| 経路検索 | `GetRoutes`, `GetRoutesMinimal`, `GetConnectedRoutes` | +| 列車種別 | `GetTrainTypesByStationId`, `GetRouteTypes` | + +### Proto 更新時の注意点 + +1. **後方互換性**: 新フィールドには `optional` キーワードを使用 +2. **ビルド設定**: `build.rs` で `serde` トレイトを追加 +3. **DTO 更新**: `src/use_case/dto/*.rs` のマッピングを更新 +4. **テスト更新**: 新フィールドの統合テストを追加 + +```protobuf +// 後方互換性のある追加例 +message Station { + // 既存フィールド... + optional string new_field = 25; // optional で追加 +} +``` + +--- + +## 命名規則 + +### Row 構造体 vs Entity の区別 + +| 種別 | 場所 | 目的 | 特徴 | +|------|------|------|------| +| **Row** | `infrastructure/*.rs` | DB行の直接マッピング | `#[derive(sqlx::FromRow)]`、DBカラム名と一致 | +| **Entity** | `domain/entity/*.rs` | ドメインモデル | ビジネスロジック、ネスト構造、多言語対応 | + +### Row 構造体 + +```rust +// infrastructure/station_repository.rs +#[derive(sqlx::FromRow, Clone)] +pub struct StationRow { + pub station_cd: i32, // DBカラム名と一致 + pub station_g_cd: i32, + pub station_name: String, + pub line_cd: i32, + // ... 約19フィールド +} +``` + +**特徴**: +- フィールド名は PostgreSQL カラム名と**完全一致**(snake_case) +- データベースネイティブ型を使用: `i32`, `i64`, `f64`, `Option`, `String` +- ロジックを持たない純粋なデータホルダー + +### Entity 構造体 + +```rust +// domain/entity/station.rs +pub struct Station { + pub station_cd: u32, // ビジネス型(符号なし) + pub station_g_cd: u32, + pub station_name: String, + pub line: Option>, // ネスト構造 + pub lines: Vec, // コレクション + pub train_type: Option>, + pub station_numbers: Vec, + // ... 約66フィールド +} +``` + +**特徴**: +- ビジネスセマンティクスを反映した型(例: `StopCondition` 列挙型) +- ネスト構造を含む(`Option>`, `Vec` など) +- 多言語名をサポート: `station_name_r`(ローマ字), `station_name_zh`(中国語), `station_name_ko`(韓国語) +- `Clone`, `Debug`, `Serialize`, `Deserialize`, `PartialEq` を実装 + +### 変換フロー + +```txt +Database (PostgreSQL) + ↓ +Row (sqlx::FromRow) ← 直接マッピング: StationRow + ↓ +Entity (From) ← 型変換、None初期化: Station + ↓ +Enriched Entity ← UseCase層でネストデータ追加 + ↓ +gRPC Message ← Proto変換: proto::Station + ↓ +Network Response +``` + +--- + +## キャッシュ戦略 + +### 現在の設計: 明示的キャッシュなし + +StationAPI は現時点で明示的なインメモリキャッシュを実装していません。その代わり、以下の最適化戦略を採用しています。 + +### バッチクエリによる暗黙的キャッシュ + +`query.rs:169-265` の `update_station_vec_with_attributes` メソッドでは、N+1問題を回避するためにバッチクエリを使用しています。 + +```rust +// 1. すべての station_g_cd を抽出 +let station_group_ids = stations.iter() + .map(|s| s.station_g_cd as u32) + .collect::>(); + +// 2. 一括クエリで関連データを取得(N+1回避) +let stations_by_group_ids = self + .get_stations_by_group_id_vec(&station_group_ids).await?; +let lines = self + .get_lines_by_station_group_id_vec(&station_group_ids).await?; +let train_types = self + .get_train_types_by_station_id_vec(&station_ids, line_group_id).await?; + +// 3. メモリ上で関連付け(O(1)クエリ/エンリッチメント) +``` + +**結果**: エンリッチメント処理あたり**O(1)クエリ**(N駅に対してN回のクエリではない) + +### HashSet による重複排除 + +`query.rs:223` 付近でインメモリ重複排除を実施: + +```rust +let mut seen_line_cds = std::collections::HashSet::new(); +let lines: Vec = lines + .iter() + .filter(|&l| { + l.station_g_cd.unwrap_or(0) == station.station_g_cd + && seen_line_cds.insert(l.line_cd) // HashSetで重複防止 + }) + .cloned() + .collect(); +``` + +### キャッシュを実装しない理由 + +1. **データ規模**: 日本の鉄道データは比較的小規模(約9,000駅) +2. **更新頻度**: CSV インポートによるデータ更新が前提 +3. **ステートレス設計**: 各リクエストは独立して処理 +4. **PostgreSQL の最適化**: インデックスとクエリプランナーによる効率化 + +### 将来の検討事項 + +大規模化や高頻度アクセスが必要な場合: +- `moka` や `lru` クレートによる有界インメモリキャッシュ +- CSV インポート時のキャッシュ無効化 +- `station_g_cd` 単位のタグベース無効化 + +--- + +## データフロー + +### 典型的なリクエストフロー + +```txt +[Client] + │ + ▼ gRPC Request +┌──────────────────────────────────────────────┐ +│ Presentation 層 (grpc.rs) │ +│ └─ MyApi::get_stations_by_id() │ +└──────────────────────────────────────────────┘ + │ + ▼ QueryUseCase メソッド呼び出し +┌──────────────────────────────────────────────┐ +│ UseCase 層 (query.rs) │ +│ ├─ QueryInteractor::get_station_by_id() │ +│ └─ update_station_vec_with_attributes() │ +│ ├─ 駅グループ一括取得 │ +│ ├─ 路線一括取得 │ +│ ├─ 会社一括取得 │ +│ └─ 列車種別一括取得 │ +└──────────────────────────────────────────────┘ + │ + ▼ Repository メソッド呼び出し +┌──────────────────────────────────────────────┐ +│ Infrastructure 層 (station_repository.rs) │ +│ └─ MyStationRepository::find_by_id() │ +│ └─ SQL クエリ実行 (sqlx) │ +└──────────────────────────────────────────────┘ + │ + ▼ Row → Entity 変換 +┌──────────────────────────────────────────────┐ +│ Domain 層 (entity/station.rs) │ +│ └─ impl From for Station │ +└──────────────────────────────────────────────┘ + │ + ▼ Entity → gRPC Message 変換 +┌──────────────────────────────────────────────┐ +│ UseCase 層 (dto/station.rs) │ +│ └─ impl From for proto::Station │ +└──────────────────────────────────────────────┘ + │ + ▼ gRPC Response +[Client] +``` + +### エラー伝播チェーン + +```txt +DomainError (sqlx エラー等) + ↓ ?演算子 +UseCaseError (ユースケース層) + ↓ From トレイト +PresentationalError (プレゼンテーション層) + ↓ Into トレイト +tonic::Status (gRPC ワイヤーフォーマット) +``` + +--- + +## ディレクトリ構造 + +```txt +stationapi/src/ +├── domain/ # コアビジネスロジック +│ ├── entity/ # ドメインエンティティ +│ │ ├── station.rs # Station (66フィールド) +│ │ ├── line.rs # Line (40フィールド) +│ │ ├── train_type.rs # TrainType +│ │ ├── company.rs # Company +│ │ ├── line_symbol.rs # LineSymbol +│ │ └── station_number.rs # StationNumber +│ ├── repository/ # 抽象インターフェース +│ │ ├── station_repository.rs +│ │ ├── line_repository.rs +│ │ ├── train_type_repository.rs +│ │ └── company_repository.rs +│ ├── normalize.rs # テキスト正規化 +│ └── error.rs # DomainError +│ +├── use_case/ # アプリケーションロジック +│ ├── interactor/ +│ │ └── query.rs # QueryInteractor (約950行) +│ ├── traits/ +│ │ └── query.rs # QueryUseCase トレイト +│ ├── dto/ # データ変換 +│ │ ├── station.rs +│ │ ├── line.rs +│ │ ├── train_type.rs +│ │ └── company.rs +│ └── error.rs # UseCaseError +│ +├── infrastructure/ # データ永続化 +│ ├── station_repository.rs # StationRow + MyStationRepository +│ ├── line_repository.rs # LineRow + MyLineRepository +│ ├── train_type_repository.rs # TrainTypeRow + MyTrainTypeRepository +│ ├── company_repository.rs # CompanyRow + MyCompanyRepository +│ └── error.rs # InfrastructureError +│ +├── presentation/ # 外部API +│ ├── controller/ +│ │ └── grpc.rs # MyApi (14エンドポイント) +│ └── error.rs # PresentationalError +│ +├── lib.rs # モジュール宣言 +└── main.rs # エントリーポイント +``` + +--- + +## 関連ドキュメント + +- [技術負債分析レポート](./technical_debt.md) +- [リポジトリテストガイド](./repository_testing.md) +- [データ貢献ガイドライン](../data/README.md) diff --git a/scripts/README.md b/scripts/README.md index c4e2ed5a..c160efac 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -44,3 +44,60 @@ python3 scripts/compute_average_distance.py --apply 地理データは OpenStreetMap (© OpenStreetMap contributors) を Overpass API 経由で取得しています。 OSM データは [Open Database License (ODbL)](https://www.openstreetmap.org/copyright) の下で 提供されています。算出した距離値を再配布する際は出典表示にご留意ください。 + +## compute_speed_table.py + +公開 GTFS 時刻表から、到着時間推定(`arrival_estimation.rs`)の速度較正テーブル +2 種類を再計算します。運動学モデルを Python で再現し、実ダイヤの所要時間を +再現する実効最高速度を二分探索でフィッティングします。 + +1. **路線 × 列車種別**(`stationapi/src/domain/speed_table.rs`): + 列車全体の所要時間へのフィット。一般則(路線種別の基本速度 × 種別倍率)から + ±10% 以上乖離した路線だけを出力します。 +2. **隣接駅間ペア**(`stationapi/src/domain/segment_speed_table.rs`): + 駅間の純走行時間(次駅の到着時刻があれば「出発→次駅到着」、無ければ + 「出発→次駅出発 − モデル停車時分」)を複数本の平均でデクオンタイズして + フィットし、路線単位の較正値から ±5% 以上乖離したペアだけを出力します。 + 路線内の区間差(都営大江戸線の環状部南側 月島〜赤羽橋の河川横断・急曲線 + 区間が放射部より 2〜3 割遅い、など)を表現するためのもので、各駅停車と + 同速の種別にのみ適用されます。時刻データが無い駅間は路線値のままです。 + +### 使い方 + +```bash +# フィードを取得して較正結果を表示する(ファイルは書き換えない) +python3 scripts/compute_speed_table.py --validate + +# speed_table.rs の自動生成ブロックを書き換える +python3 scripts/compute_speed_table.py --apply +``` + +認証が必要なフィード(公共交通オープンデータセンターの大半)を使うには、 +[developer.odpt.org](https://developer.odpt.org/) で発行した無料のアクセストークンを +環境変数 `ODPT_ACCESS_TOKEN` に設定します。未設定の場合、該当フィードはスキップされます。 +取得した GTFS は `scripts/.gtfs_cache/` にキャッシュされます(Git 管理対象外)。 + +### データソース・ライセンス + +GTFS 時刻表は[公共交通オープンデータセンター](https://ckan.odpt.org/)から取得しています。 + +| フィード | 提供事業者 | ライセンス | トークン | +| ---- | ---- | ---- | ---- | +| 都営地下鉄(浅草・三田・新宿・大江戸、都電荒川線・日暮里舎人ライナー同梱) | 東京都交通局 | [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)(要出典明示) | 不要 | +| 函館市電 | 函館市企業局交通部 | [GTFS-RUL (ODPT)](https://gtfs-jp.org/GTFS-RUL(ODPT).pdf) | 不要 | +| 京都市営地下鉄 | 京都市交通局 | [公共交通オープンデータ基本ライセンス](https://developer.odpt.org/terms)(要出典明示) | 要 | +| 横浜市営地下鉄 | 横浜市交通局 | 同上 | 要 | +| 東京メトロ | 東京地下鉄 | 同上 | 要 | +| つくばエクスプレス | 首都圏新都市鉄道 | 同上 | 要 | +| 多摩都市モノレール | 多摩都市モノレール | 同上 | 要 | +| りんかい線 | 東京臨海高速鉄道 | 同上 | 要 | + +較正値(派生データ)を含むサービスを提供する場合は、リポジトリ直下 README の +「Data Sources」に記載の出典表示をアプリ側のクレジットにも反映してください。 +なお、京王電鉄・相模鉄道・東武鉄道の鉄道 GTFS も公共交通オープンデータセンターに +存在しますが、「公共交通オープンデータチャレンジ限定ライセンス」 +(`api-challenge.odpt.org` 配信)で本番利用できないため、意図的に対象へ含めていません。 + +`--apply` はその実行で較正できた路線のエントリだけを更新し、トークン未設定などで +スキップしたフィード由来の既存エントリは保持します(トークンなし実行で京都・横浜の +エントリが消えることはありません)。 diff --git a/scripts/compute_speed_table.py b/scripts/compute_speed_table.py new file mode 100644 index 00000000..4ae17365 --- /dev/null +++ b/scripts/compute_speed_table.py @@ -0,0 +1,1159 @@ +#!/usr/bin/env python3 +""" +公開 GTFS 時刻表から路線 × 列車種別ごとの実効最高速度を較正し、 +stationapi/src/domain/speed_table.rs の自動生成ブロックを更新するスクリプト。 + +到着時間推定(arrival_estimation.rs)の運動学モデルを Python で忠実に再現し、 +GTFS の実ダイヤ所要時間を再現する実効最高速度 v_max を路線 × 種別ごとに +二分探索でフィッティングする。一般則(路線種別の基本速度 × 種別倍率)から +大きく外れる路線だけをテーブルへ出力する。 + +データソース: 公共交通オープンデータセンター (https://ckan.odpt.org/) ほかの + GTFS フィード。各フィードのライセンスは FEEDS の license を参照。 + 出典明示が必要なもの(公共交通オープンデータ基本ライセンス等)を + 利用する場合はアプリ側のクレジット表記に追加すること。 + +使い方: + # フィードを取得して較正結果を表示する(ファイルは書き換えない) + python3 scripts/compute_speed_table.py --validate + + # speed_table.rs の自動生成ブロックを書き換える + python3 scripts/compute_speed_table.py --apply + +認証が必要なフィード(公共交通オープンデータセンターの大半)を使うには、 +https://developer.odpt.org/ で発行した無料のアクセストークンを環境変数 +ODPT_ACCESS_TOKEN に設定する。未設定の場合、該当フィードはスキップされる。 + +取得した GTFS は scripts/.gtfs_cache/ にキャッシュされ、再実行が速くなる。 +""" +from __future__ import annotations + +import argparse +import csv +import io +import itertools +import math +import os +import re +import statistics +import sys +import unicodedata +import urllib.request +import zipfile +from dataclasses import dataclass + +HERE = os.path.dirname(os.path.abspath(__file__)) +ROOT = os.path.dirname(HERE) +LINES_CSV = os.path.join(ROOT, "data", "2!lines.csv") +STATIONS_CSV = os.path.join(ROOT, "data", "3!stations.csv") +TYPES_CSV = os.path.join(ROOT, "data", "4!types.csv") +SST_CSV = os.path.join(ROOT, "data", "5!station_station_types.csv") +SPEED_TABLE_RS = os.path.join(ROOT, "stationapi", "src", "domain", "speed_table.rs") +CACHE_DIR = os.path.join(HERE, ".gtfs_cache") + +HTTP_TIMEOUT = 120 +USER_AGENT = "StationAPI-speed-table/1.0 (railway data maintenance)" + + +# --------------------------------------------------------------------------- +# フィード定義 +# --------------------------------------------------------------------------- +@dataclass(frozen=True) +class Feed: + key: str # キャッシュファイル名などに使う識別子 + name: str # 表示名 + url: str # GTFS zip の URL({token} がトークンに置換される) + needs_token: bool # 公共交通オープンデータセンターのアクセストークン要否 + license: str # ライセンスメモ(出典明示の要否確認用) + + +FEEDS: list[Feed] = [ + Feed( + key="hakodate_tram", + name="函館市電", + url="https://api-public.odpt.org/api/v4/files/odpt/HakodateCity/Alllines.zip?date=20260615", + needs_token=False, + license="公共交通オープンデータセンター(認証なし公開)", + ), + Feed( + key="toei_train", + name="都営地下鉄", + url="https://api-public.odpt.org/api/v4/files/Toei/data/Toei-Train-GTFS.zip", + needs_token=False, + license="CC BY 4.0(東京都交通局・要出典明示)", + ), + Feed( + key="kyoto_subway", + name="京都市営地下鉄", + url="https://api.odpt.org/api/v4/files/odpt/KyotoMunicipalTransportation/Kyoto_City_Subway_GTFS.zip?date=20260703&acl:consumerKey={token}", + needs_token=True, + license="公共交通オープンデータ基本ライセンス(要出典明示)", + ), + Feed( + key="yokohama_subway", + name="横浜市営地下鉄", + url="https://api.odpt.org/api/v4/files/odpt/YokohamaMunicipal/Train.zip?date=20251226&acl:consumerKey={token}", + needs_token=True, + license="公共交通オープンデータ基本ライセンス(要出典明示)", + ), + Feed( + key="tokyometro_train", + name="東京メトロ", + url="https://api.odpt.org/api/v4/files/TokyoMetro/data/TokyoMetro-Train-GTFS.zip?acl:consumerKey={token}", + needs_token=True, + license="公共交通オープンデータ基本ライセンス(要出典明示)", + ), + Feed( + key="mir_train", + name="つくばエクスプレス", + url="https://api.odpt.org/api/v4/files/MIR/data/MIR-Train-GTFS.zip?acl:consumerKey={token}", + needs_token=True, + license="公共交通オープンデータ基本ライセンス(要出典明示)", + ), + Feed( + key="tamamonorail_train", + name="多摩都市モノレール", + url="https://api.odpt.org/api/v4/files/TamaMonorail/data/TamaMonorail-Train-GTFS.zip?acl:consumerKey={token}", + needs_token=True, + license="公共交通オープンデータ基本ライセンス(要出典明示)", + ), + Feed( + key="twr_train", + name="りんかい線", + url="https://api.odpt.org/api/v4/files/TWR/data/TWR-Train-GTFS.zip?acl:consumerKey={token}", + needs_token=True, + license="公共交通オープンデータ基本ライセンス(要出典明示)", + ), + # 京王・相鉄・東武の鉄道 GTFS も公共交通オープンデータセンターに存在するが、 + # 「公共交通オープンデータチャレンジ限定ライセンス」(api-challenge.odpt.org)で + # 本番利用できないため意図的に含めていない(scripts/README.md 参照)。 +] + +# --------------------------------------------------------------------------- +# arrival_estimation.rs の運動学モデルの再現(定数は Rust 側と一致させること) +# --------------------------------------------------------------------------- +ACCEL = 0.7 +DECEL = 0.9 +DWELL_MIN = 0.6 +RUN_MARGIN = 1.15 +PASS_PENALTY_SEC = 3.0 +DETOUR_MIN = 1.0 +RAIL_DETOUR_MAX = 1.35 + +LT_SHINKANSEN, LT_SUBWAY, LT_TRAM, LT_AGT, LT_CABLE = 1, 3, 4, 5, 0 + +BASE_SPEED = {LT_SHINKANSEN: 250.0, LT_SUBWAY: 75.0, LT_TRAM: 40.0, LT_AGT: 60.0, LT_CABLE: 12.0} +KIND_MULT = {3: 1.15, 4: 1.2, 5: 1.5} +FALLBACK_DETOUR = {LT_SHINKANSEN: 1.15, LT_SUBWAY: 1.20, LT_TRAM: 1.40, LT_AGT: 1.20, LT_CABLE: 1.10} + +KIND_NAMES = { + 0: "Default", 1: "Branch", 2: "Rapid", 3: "Express", + 4: "LimitedExpress", 5: "HighSpeedRapid", 6: "CommuterRapid", +} + +# フィッティング結果が一般則からこの比率以上離れた場合のみテーブルへ出力する。 +EMIT_THRESHOLD = 0.10 +# 較正に必要な最小サンプル(列車)数。 +MIN_TRIPS = 3 +# フィット結果の妥当範囲(km/h)。範囲外は駅マッチング異常とみなして捨てる。 +V_MIN, V_MAX = 15.0, 220.0 + +# --- 駅間別較正(segment_speed_table.rs)のパラメータ --- +# 出力先。 +SEGMENT_TABLE_RS = os.path.join(ROOT, "stationapi", "src", "domain", "segment_speed_table.rs") +# 駅間ペアの較正に必要な最小サンプル数。GTFS の時刻は分単位に丸められているため、 +# 複数本の平均でしか実勢の駅間所要時間(分未満の端数)を推定できない。 +SEG_MIN_SAMPLES = 5 +# 路線単位の較正値からこの比率以上乖離したペアだけを出力する。 +SEG_EMIT_THRESHOLD = 0.05 +# 路線単位較正値に対するフィット結果の妥当範囲(倍率)。範囲外は時刻データ異常 +# (長時間停車の折込みなど)とみなして捨てる。地下鉄の短区間は分単位GTFSから +# 加減速モデルの下限に近い速度が出やすいため、別途絶対上限で救済する。 +SEG_SANITY_BAND = (0.4, 1.6) +SEG_SUBWAY_ABS_MAX_KMH = 110.0 +# 到着時刻ベース(純走行時間)のサンプルがこの本数以上あるペアは、それだけを使う。 +# 出発間隔ベースは分丸めされた停車時分・接続待ちを含み、混ぜると系統誤差になる。 +SEG_ARR_MIN_SAMPLES = 5 +# 出発間隔ベースしか無いペアで上側から除去する割合。接続待ち・時隔調整の +# 折込み(北綾瀬〜綾瀬の direction 転換待ちなど)は分布の上側に偏るため。 +SEG_DEP_TRIM_RATIO = 0.3 +# 駅間所要時間サンプルの採用範囲(分)。 +SEG_TARGET_RANGE = (0.1, 30.0) +# 駅名 + 座標マッチングの許容距離(m)。 +MATCH_RADIUS_M = 500.0 +# 駅名が一致しない場合に座標最近傍で救済する許容距離(m)。改称駅・表記揺れ対策。 +NEAREST_RADIUS_M = 200.0 +# 列車の停車駅のうちマッチ必須の割合。 +MATCH_COVERAGE = 0.9 +# 日中ダイヤとして採用する始発時刻の範囲(時)。 +DAYTIME_HOURS = (9.5, 16.5) + + +def base_speed(line_type: int | None) -> float: + return BASE_SPEED.get(line_type, 80.0) + + +def general_rule_speed(line_type: int | None, kind: int) -> float: + if line_type == LT_SHINKANSEN: + return base_speed(line_type) + return base_speed(line_type) * KIND_MULT.get(kind, 1.0) + + +def haversine(lat1: float, lon1: float, lat2: float, lon2: float) -> float: + r = 6371000.0 + p1, p2 = math.radians(lat1), math.radians(lat2) + dphi = math.radians(lat2 - lat1) + dlmb = math.radians(lon2 - lon1) + a = math.sin(dphi / 2) ** 2 + math.cos(p1) * math.cos(p2) * math.sin(dlmb / 2) ** 2 + return 2 * r * math.asin(math.sqrt(a)) + + +def seg_run_min(dist_m: float, v_kmh: float) -> float: + """停車駅間の走行時間(分)。segment_run_minutes の再現。""" + if dist_m <= 0 or v_kmh <= 0: + return 0.0 + v = v_kmh / 3.6 + d_acc, d_dec = v * v / (2 * ACCEL), v * v / (2 * DECEL) + if dist_m >= d_acc + d_dec: + sec = v / ACCEL + v / DECEL + (dist_m - d_acc - d_dec) / v + else: + vp = math.sqrt(2 * dist_m * ACCEL * DECEL / (ACCEL + DECEL)) + sec = vp / ACCEL + vp / DECEL + return sec * RUN_MARGIN / 60.0 + + +def model_minutes(seq: list[tuple[float, bool]], v_kmh: float) -> float: + """駅列 seq = [(前駅からのみなし走行距離m, 停車するか), ...] の総所要時間(分)。 + + estimate_arrival_minutes の停車間セグメント積み上げを再現する。 + 始発駅は seq[0](距離 0, 停車)。終着駅の到着までを返す(始発の dwell なし)。 + """ + total = 0.0 + seg: list[tuple[float, bool]] = [] + n = len(seq) + for i in range(1, n): + seg.append(seq[i]) + if seq[i][1]: + if len(seg) == 1: + total += seg_run_min(seg[0][0], v_kmh) + else: + v = v_kmh / 3.6 + sec = v / (2 * ACCEL) + v / (2 * DECEL) + for dist_m, stops in seg: + sec += dist_m / v + if not stops: + sec += PASS_PENALTY_SEC + total += sec * RUN_MARGIN / 60.0 + if i != n - 1: + total += DWELL_MIN + seg = [] + return total + + +# --------------------------------------------------------------------------- +# 自リポジトリのデータ読み込み +# --------------------------------------------------------------------------- +def norm_name(s: str) -> str: + """駅名比較用の正規化。全角半角・空白・括弧書き・「駅」「前」等の揺れを吸収する。""" + s = unicodedata.normalize("NFKC", s or "").strip() + s = re.sub(r"[\s・]", "", s) + s = re.sub(r"[((].*?[))]", "", s) # 「(第2旅客ターミナル)」等の注記 + s = s.replace("ヶ", "ケ").replace("ノ", "の") + s = re.sub(r"(停留場|停留所|駅前|駅)$", "", s) + return s + + +def load_repo_data(): + lines = {} + with open(LINES_CSV, newline="", encoding="utf-8") as f: + for r in csv.DictReader(f): + lines[int(r["line_cd"])] = { + "name": unicodedata.normalize("NFKC", r["line_name"]).strip(), + "line_type": int(r["line_type"]) if r["line_type"] else None, + "avg_dist_m": float(r["average_distance"]) if r.get("average_distance") else 0.0, + "e_status": r["e_status"], + } + + by_line: dict[int, list[dict]] = {} + with open(STATIONS_CSV, newline="", encoding="utf-8") as f: + for r in csv.DictReader(f): + if r["e_status"] != "0": + continue + s = { + "cd": int(r["station_cd"]), + "name": r["station_name"], + "norm": norm_name(r["station_name"]), + "line_cd": int(r["line_cd"]), + "lat": float(r["lat"]), + "lon": float(r["lon"]), + "e_sort": int(r["e_sort"]), + } + by_line.setdefault(s["line_cd"], []).append(s) + for sts in by_line.values(): + sts.sort(key=lambda s: (s["e_sort"], s["cd"])) + + kinds = {} + with open(TYPES_CSV, newline="", encoding="utf-8") as f: + for r in csv.DictReader(f): + kinds[int(r["type_cd"])] = int(r["kind"]) if r["kind"] else 0 + + # line_group_cd ごとの (station_cd, type_cd, pass) 列(格納順)。 + groups: dict[int, list[tuple[int, int, int]]] = {} + with open(SST_CSV, newline="", encoding="utf-8") as f: + for r in csv.DictReader(f): + if not r["line_group_cd"]: + continue + groups.setdefault(int(r["line_group_cd"]), []).append( + (int(r["station_cd"]), int(r["type_cd"]), int(r["pass"]) if r["pass"] else 0) + ) + return lines, by_line, kinds, groups + + +def line_detour(lines: dict, by_line: dict, line_cd: int) -> float: + """路線全体で較正した迂回係数 α(estimate_arrival_minutes_calibrated と同等)。""" + li = lines[line_cd] + sts = by_line.get(line_cd, []) + gaps = [ + haversine(sts[i - 1]["lat"], sts[i - 1]["lon"], sts[i]["lat"], sts[i]["lon"]) + for i in range(1, len(sts)) + ] + mean = sum(gaps) / len(gaps) if gaps else 0.0 + avg = li["avg_dist_m"] + if avg > 0 and mean > 0: + return min(max(avg / mean, DETOUR_MIN), RAIL_DETOUR_MAX) + return FALLBACK_DETOUR.get(li["line_type"], 1.30) + + +# --------------------------------------------------------------------------- +# GTFS 取得・読み込み +# --------------------------------------------------------------------------- +def fetch_feed(feed: Feed, token: str | None) -> zipfile.ZipFile | None: + os.makedirs(CACHE_DIR, exist_ok=True) + cache = os.path.join(CACHE_DIR, f"{feed.key}.zip") + if not os.path.exists(cache): + url = feed.url + if feed.needs_token: + if not token: + sys.stderr.write( + f" {feed.name}: ODPT_ACCESS_TOKEN 未設定のためスキップ" + "(https://developer.odpt.org/ で無料発行できます)\n" + ) + return None + url = url.format(token=token) + req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) + with urllib.request.urlopen(req, timeout=HTTP_TIMEOUT) as resp: + data = resp.read() + # 200 で ZIP 以外のエラーボディが返るケースをキャッシュへ確定させないよう、 + # 一時ファイルへ書いて ZIP として開けることを検証してから原子的に置き換える。 + tmp = cache + ".tmp" + with open(tmp, "wb") as f: + f.write(data) + try: + with zipfile.ZipFile(tmp): + pass + except zipfile.BadZipFile: + os.remove(tmp) + raise RuntimeError(f"{feed.name}: 応答が ZIP ではありません(URL・トークンを確認)") + os.replace(tmp, cache) + return zipfile.ZipFile(cache) + + +def read_gtfs_csv(zf: zipfile.ZipFile, name: str) -> list[dict]: + try: + raw = zf.read(name) + except KeyError: + return [] + text = raw.decode("utf-8-sig") + return list(csv.DictReader(io.StringIO(text))) + + +def parse_gtfs_time(t: str) -> float | None: + """GTFS の HH:MM:SS(24 時超えあり)を分に変換する。""" + m = re.match(r"^(\d+):(\d+):(\d+)$", (t or "").strip()) + if not m: + return None + h, mi, s = map(int, m.groups()) + return h * 60 + mi + s / 60.0 + + +def weekday_service_ids(zf: zipfile.ZipFile) -> set[str]: + """平日(月〜金すべて運行)の service_id 集合。calendar.txt が無ければ全 service。""" + cal = read_gtfs_csv(zf, "calendar.txt") + if not cal: + trips = read_gtfs_csv(zf, "trips.txt") + return {t["service_id"] for t in trips} + return { + c["service_id"] + for c in cal + if all(c.get(d) == "1" for d in ("monday", "tuesday", "wednesday", "thursday", "friday")) + } + + +# --------------------------------------------------------------------------- +# 較正本体 +# --------------------------------------------------------------------------- +def find_station_candidates(sts_line: list[dict], nm: str, lat: float, lon: float) -> list[int]: + """路線の駅リストから停留所に対応しうる駅 index の候補を返す。 + + 正規化名一致(座標 500m 以内)を優先し、無ければ座標最近傍(200m 以内)で + 救済する(改称駅・「アリーナ前」⇔「函館アリーナ前」のような表記揺れ対策)。 + + 同名駅が同一路線に複数格納される路線(都営大江戸線の都庁前が環状部始端と + 放射部側の2レコードを持つなど)があるため、単一 index ではなく候補列を返し、 + どちらを採用するかは列車全体の単調性(`resolve_monotonic`)で決める。 + """ + hits = [ + i + for i, s in enumerate(sts_line) + if s["norm"] == nm and haversine(lat, lon, s["lat"], s["lon"]) <= MATCH_RADIUS_M + ] + if hits: + return hits + best, best_d = None, NEAREST_RADIUS_M + for i, s in enumerate(sts_line): + d = haversine(lat, lon, s["lat"], s["lon"]) + if d <= best_d: + best, best_d = i, d + return [best] if best is not None else [] + + +def resolve_monotonic(cand_lists: list[list[int]]) -> list[int] | None: + """各停留所の候補 index 列から、単調増加または単調減少になる割当を返す。 + + 候補が複数ある割当(同名駅)は、成立する割当のうち走行区間(span)が最小の + ものを採用する。例: 大江戸線 光が丘→都庁前 の終点「都庁前」は環状部始端 + (index 0)と放射部側(index 28)の両候補があるが、放射部側を選ぶと + 38→28 の単調減少・span 10 で成立するためそちらを採る。 + 組合せ数が異常に多い場合は割当不能として捨てる(実データでは同名駅は + 高々2候補×少数なので実質発生しない)。 + """ + total = 1 + for cands in cand_lists: + if not cands: + return None + total *= len(cands) + if total > 32: + return None + best: list[int] | None = None + best_span = None + for combo in itertools.product(*cand_lists): + inc = all(b > a for a, b in zip(combo, combo[1:])) + dec = all(b < a for a, b in zip(combo, combo[1:])) + if not (inc or dec): + continue + span = max(combo) - min(combo) + if best_span is None or span < best_span: + best, best_span = list(combo), span + return best + + +def match_line( + trip_stop_keys: list[tuple[str, float, float]], + by_line: dict, + lines: dict, +) -> int | None: + """列車の停車駅列(正規化名, 緯度, 経度)から最も整合する line_cd を返す。""" + best, best_hits = None, 0 + for line_cd, sts in by_line.items(): + if lines.get(line_cd, {}).get("e_status") != "0": + continue + hits = sum(1 for nm, lat, lon in trip_stop_keys if find_station_candidates(sts, nm, lat, lon)) + if hits > best_hits: + best, best_hits = line_cd, hits + if best is not None and best_hits >= max(2, math.ceil(len(trip_stop_keys) * MATCH_COVERAGE)): + return best + return None + + +def classify_kind( + line_cd: int, + served_cds: set[int], + span_cds: list[int], + groups: dict, + kinds: dict, +) -> int | None: + """列車の停車パターンを station_station_types の種別グループと照合し kind を返す。 + + 全駅停車なら kind=0(Default)。通過があるのにどのグループとも一致しない場合は + None(較正対象外)。照合は列車の走行区間(span_cds)内の停車集合の一致で行う。 + """ + span_set = set(span_cds) + if served_cds == span_set: + return 0 + best_kind, best_score = None, 0.0 + for members in groups.values(): + member_cds = {cd for cd, _, _ in members} + if not span_set <= member_cds: + continue + group_stops = {cd for cd, _, ps in members if ps == 0 and cd in span_set} + union = group_stops | served_cds + if not union: + continue + score = len(group_stops & served_cds) / len(union) + if score > best_score: + best_score = score + type_cd = members[0][1] + best_kind = kinds.get(type_cd, 0) + return best_kind if best_score >= 0.9 else None + + +def fit_v_max(samples: list[tuple[list[tuple[float, bool]], float]]) -> float | None: + """観測所要時間(分)の中央値残差が 0 になる v_max を二分探索する。""" + + def residual(v: float) -> float: + return statistics.median(model_minutes(seq, v) - obs for seq, obs in samples) + + lo, hi = V_MIN, V_MAX + if residual(lo) < 0: # 最低速度でもモデルが速すぎる(異常データ) + return None + if residual(hi) > 0: # 最高速度でもモデルが遅すぎる(異常データ) + return None + for _ in range(60): + mid = (lo + hi) / 2 + if residual(mid) > 0: + lo = mid + else: + hi = mid + return (lo + hi) / 2 + + +@dataclass +class Calibration: + line_cd: int + line_name: str + kind: int + v_fit: float + v_rule: float + n_trips: int + median_obs: float + feed: str + + +@dataclass +class SegmentCalibration: + line_cd: int + cd_lo: int + cd_hi: int + v_fit: float + v_base: float + n_samples: int + mean_run_min: float + feed: str + + +def fit_segment_v(dist_m: float, target_min: float) -> float | None: + """駅間の走行時間 target_min(分)を再現する実効最高速度を二分探索する。""" + lo, hi = 5.0, 250.0 + if seg_run_min(dist_m, lo) < target_min: # 最低速度でもモデルが速すぎる + return None + if seg_run_min(dist_m, hi) > target_min: + # GTFS は駅時刻が分単位のことが多く、短駅間では平均しても + # arrival_estimation の加減速モデル上の最短時間より短く見える場合がある。 + # その場合にサンプルを捨てると路線値へフォールバックして逆に遅くなるため、 + # これ以上 v_max を上げても三角形プロファイルで所要がほぼ短くならない + # 境界速度を採用する。 + v_switch = math.sqrt(2 * dist_m / (1 / ACCEL + 1 / DECEL)) * 3.6 + return min(v_switch, hi) + for _ in range(60): + mid = (lo + hi) / 2 + if seg_run_min(dist_m, mid) > target_min: + lo = mid + else: + hi = mid + return (lo + hi) / 2 + + +def kinematic_min_minutes(dist_m: float) -> float: + """加減速モデル上の最短走行時間(分)。速度を上げても縮まない三角形プロファイル。""" + return seg_run_min(dist_m, 1e9) + + +def rebalance_line_targets( + mean_targets: dict[tuple[int, int, int], float], + pair_dist_m: dict[tuple[int, int, int], float], + by_line: dict, + lines: dict, + dep_only_keys: set[tuple[int, int, int]], +) -> None: + """運動学的下限を下回るペアの不足分を隣接ペアへ繰り越し、合計を保存する。 + + GTFS の駅時刻は分単位で、タイムポイント以外の駅では時刻が機械的に + 割り付けられることがある(例: 千代田線 西日暮里→千駄木 平均0.7分 / + 千駄木→根津 平均2.1分。実際はどちらも1分台)。このとき短すぎる側は + フィットで運動学的下限にクランプされて縮められない一方、長すぎる側は + そのまま再現されるため、区間合計が系統的に過大になる(クランプの + 非対称バイアス)。出発間隔ベースでしか較正できないペアの連続列に対し + 前後2パスで不足分を隣へ繰り越すことで、ペア列の合計を保ったまま + 下限違反を解消する。ペア列の端で吸収しきれない不足分は捨てる。 + + 到着時刻ベースで較正できたペアには適用しない(鎖もそこで分断する)。 + 純走行時間の「下限未満」は補間アーティファクトではなく、モデルの保守的な + 加減速下限より実車が速いだけであり、隣から時間を奪うと実測に合っていた + 区間まで過小になる(都営大江戸線で確認済み)。 + """ + for line_cd, sts in by_line.items(): + runs: list[list[tuple[int, int, int]]] = [] + cur: list[tuple[int, int, int]] = [] + for i in range(1, len(sts)): + cd_a, cd_b = sts[i - 1]["cd"], sts[i]["cd"] + key = (line_cd, min(cd_a, cd_b), max(cd_a, cd_b)) + if key in mean_targets and key in dep_only_keys: + cur.append(key) + elif cur: + runs.append(cur) + cur = [] + if cur: + runs.append(cur) + + moved: list[str] = [] + for run in runs: + if len(run) < 2: + continue + mins = [kinematic_min_minutes(pair_dist_m[k]) for k in run] + if all(mean_targets[k] >= m for k, m in zip(run, mins)): + continue + for order in (range(len(run)), range(len(run) - 1, -1, -1)): + carry = 0.0 + for i in order: + t = mean_targets[run[i]] + carry + if t < mins[i]: + carry = t - mins[i] + t = mins[i] + else: + carry = 0.0 + mean_targets[run[i]] = t + moved.append(f"{len(run)}ペア列") + if moved: + sys.stderr.write( + f" {lines[line_cd]['name']}: 駅間時間の繰り越し補正を適用 ({', '.join(moved)})\n" + ) + + +def collect_segment_samples( + seg_samples: dict[tuple[int, int, int], list[tuple[float, str]]], + line_cd: int, + sts_line: list[dict], + matched_idx: list[int], + stop_rows: list[dict], +) -> None: + """各駅停車 1 本ぶんの隣接駅間の純走行時間サンプルを `seg_samples` へ追記する。 + + 駅間の純走行時間の観測値: + - 次駅に到着時刻が別記録されていれば「出発 → 次駅到着」(純走行時間)。 + - 到着 = 出発(停車時分がフィードに折り込まれていない)なら + 「出発 → 次駅出発 − モデル停車時分」で近似する。 + ただし次駅が終点の場合は、モデル側も終点 dwell を加えないため + 停車時分を引かずに「出発 → 終点時刻」を純走行時間として扱う。 + 前者を優先しないと、停車時分を記録する駅で dwell を二重計上して + 駅間速度を系統的に過小評価してしまう。 + """ + for j in range(len(matched_idx) - 1): + a, b = matched_idx[j], matched_idx[j + 1] + if abs(b - a) != 1: # リポジトリ並び順で隣接するペアのみ + continue + dep_a = parse_gtfs_time(stop_rows[j].get("departure_time", "")) + arr_next = parse_gtfs_time(stop_rows[j + 1].get("arrival_time", "")) + dep_next = parse_gtfs_time(stop_rows[j + 1].get("departure_time", "")) + if dep_a is None: + continue + if arr_next is not None and (dep_next is None or arr_next < dep_next): + target = arr_next - dep_a + source = "arr" # 到着時刻ベース(純走行時間) + elif dep_next is not None: + dwell = 0.0 if j + 1 == len(stop_rows) - 1 else DWELL_MIN + target = dep_next - dep_a - dwell + source = "dep" # 出発間隔ベース(モデル停車時分を控除) + else: + continue + if not (SEG_TARGET_RANGE[0] <= target <= SEG_TARGET_RANGE[1]): + continue + cd_a, cd_b = sts_line[a]["cd"], sts_line[b]["cd"] + key = (line_cd, min(cd_a, cd_b), max(cd_a, cd_b)) + seg_samples.setdefault(key, []).append((target, source)) + + +def segment_sanity_upper_kmh(base: float, line_type: int | None) -> float: + upper = SEG_SANITY_BAND[1] * base + if line_type == LT_SUBWAY: + upper = max(upper, SEG_SUBWAY_ABS_MAX_KMH) + return upper + + +def calibrate_feed( + feed: Feed, zf: zipfile.ZipFile, lines, by_line, kinds, groups +) -> tuple[list[Calibration], dict[tuple[int, int, int], list[tuple[float, str]]]]: + stops_by_id = { + s["stop_id"]: (norm_name(s["stop_name"]), float(s["stop_lat"]), float(s["stop_lon"])) + for s in read_gtfs_csv(zf, "stops.txt") + if s.get("stop_lat") and s.get("stop_lon") + } + services = weekday_service_ids(zf) + trips = [t for t in read_gtfs_csv(zf, "trips.txt") if t["service_id"] in services] + trip_ids = {t["trip_id"] for t in trips} + + st_by_trip: dict[str, list[dict]] = {} + for st in read_gtfs_csv(zf, "stop_times.txt"): + if st["trip_id"] in trip_ids: + st_by_trip.setdefault(st["trip_id"], []).append(st) + for v in st_by_trip.values(): + v.sort(key=lambda r: int(r["stop_sequence"])) + + # (line_cd, kind) -> [(モデル入力列, 観測分), ...](同一パターン・同一所要は重複排除) + samples: dict[tuple[int, int], dict[tuple, tuple]] = {} + # (line_cd, station_cd小, station_cd大) -> [(駅間走行時間(分), "arr"|"dep"), ...]。 + # 各駅停車(kind=0)の隣接駅間のみ。時刻の分丸めを複数本の平均で均すため + # 重複排除しない(同時刻パターンの多重度も含めて平均する)。 + seg_samples: dict[tuple[int, int, int], list[tuple[float, str]]] = {} + line_match_cache: dict[tuple, int | None] = {} + + for trip_id, sts in st_by_trip.items(): + # 乗降可能な停車のみ(pickup/drop_off とも 1=不可 の通過レコードを除外)。 + stop_rows = [ + r for r in sts + if not (r.get("pickup_type") == "1" and r.get("drop_off_type") == "1") + ] + if len(stop_rows) < 4: + continue + dep0 = parse_gtfs_time(stop_rows[0].get("departure_time", "")) + arr_last = parse_gtfs_time(stop_rows[-1].get("arrival_time", "")) + if dep0 is None or arr_last is None or arr_last <= dep0: + continue + if not (DAYTIME_HOURS[0] * 60 <= dep0 % 1440 <= DAYTIME_HOURS[1] * 60): + continue + + keys = [] + ok = True + for r in stop_rows: + info = stops_by_id.get(r["stop_id"]) + if info is None: + ok = False + break + keys.append(info) + if not ok: + continue + + pattern = tuple(k[0] for k in keys) + if pattern not in line_match_cache: + line_match_cache[pattern] = match_line(keys, by_line, lines) + line_cd = line_match_cache[pattern] + if line_cd is None: + continue + + # 停車駅を自データの駅へ対応付ける。同名駅(大江戸線 都庁前など)は + # 候補が複数あるため、列車全体で単調になる割当を選ぶ。 + # 単調割当が無い列車(環状一周・折返し・6の字乗り通し)は除外する。 + sts_line = by_line[line_cd] + cand_lists = [find_station_candidates(sts_line, nm, lat, lon) for nm, lat, lon in keys] + matched_idx = resolve_monotonic(cand_lists) + if matched_idx is None: + continue + + lo, hi = min(matched_idx), max(matched_idx) + span = sts_line[lo:hi + 1] + if matched_idx[0] > matched_idx[-1]: + span = list(reversed(span)) + served = {sts_line[i]["cd"] for i in matched_idx} + kind = classify_kind(line_cd, served, [s["cd"] for s in span], groups, kinds) + if kind is None: + continue + + alpha = line_detour(lines, by_line, line_cd) + seq: list[tuple[float, bool]] = [(0.0, True)] + for a, b in zip(span, span[1:]): + d = haversine(a["lat"], a["lon"], b["lat"], b["lon"]) * alpha + seq.append((d, b["cd"] in served)) + obs = arr_last - dep0 + + dedup_key = (tuple(s["cd"] for s in span), tuple(sorted(served)), round(obs, 1)) + samples.setdefault((line_cd, kind), {})[dedup_key] = (seq, obs) + + # 駅間別較正のサンプル収集(各駅停車のみ)。 + if kind == 0: + collect_segment_samples(seg_samples, line_cd, sts_line, matched_idx, stop_rows) + + results = [] + for (line_cd, kind), dd in sorted(samples.items()): + trips_list = list(dd.values()) + if len(trips_list) < MIN_TRIPS: + sys.stderr.write( + f" {lines[line_cd]['name']} kind={kind}: サンプル {len(trips_list)} 本 < {MIN_TRIPS} → 見送り\n" + ) + continue + v = fit_v_max(trips_list) + if v is None or not (V_MIN < v < V_MAX): + sys.stderr.write(f" {lines[line_cd]['name']} kind={kind}: フィット失敗 → 見送り\n") + continue + results.append(Calibration( + line_cd=line_cd, + line_name=lines[line_cd]["name"], + kind=kind, + v_fit=round(v / 5) * 5, # 5km/h 刻みに丸めて出力の安定性を上げる + v_rule=general_rule_speed(lines[line_cd]["line_type"], kind), + n_trips=len(trips_list), + median_obs=statistics.median(o for _, o in trips_list), + feed=feed.name, + )) + return results, seg_samples + + +# --------------------------------------------------------------------------- +# speed_table.rs の自動生成ブロック書き換え +# --------------------------------------------------------------------------- +BEGIN_MARK = "// --- BEGIN GENERATED (scripts/compute_speed_table.py) ---" +END_MARK = "// --- END GENERATED ---" + + +def manual_keys_in_rust(src: str) -> set[tuple[int, str]]: + """手動較正テーブル(自動生成ブロック外)に既にある (line_cd, kind名) を集める。""" + gen_start = src.find(BEGIN_MARK) + manual_src = src if gen_start < 0 else src[:gen_start] + return { + (int(m.group(1)), m.group(2)) + for m in re.finditer(r"\(\s*(\d+)\s*,\s*TrainTypeKind::(\w+)\s*,", manual_src) + } + + +def existing_generated_entries(src: str) -> list[tuple[int, str, str]]: + """生成ブロック内の既存エントリを (line_cd, kind名, 整形済み2行) で返す。""" + start = src.find(BEGIN_MARK) + end = src.find(END_MARK) + if start < 0 or end < 0: + return [] + block = src[start + len(BEGIN_MARK):end] + entries = [] + pending_comment = "" + for line in block.splitlines(): + stripped = line.strip() + m = re.match(r"\(\s*(\d+)\s*,\s*TrainTypeKind::(\w+)\s*,\s*[0-9.]+\s*\)\s*,", stripped) + if m: + entries.append((int(m.group(1)), m.group(2), pending_comment + f" {stripped}\n")) + pending_comment = "" + elif stripped.startswith("//") and "エントリなし" not in stripped: + pending_comment += f" {stripped}\n" + return entries + + +def apply_to_rust(results: list[Calibration], recalibrated: set[tuple[int, str]]) -> int: + """生成ブロックを更新する。 + + 今回の実行で較正できた (line_cd, kind) は新しい値で置き換え、較正対象に + ならなかったキー(トークン未設定でスキップしたフィード・取得失敗など)の + 既存エントリはそのまま残す。較正した結果、乖離が閾値未満になったキーは + `recalibrated` に含まれるため既存エントリごと削除される。 + """ + with open(SPEED_TABLE_RS, encoding="utf-8") as f: + src = f.read() + start = src.find(BEGIN_MARK) + end = src.find(END_MARK) + if start < 0 or end < 0 or end < start: + raise SystemExit(f"{SPEED_TABLE_RS} に生成ブロックマーカーが見つかりません") + + manual = manual_keys_in_rust(src) + kind_value = {name: value for value, name in KIND_NAMES.items()} + + # (line_cd, kind値) -> 整形済みエントリ文字列 + merged: dict[tuple[int, int], str] = {} + for line_cd, kind_name, text in existing_generated_entries(src): + if (line_cd, kind_name) in recalibrated or (line_cd, kind_name) in manual: + continue + merged[(line_cd, kind_value.get(kind_name, 0))] = text + + skipped = 0 + for c in results: + kind_name = KIND_NAMES[c.kind] + if (c.line_cd, kind_name) in manual: + sys.stderr.write( + f" {c.line_name} kind={kind_name}: 手動テーブルに既存エントリがあるためスキップ\n" + ) + skipped += 1 + continue + merged[(c.line_cd, c.kind)] = ( + f" // {c.line_name} {kind_name}: {c.feed} GTFS {c.n_trips}本 " + f"中央値{c.median_obs:.0f}分 (一般則 {c.v_rule:.0f}km/h)\n" + f" ({c.line_cd}, TrainTypeKind::{kind_name}, {c.v_fit:.1f}),\n" + ) + + rows = [merged[k] for k in sorted(merged)] + body = "".join(rows) if rows else " // (現在エントリなし)\n" + # BEGIN マーカー行の直後から END マーカー行(インデント込み)の直前までを置換する。 + line_start = src.rfind("\n", 0, end) + 1 + new_src = src[: start + len(BEGIN_MARK)] + "\n" + body + src[line_start:] + if new_src != src: + with open(SPEED_TABLE_RS, "w", encoding="utf-8") as f: + f.write(new_src) + return len(rows) + + +# --------------------------------------------------------------------------- +# segment_speed_table.rs の自動生成ブロック書き換え(駅間別較正) +# --------------------------------------------------------------------------- +def default_kind_speeds_in_rust() -> tuple[dict[int, float], dict[int, float]]: + """speed_table.rs の (line_cd, Default) エントリ値を (手動, 生成) で返す。""" + with open(SPEED_TABLE_RS, encoding="utf-8") as f: + src = f.read() + gen_start = src.find(BEGIN_MARK) + manual_src = src if gen_start < 0 else src[:gen_start] + gen_src = "" if gen_start < 0 else src[gen_start:] + pat = r"\(\s*(\d+)\s*,\s*TrainTypeKind::Default\s*,\s*([0-9.]+)\s*\)" + manual = {int(lc): float(v) for lc, v in re.findall(pat, manual_src)} + generated = {int(lc): float(v) for lc, v in re.findall(pat, gen_src)} + return manual, generated + + +def existing_segment_entries(src: str) -> list[tuple[int, int, int, str]]: + """生成ブロック内の既存駅間エントリを (line_cd, cd小, cd大, 整形済み行) で返す。""" + start = src.find(BEGIN_MARK) + end = src.find(END_MARK) + if start < 0 or end < 0: + return [] + block = src[start + len(BEGIN_MARK):end] + entries = [] + pending_comment = "" + for line in block.splitlines(): + stripped = line.strip() + m = re.match(r"\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*[0-9.]+\s*\)\s*,", stripped) + if m: + entries.append(( + int(m.group(1)), + int(m.group(2)), + int(m.group(3)), + pending_comment + f" {stripped}\n", + )) + pending_comment = "" + elif stripped.startswith("//") and "エントリなし" not in stripped: + pending_comment += f" {stripped}\n" + return entries + + +def apply_segments_to_rust( + seg_results: list[SegmentCalibration], + recalibrated_pairs: set[tuple[int, int, int]], + name_of: dict[int, str], + lines: dict, +) -> int: + """segment_speed_table.rs の生成ブロックを更新する。 + + 今回の実行で較正を評価できた駅間ペア(サンプル数・フィット・妥当性チェックを + 通過したペア)は新しい結果で置き換え、閾値未満になったペアは削除する。 + 評価できなかったペア(時刻データ欠損・サンプル不足・フィード未取得など)の + 既存エントリはそのまま残す。路線単位で消すと、時刻データの無い駅間の + 較正済みエントリまで巻き添えで消えるため、必ずペア単位で判定する。 + """ + with open(SEGMENT_TABLE_RS, encoding="utf-8") as f: + src = f.read() + start = src.find(BEGIN_MARK) + end = src.find(END_MARK) + if start < 0 or end < 0 or end < start: + raise SystemExit(f"{SEGMENT_TABLE_RS} に生成ブロックマーカーが見つかりません") + + merged: dict[tuple[int, int, int], str] = {} + for line_cd, cd_lo, cd_hi, text in existing_segment_entries(src): + if (line_cd, cd_lo, cd_hi) in recalibrated_pairs: + continue + merged[(line_cd, cd_lo, cd_hi)] = text + + for s in seg_results: + merged[(s.line_cd, s.cd_lo, s.cd_hi)] = ( + f" // {lines[s.line_cd]['name']} {name_of.get(s.cd_lo, s.cd_lo)}〜" + f"{name_of.get(s.cd_hi, s.cd_hi)}: {s.feed} GTFS {s.n_samples}本 " + f"平均{s.mean_run_min:.1f}分 (路線値 {s.v_base:.0f}km/h)\n" + f" ({s.line_cd}, {s.cd_lo}, {s.cd_hi}, {s.v_fit:.1f}),\n" + ) + + rows = [merged[k] for k in sorted(merged)] + body = "".join(rows) if rows else " // (現在エントリなし)\n" + line_start = src.rfind("\n", 0, end) + 1 + new_src = src[: start + len(BEGIN_MARK)] + "\n" + body + src[line_start:] + if new_src != src: + with open(SEGMENT_TABLE_RS, "w", encoding="utf-8") as f: + f.write(new_src) + return len(rows) + + +# --------------------------------------------------------------------------- +# メイン +# --------------------------------------------------------------------------- +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__) + g = ap.add_mutually_exclusive_group(required=True) + g.add_argument("--validate", action="store_true", help="較正のみ(ファイル不変)") + g.add_argument("--apply", action="store_true", help="speed_table.rs の生成ブロックを書き換える") + ap.add_argument( + "--dump-line", + type=int, + default=None, + metavar="LINE_CD", + help="指定した line_cd の駅間較正の内訳(生平均・繰り越し補正後・運動学的下限・フィット結果)を表示する", + ) + args = ap.parse_args() + + token = os.environ.get("ODPT_ACCESS_TOKEN") + lines, by_line, kinds, groups = load_repo_data() + + all_results: list[Calibration] = [] + all_seg_samples: dict[tuple[int, int, int], list[tuple[float, str]]] = {} + # 駅間ペア -> フィード名集合(出典コメント用)。通常は路線とフィードが 1 対 1 だが、 + # 複数フィードが同一ペアへ寄与した場合も全出典を保持する。 + seg_feed_of: dict[tuple[int, int, int], set[str]] = {} + for feed in FEEDS: + sys.stderr.write(f"[{feed.key}] {feed.name} ({feed.license})\n") + try: + zf = fetch_feed(feed, token) + except Exception as e: # noqa: BLE001 - フィード単位で続行する + sys.stderr.write(f" 取得失敗: {e!r} → スキップ\n") + continue + if zf is None: + continue + with zf: + results, seg_samples = calibrate_feed(feed, zf, lines, by_line, kinds, groups) + all_results.extend(results) + for key, ts in seg_samples.items(): + all_seg_samples.setdefault(key, []).extend(ts) + seg_feed_of.setdefault(key, set()).add(feed.name) + + print(f"\n{'路線':<24} {'kind':<16} {'フィット':>8} {'一般則':>7} {'乖離':>7} {'本数':>4} {'採用':>4}") + emitted = [] + for c in sorted(all_results, key=lambda c: (c.line_cd, c.kind)): + dev = c.v_fit / c.v_rule - 1.0 + emit = abs(dev) >= EMIT_THRESHOLD + if emit: + emitted.append(c) + print( + f"{c.line_name:<24} {KIND_NAMES[c.kind]:<16} {c.v_fit:6.0f}km {c.v_rule:5.0f}km " + f"{dev:+7.1%} {c.n_trips:>4} {'○' if emit else '-':>4}" + ) + + # --- 駅間別較正 --- + # ベースライン(Rust 側が実際に使う路線単位の実効速度): 手動テーブル → + # 今回の較正で出力される値 → 既存の生成値 → 一般則 の順で解決する。 + manual_default, gen_default = default_kind_speeds_in_rust() + recal_lines = {c.line_cd for c in all_results if c.kind == 0} + emit_default = {c.line_cd: c.v_fit for c in emitted if c.kind == 0} + + def line_baseline(line_cd: int) -> float: + if line_cd in manual_default: + return manual_default[line_cd] + if line_cd in recal_lines: + v = emit_default.get(line_cd) + if v: + return v + return general_rule_speed(lines[line_cd]["line_type"], 0) + if line_cd in gen_default: + return gen_default[line_cd] + return general_rule_speed(lines[line_cd]["line_type"], 0) + + name_of = {s["cd"]: s["name"] for sts in by_line.values() for s in sts} + coord_of = {s["cd"]: (s["lat"], s["lon"]) for sts in by_line.values() for s in sts} + + # ペアごとの平均ターゲットとみなし距離。距離には路線較正済みの迂回係数を使う。 + mean_targets: dict[tuple[int, int, int], float] = {} + pair_dist_m: dict[tuple[int, int, int], float] = {} + # 出発間隔ベースでしか較正できなかったペア(繰り越し補正の対象)。 + dep_only_keys: set[tuple[int, int, int]] = set() + detour_cache: dict[int, float] = {} + for (line_cd, cd_lo, cd_hi), ts in all_seg_samples.items(): + if len(ts) < SEG_MIN_SAMPLES: + continue + if line_cd not in detour_cache: + detour_cache[line_cd] = line_detour(lines, by_line, line_cd) + (lat1, lon1), (lat2, lon2) = coord_of[cd_lo], coord_of[cd_hi] + key = (line_cd, cd_lo, cd_hi) + # 到着時刻ベース(純走行時間)が十分あればそれだけを使う。無いフィード + # (東京メトロは全駅 arr==dep)では出発間隔ベースの上側トリム平均で + # 接続待ち・時隔調整の折込みを除去する。 + arr_ts = [t for t, s in ts if s == "arr"] + if len(arr_ts) >= SEG_ARR_MIN_SAMPLES: + used = arr_ts + else: + dep_ts = sorted(t for t, s in ts if s == "dep") or [t for t, _ in ts] + keep = max(1, math.ceil(len(dep_ts) * (1.0 - SEG_DEP_TRIM_RATIO))) + used = dep_ts[:keep] + dep_only_keys.add(key) + mean_targets[key] = sum(used) / len(used) + pair_dist_m[key] = haversine(lat1, lon1, lat2, lon2) * detour_cache[line_cd] + + raw_targets = dict(mean_targets) + rebalance_line_targets(mean_targets, pair_dist_m, by_line, lines, dep_only_keys) + + seg_emitted: list[SegmentCalibration] = [] + # 較正を評価できた(サンプル数・フィット・妥当性チェックを通過した)ペア。 + # --apply 時に既存エントリを置き換え・削除してよいのはこの集合だけ。 + seg_recal_pairs: set[tuple[int, int, int]] = set() + seg_stats: dict[int, list[int]] = {} # line_cd -> [較正ペア数, 出力ペア数] + seg_debug: list[tuple] = [] + for (line_cd, cd_lo, cd_hi), target in sorted(mean_targets.items()): + ts = all_seg_samples[(line_cd, cd_lo, cd_hi)] + dist_m = pair_dist_m[(line_cd, cd_lo, cd_hi)] + v = fit_segment_v(dist_m, target) + if args.dump_line == line_cd: + n_arr = sum(1 for _, s in ts if s == "arr") + seg_debug.append(( + (line_cd, cd_lo, cd_hi), len(ts), n_arr, + raw_targets[(line_cd, cd_lo, cd_hi)], target, + kinematic_min_minutes(dist_m), dist_m, v, + )) + stats = seg_stats.setdefault(line_cd, [0, 0]) + if v is None: + continue + base = line_baseline(line_cd) + upper = segment_sanity_upper_kmh(base, lines[line_cd]["line_type"]) + if not (SEG_SANITY_BAND[0] * base <= v <= upper): + sys.stderr.write( + f" {lines[line_cd]['name']} {name_of[cd_lo]}〜{name_of[cd_hi]}: " + f"フィット {v:.0f}km/h が路線値 {base:.0f}km/h の妥当範囲外 " + f"({SEG_SANITY_BAND[0] * base:.0f}〜{upper:.0f}km/h) → 見送り\n" + ) + continue + stats[0] += 1 + seg_recal_pairs.add((line_cd, cd_lo, cd_hi)) + v = float(round(v)) + if abs(v / base - 1.0) < SEG_EMIT_THRESHOLD: + continue + stats[1] += 1 + seg_emitted.append(SegmentCalibration( + line_cd=line_cd, + cd_lo=cd_lo, + cd_hi=cd_hi, + v_fit=v, + v_base=base, + n_samples=len(ts), + mean_run_min=target, + feed="・".join(sorted(seg_feed_of.get((line_cd, cd_lo, cd_hi), set()))), + )) + + if seg_debug: + print( + f"\n[--dump-line {args.dump_line}] " + f"{'ペア':<24} {'本数':>5} {'到着基準':>5} {'生平均':>7} {'補正後':>7} {'下限':>6} {'距離m':>7} {'フィット':>7}" + ) + for key, n, n_arr, raw, adj, kmin, dist, v in seg_debug: + _, lo, hi = key + label = f"{name_of.get(lo, lo)}〜{name_of.get(hi, hi)}" + v_str = f"{v:6.0f}km" if v is not None else " 失敗" + print(f" {label:<24} {n:>5} {n_arr:>5} {raw:7.2f} {adj:7.2f} {kmin:6.2f} {dist:7.0f} {v_str}") + + if seg_stats: + print(f"\n[駅間別較正] {'路線':<24} {'較正ペア':>6} {'出力':>4}") + for line_cd, (n_cal, n_emit) in sorted(seg_stats.items()): + print(f"{'':<11}{lines[line_cd]['name']:<24} {n_cal:>6} {n_emit:>4}") + if not args.apply and seg_emitted: + print(f"\n[駅間別較正] 出力対象(路線値から ±{SEG_EMIT_THRESHOLD:.0%} 以上乖離):") + for s in seg_emitted: + print( + f" {lines[s.line_cd]['name']} {name_of[s.cd_lo]}〜{name_of[s.cd_hi]}: " + f"{s.v_fit:.0f}km/h (路線値 {s.v_base:.0f}km/h, {s.n_samples}本, 平均{s.mean_run_min:.1f}分)" + ) + + if args.apply: + recalibrated = {(c.line_cd, KIND_NAMES[c.kind]) for c in all_results} + n = apply_to_rust(emitted, recalibrated) + print(f"\nspeed_table.rs 生成ブロックを更新: {n} エントリ") + n_seg = apply_segments_to_rust(seg_emitted, seg_recal_pairs, name_of, lines) + print(f"segment_speed_table.rs 生成ブロックを更新: {n_seg} エントリ") + else: + print(f"\n出力対象(一般則から ±{EMIT_THRESHOLD:.0%} 以上乖離): {len(emitted)} エントリ(--apply で書き込み)") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/stationapi/src/domain.rs b/stationapi/src/domain.rs index f8b8eddb..0e083171 100644 --- a/stationapi/src/domain.rs +++ b/stationapi/src/domain.rs @@ -4,3 +4,5 @@ pub mod error; pub mod ipa; pub mod normalize; pub mod repository; +pub mod segment_speed_table; +pub mod speed_table; diff --git a/stationapi/src/domain/arrival_estimation.rs b/stationapi/src/domain/arrival_estimation.rs index 81e98b12..4a7bad96 100644 --- a/stationapi/src/domain/arrival_estimation.rs +++ b/stationapi/src/domain/arrival_estimation.rs @@ -9,15 +9,29 @@ //! 2. 迂回係数 `α` で「みなし走行距離(軌道距離)」へ補正する。`α` は //! `Line.average_distance`(メートル単位・実距離±10%精度)が得られる路線では //! `average_distance / 直線平均駅間距離` で較正し、得られない路線では -//! 路線種別ベースの固定値にフォールバックする。 +//! 路線種別ベースの固定値にフォールバックする。較正の母数(直線平均)は +//! クエリで切り出した部分区間ではなく **経路全体の駅列** から取る。 +//! `average_distance` は路線全体の平均駅間距離なので、駅間隔が路線平均と +//! 異なる部分区間(長距離路線の都心側など)の直線平均と比較すると `α` が +//! 実態(1.0〜1.1 程度)から大きく外れてしまうため。経路自体が路線の一部に +//! 偏り較正が破綻する路線は、実測値の較正テーブル +//! (`LINE_DETOUR_OVERRIDES`)で `α` を上書きする。 //! 3. 停車駅間ごとに「加速→巡航→減速」の運動学モデルで走行時間を算出する。 //! 停車が多いほど巡航しきれず平均速度が落ちる(各停が速達より遅い)現象が //! 加減速ペナルティとして自然に表現される。運動学モデルは理想走行 //! (最大加速→最高速度で巡航→最大減速)を仮定するため、実ダイヤに含まれる //! 途中の速度制限・惰行・回復余裕のぶん系統的に速すぎる。これを走行時間への //! 運転余裕率 `run_margin` として補正する(実路線の時刻表との較正で約 1.15)。 +//! 通過駅には分岐器・曲線の速度制限ぶんの小ペナルティ `pass_penalty` を加える。 //! 4. 中間停車駅に停車時間 `dwell` を加算して累積する。 //! +//! 速度は路線種別の基本速度に列車種別(`TrainTypeKind`)の倍率を掛けて決める。 +//! 快速系(Branch/Rapid/CommuterRapid)は各停と同じ車両・線路を走り、速達性は +//! 通過(停車回数減)そのもので表現されるため倍率 1.0。急行・特急はより高速な +//! 走行(待避線での追い抜き前提のダイヤ)を、新快速級(HighSpeedRapid)は +//! 130km/h 運転をそれぞれ倍率で表す。実路線の時刻表(中央快速・井の頭急行・ +//! 東横特急急行・京急快特・小田急快急・新快速など)との較正に基づく。 +//! //! 入力経路は運用上 `line_group_cd` を跨がない(=単一の列車・直通サービス)ため //! 乗換時間は加算しない。直通で `line_cd` が変わる区間は `α`・最高速度の //! 切り替えにのみ用いる。 @@ -28,7 +42,11 @@ use std::collections::HashMap; use crate::domain::entity::gtfs::TransportType; use crate::domain::entity::station::Station; -use crate::proto::StopCondition; +use crate::domain::segment_speed_table::{ + segment_override_applies_to_kind, segment_speed_override_kmh, +}; +use crate::domain::speed_table::line_speed_override_kmh; +use crate::proto::{StopCondition, TrainTypeKind}; /// 1 駅分の推定結果。 #[derive(Clone, Debug, PartialEq)] @@ -64,6 +82,9 @@ pub struct EstimationParams { /// 走行時間に掛ける運転余裕率。運動学モデルの理想走行と実ダイヤの差 /// (途中の速度制限・惰行・回復余裕)を包括する補正係数。 pub run_margin: f64, + /// 通過駅 1 駅あたりの通過ペナルティ(秒)。分岐器・ホーム進入部の曲線など、 + /// 駅部を最高速度で通過しきれないぶんの実効値。 + pub pass_penalty_seconds: f64, /// 迂回係数 `α` のクランプ下限。 pub detour_min: f64, /// 迂回係数 `α` のクランプ上限。 @@ -77,6 +98,7 @@ impl Default for EstimationParams { decel: 0.9, dwell_minutes: 0.6, run_margin: 1.15, + pass_penalty_seconds: 3.0, detour_min: 1.0, detour_max: 1.6, } @@ -241,10 +263,45 @@ fn fallback_detour_factor(line_type: Option, transport_type: TransportType) } } +/// 鉄道の迂回係数 `α` のクランプ上限。隣接駅間の軌道は直線距離の 1.1〜1.2 倍を +/// 超えることがほぼ無いため、`average_distance` の母数が汚れている路線 +/// (別線区の駅列が同一 line_cd の末尾に連なる成田スカイアクセス線など)で +/// `α` が張り付いて走行距離を大幅に過大評価しないためのガード。 +/// 道路網の迂回率が高いバスには適用しない(`params.detour_max` のまま)。 +const RAIL_DETOUR_MAX: f64 = 1.35; + +/// 路線ごとの実測迂回係数 `α` の較正テーブル。`(line_cd, α)`。 +/// +/// `α = average_distance / 直線平均駅間距離` の較正は「分子(路線全体の平均実 +/// 駅間距離)と分母(経路の平均直線駅間距離)が同じ駅間隔分布を持つ」ことを +/// 仮定している。駅間隔が区間によって大きく異なる路線(都心側は 1〜2km 間隔・ +/// 山間側は 3〜5km 間隔の西武池袋線など)では、経路(列車の運転区間)が路線の +/// 一部に限られると分母だけ狭い駅間隔で平均され、`α` が実態から大きく外れて +/// 走行距離・所要時間を系統的に過大評価する(例: 西武池袋線 池袋→飯能経路の +/// 較正値は 1.24 だが、営業キロ 43.7km / 直線 41.1km = 実測 1.06)。 +/// +/// ここには営業キロと駅座標の直線距離から実測した迂回係数を載せ、 +/// `average_distance` ベースの較正より優先する。 +/// 検証していない路線を推測で追加しないこと(較正フォールバックに任せる)。 +const LINE_DETOUR_OVERRIDES: &[(i32, f64)] = &[ + // 西武池袋線: 池袋→飯能 営業キロ 43.7km / 直線距離合計 41.1km。 + // 池袋→所沢 準急 実28〜31分・急行 実24分への較正で検証。 + (22001, 1.06), +]; + +/// `line_cd` に対応する実測迂回係数を返す。エントリが無ければ `None`。 +pub fn line_detour_override(line_cd: i32) -> Option { + LINE_DETOUR_OVERRIDES + .iter() + .find(|(lc, _)| *lc == line_cd) + .map(|(_, v)| *v) +} + /// 迂回係数 `α` を決める。 /// /// `avg_distance_km`(= `Line.average_distance` を km 換算した値、実距離±10%精度)が得られる場合は -/// `avg_distance_km / mean_straight_km` で較正し、`detour_min..=detour_max` にクランプする。 +/// `avg_distance_km / mean_straight_km` で較正し、`detour_min..=detour_max` にクランプする +/// (鉄道は上限をさらに `RAIL_DETOUR_MAX` で抑える)。 /// 得られない(`<= 0`)場合や直線平均が 0 の場合は路線種別ベースの固定値へフォールバックする。 pub fn detour_factor_for( avg_distance_km: f64, @@ -254,7 +311,14 @@ pub fn detour_factor_for( params: &EstimationParams, ) -> f64 { if avg_distance_km > 0.0 && mean_straight_km > 0.0 { - (avg_distance_km / mean_straight_km).clamp(params.detour_min, params.detour_max) + let detour_max = if transport_type == TransportType::Bus { + params.detour_max + } else { + params.detour_max.min(RAIL_DETOUR_MAX) + } + // detour_min > 上限 の設定でも clamp(min > max) でパニックしないよう正規化。 + .max(params.detour_min); + (avg_distance_km / mean_straight_km).clamp(params.detour_min, detour_max) } else { fallback_detour_factor(line_type, transport_type) } @@ -272,23 +336,45 @@ fn base_speed_kmh(line_type: Option) -> f64 { } } +/// 列車種別(`TrainTypeKind`)ごとの速度倍率。 +/// +/// 快速系(Rapid/CommuterRapid)や支線直通(Branch)は各停と同じ車両・線路を +/// 走るため各停と同速とし、速達性は通過(加減速・停車の削減)だけで表現する。 +/// 急行・特急は速達ダイヤの実勢巡航速度、新快速級(HighSpeedRapid)は +/// 130km/h 運転を倍率で表す(在来線基本 80km/h × 1.5 = 120km/h)。 +fn kind_speed_multiplier(kind: Option) -> f64 { + match kind.and_then(|v| TrainTypeKind::try_from(v).ok()) { + Some(TrainTypeKind::Express) => 1.15, + Some(TrainTypeKind::LimitedExpress) => 1.2, + Some(TrainTypeKind::HighSpeedRapid) => 1.5, + _ => 1.0, + } +} + /// 路線種別・列車種別から最高速度(km/h)を決める。 /// /// バスは `line_type`(GTFS の route_type が混入)や `kind`(BusRoute=7 は経路 /// マーカーであり優等種別ではない)で判定できないため、`transport_type` で /// 先に分岐して固定の実効上限を返す。 -fn max_speed_kmh(line_type: Option, kind: Option, transport_type: TransportType) -> f64 { +/// 鉄道は路線 × 種別の較正テーブル(`speed_table`)を最優先し、エントリが +/// 無ければ「路線種別の基本速度 × 種別倍率」の一般則にフォールバックする。 +fn max_speed_kmh( + line_cd: i32, + line_type: Option, + kind: Option, + transport_type: TransportType, +) -> f64 { if transport_type == TransportType::Bus { return BUS_MAX_SPEED_KMH; } + if let Some(v) = line_speed_override_kmh(line_cd, kind) { + return v; + } let base = base_speed_kmh(line_type); if line_type == Some(LINE_TYPE_SHINKANSEN) { return base; } - match kind { - Some(k) if k != 0 => base * 1.2, - _ => base, - } + base * kind_speed_multiplier(kind) } /// 停車駅間の走行時間(分)を運動学モデルで求める。 @@ -361,17 +447,19 @@ fn detour_factors_by_line( acc.into_iter() .map( |(line_cd, (sum, count, avg_distance, line_type, transport_type))| { - let mean_straight = if count > 0 { sum / count as f64 } else { 0.0 }; - ( - line_cd, + // 実測の較正テーブルにある路線は average_distance ベースの + // 較正より優先する(経路が路線の一部だと較正が破綻するため)。 + let detour = line_detour_override(line_cd).unwrap_or_else(|| { + let mean_straight = if count > 0 { sum / count as f64 } else { 0.0 }; detour_factor_for( avg_distance, mean_straight, line_type, transport_type, params, - ), - ) + ) + }); + (line_cd, detour) }, ) .collect() @@ -414,6 +502,11 @@ fn assign_segment_times( if v > 0.0 { cruise_sec += track_m / v; } + if !is_stop { + // 通過駅は分岐器・ホーム進入部の曲線で最高速度を維持できないぶんの + // 小ペナルティを加える。 + cruise_sec += params.pass_penalty_seconds; + } let seconds = if is_stop { // 終点停車駅: 加速 + 全巡航 + 減速。 accel_penalty_sec + cruise_sec + decel_penalty_sec @@ -432,9 +525,26 @@ fn assign_segment_times( /// 順序付き駅リスト(単一 `line_group_cd` の経路)に対し、始点からの累積到着時間(分)を推定する。 /// /// `stops` は始点→終点の順に並んでいること。返り値は入力と同じ順・同じ要素数。 +/// 迂回係数 `α` は `stops` 自身から較正する。`stops` が経路全体の一部を切り出した +/// 区間の場合は [`estimate_arrival_minutes_calibrated`] で経路全体を較正母数に渡すこと。 pub fn estimate_arrival_minutes( stops: &[&Station], params: &EstimationParams, +) -> Vec { + estimate_arrival_minutes_calibrated(stops, stops, params) +} + +/// [`estimate_arrival_minutes`] の較正母数指定版。 +/// +/// `calibration_stops` には経路全体(部分区間へ切り出す前)の駅列を渡す。 +/// `Line.average_distance` は路線全体の平均駅間距離なので、迂回係数 +/// `α = average_distance / 直線平均駅間距離` の分母も路線全体相当の駅列から +/// 取らないと較正が破綻する(例: 長距離路線の都心側だけを切り出すと駅間隔が +/// 路線平均より狭く、`α` が上限に張り付いて走行距離を大幅に過大評価する)。 +pub fn estimate_arrival_minutes_calibrated( + stops: &[&Station], + calibration_stops: &[&Station], + params: &EstimationParams, ) -> Vec { let n = stops.len(); if n == 0 { @@ -452,13 +562,35 @@ pub fn estimate_arrival_minutes( ) / 1000.0; } - // line_cd ごとの迂回係数。 - let detour_by_line = detour_factors_by_line(stops, &straight_km, params); + // line_cd ごとの迂回係数。較正には経路全体の駅列を用いる。 + // 環状路線のシーム辺(末尾駅→先頭駅)は意図的に母数へ含めない。分子側の + // `average_distance` 自体が格納順の隣接ペアのみ(シーム辺なし)から算出されて + // おり(scripts/compute_average_distance.py)、分母だけシーム辺を足すと母数が + // ズレるため。 + let calibration = if calibration_stops.is_empty() { + stops + } else { + calibration_stops + }; + let mut calib_straight_km = vec![0.0_f64; calibration.len()]; + for i in 1..calibration.len() { + calib_straight_km[i] = haversine_distance( + calibration[i - 1].lat, + calibration[i - 1].lon, + calibration[i].lat, + calibration[i].lon, + ) / 1000.0; + } + let detour_by_line = detour_factors_by_line(calibration, &calib_straight_km, params); let detour_of = |station: &Station| -> f64 { detour_by_line .get(&station.line_cd) .copied() - .unwrap_or_else(|| fallback_detour_factor(station.line_type, station.transport_type)) + .unwrap_or_else(|| { + line_detour_override(station.line_cd).unwrap_or_else(|| { + fallback_detour_factor(station.line_type, station.transport_type) + }) + }) }; // 各駅が停車するか。 @@ -468,6 +600,18 @@ pub fn estimate_arrival_minutes( .map(|(i, s)| is_stop(s, i == 0 || i == n - 1)) .collect(); + // 経路スライス内で路線ごとに通過駅があるか。通過駅が一つも無い路線では、 + // 優等種別(急行・特急など)でも実質各駅停車として走る(東急田園都市線の + // 急行が半蔵門線内で各駅停車になる直通など)ため、その路線の区間では + // 種別の速度倍率・種別別の速度較正を適用せず各停(Default)として扱う。 + // 判定は `is_stop` と同じ端点補正込みの `stops_here` を使う(端点は常に + // 停車扱いのため、端点の pass フラグだけでは優等扱いにしない)。 + let mut line_has_pass: HashMap = HashMap::new(); + for (i, s) in stops.iter().enumerate() { + let entry = line_has_pass.entry(s.line_cd).or_insert(false); + *entry = *entry || !stops_here[i]; + } + let line_group_of = |station: &Station| -> Option { station.line_group_cd.or(Some(station.line_cd)) }; @@ -491,7 +635,37 @@ pub fn estimate_arrival_minutes( for i in 1..n { let track_m = straight_km[i] * detour_of(stops[i]) * 1000.0; - let v_kmh = max_speed_kmh(stops[i].line_type, stops[i].kind, stops[i].transport_type); + // この路線に通過駅が無ければ各駅停車として振る舞う(種別倍率なし・ + // Default の速度較正を使用)。 + let effective_kind = if line_has_pass + .get(&stops[i].line_cd) + .copied() + .unwrap_or(false) + { + stops[i].kind + } else { + None + }; + let mut v_kmh = max_speed_kmh( + stops[i].line_cd, + stops[i].line_type, + effective_kind, + stops[i].transport_type, + ); + // 隣接駅ペア単位の較正(GTFS 実ダイヤ由来)があれば路線単位の速度より + // 優先する。急曲線・急勾配で路線平均より遅い区間(大江戸線 月島〜赤羽橋 + // など)の区間差を反映する。各停系種別の鉄道のみ。 + if stops[i].transport_type != TransportType::Bus + && segment_override_applies_to_kind(effective_kind) + { + if let Some(v) = segment_speed_override_kmh( + stops[i].line_cd, + stops[i - 1].station_cd, + stops[i].station_cd, + ) { + v_kmh = v; + } + } let idx = result.len(); result.push(EstimatedStop { @@ -656,9 +830,23 @@ mod tests { detour_factor_for(1.3, 1.0, Some(2), TransportType::Rail, &p), 1.3, ); - // 上限 1.6 でクランプ。 + // 鉄道は RAIL_DETOUR_MAX = 1.35 でクランプ。 approx( detour_factor_for(5.0, 1.0, Some(2), TransportType::Rail, &p), + 1.35, + ); + // detour_min が鉄道上限 1.35 を超える設定でもパニックせず detour_min を採用。 + let wide_min = EstimationParams { + detour_min: 1.4, + ..Default::default() + }; + approx( + detour_factor_for(5.0, 1.0, Some(2), TransportType::Rail, &wide_min), + 1.4, + ); + // バスは params.detour_max = 1.6 のままクランプ。 + approx( + detour_factor_for(5.0, 1.0, Some(3), TransportType::Bus, &p), 1.6, ); // average_distance 無し → 在来線フォールバック 1.30。 @@ -702,7 +890,7 @@ mod tests { // 単調増加。 assert!(est[1].cumulative_minutes > est[0].cumulative_minutes); assert!(est[2].cumulative_minutes > est[1].cumulative_minutes); - // 中間駅で dwell(0.4分)が入るので、2区間目の到着は + // 中間駅で dwell が入るので、2区間目の到着は // 「1区間の所要 × 2 + dwell」付近になる。 let leg = est[1].cumulative_minutes; approx(est[2].cumulative_minutes, leg * 2.0 + p.dwell_minutes); @@ -802,19 +990,22 @@ mod tests { fn speed_profile_splits_within_pass_through_segment() { let p = EstimationParams::default(); - // 始点→通過→終点。通過駅で line_cd が変わる直通区間。 - // どちらも在来線(普通)。 + // 始点→通過→終点。通過駅から line_cd が変わる直通区間。 + // どちらも在来線(普通)。通過駅を line 200 側に置き、優等種別の速度が + // 「通過駅のある路線」で有効になる条件を満たす。 let mut slow = three_collinear_stations(); slow[1].pass = Some(1); - slow[2].line_cd = 200; // 直通で line_cd が変わる + slow[1].line_cd = 200; // 直通で line_cd が変わる + slow[2].line_cd = 200; let slow_refs: Vec<&Station> = slow.iter().collect(); let slow_est = estimate_arrival_minutes(&slow_refs, &p); - // 後半サブ区間(通過→終点)だけ高速種別(kind != 0 → 100km/h)にする。 + // 後半サブ区間(通過→終点)だけ高速種別(特急 → 80×1.2=96km/h)にする。 let mut fast = three_collinear_stations(); fast[1].pass = Some(1); + fast[1].line_cd = 200; fast[2].line_cd = 200; - fast[2].kind = Some(1); // 速達種別 → 後半サブ区間の v_max を上げる + fast[2].kind = Some(TrainTypeKind::LimitedExpress as i32); // 後半サブ区間の v_max を上げる let fast_refs: Vec<&Station> = fast.iter().collect(); let fast_est = estimate_arrival_minutes(&fast_refs, &p); @@ -832,6 +1023,44 @@ mod tests { ); } + #[test] + fn express_kind_without_passes_behaves_like_local() { + // 経路スライス内に通過駅が無い路線では、優等種別でも各駅停車として走る + // (東急田園都市線の急行が半蔵門線内で各駅停車になる直通など)。 + // 種別倍率(特急 ×1.2)を適用してはいけない。 + let p = EstimationParams::default(); + let local = three_collinear_stations(); + let local_refs: Vec<&Station> = local.iter().collect(); + let local_est = estimate_arrival_minutes(&local_refs, &p); + + let mut express = three_collinear_stations(); + for s in express.iter_mut() { + s.kind = Some(TrainTypeKind::LimitedExpress as i32); + } + let express_refs: Vec<&Station> = express.iter().collect(); + let express_est = estimate_arrival_minutes(&express_refs, &p); + + for (e, l) in express_est.iter().zip(local_est.iter()) { + approx(e.cumulative_minutes, l.cumulative_minutes); + } + + // 同じ種別でも通過駅があれば優等として扱われ、種別倍率のぶん速くなる。 + let mut passing = express.clone(); + passing[1].pass = Some(1); + let passing_refs: Vec<&Station> = passing.iter().collect(); + let passing_est = estimate_arrival_minutes(&passing_refs, &p); + let mut local_passing = three_collinear_stations(); + local_passing[1].pass = Some(1); + let lp_refs: Vec<&Station> = local_passing.iter().collect(); + let lp_est = estimate_arrival_minutes(&lp_refs, &p); + assert!( + passing_est[2].cumulative_minutes < lp_est[2].cumulative_minutes, + "passing express {} should be < passing local {}", + passing_est[2].cumulative_minutes, + lp_est[2].cumulative_minutes + ); + } + #[test] fn average_distance_meters_calibrates_detour_instead_of_clamping() { let p = EstimationParams::default(); @@ -896,6 +1125,38 @@ mod tests { } } + #[test] + fn ginza_line_shibuya_to_shimbashi_matches_real_travel_time() { + let p = EstimationParams::default(); + // 東京メトロ銀座線 渋谷→新橋。実座標・実データ値 + // (average_distance = 780.46154m、地下鉄 line_type=3)。 + // 実乗車時間は東京メトロ/乗換案内系の標準所要時間で約13分。 + let data = [ + (2800119, 35.659066, 139.701000), // 渋谷 + (2800118, 35.665247, 139.712314), // 表参道 + (2800117, 35.670527, 139.717857), // 外苑前 + (2800116, 35.672765, 139.724159), // 青山一丁目 + (2800115, 35.677021, 139.737047), // 赤坂見附 + (2800114, 35.673621, 139.741419), // 溜池山王 + (2800113, 35.670236, 139.749832), // 虎ノ門 + (2800112, 35.667434, 139.758432), // 新橋 + ]; + let stations: Vec = data + .iter() + .map(|&(cd, lat, lon)| { + let mut s = station(cd, 28001, lat, lon, Some(780.46154)); + s.line_type = Some(LINE_TYPE_SUBWAY); + s.line_group_cd = Some(28001); + s + }) + .collect(); + let refs: Vec<&Station> = stations.iter().collect(); + let est = estimate_arrival_minutes(&refs, &p); + + let total = est.last().unwrap().cumulative_minutes; + assert!((12.0..14.0).contains(&total), "got {total}"); + } + /// GTFS インポート後のバス停を再現する(line_type=3 は GTFS route_type のバス、 /// kind=7 は TrainTypeKind::BusRoute、average_distance は無し)。 fn bus_station(station_cd: i32, line_cd: i32, lat: f64, lon: f64) -> Station { @@ -1123,5 +1384,260 @@ mod tests { fn empty_input_returns_empty() { let p = EstimationParams::default(); assert!(estimate_arrival_minutes(&[], &p).is_empty()); + assert!(estimate_arrival_minutes_calibrated(&[], &[], &p).is_empty()); + } + + #[test] + fn rapid_and_branch_kinds_run_at_local_speed() { + // 快速(Rapid)・支線(Branch)・通勤快速(CommuterRapid)は各停と同速。 + // 速達性は通過そのもので表現され、速度倍率では表現しない。 + let p = EstimationParams::default(); + let time_with_kind = |kind: Option| -> f64 { + let mut stations = three_collinear_stations(); + for s in stations.iter_mut() { + s.kind = kind; + } + let refs: Vec<&Station> = stations.iter().collect(); + estimate_arrival_minutes(&refs, &p)[2].cumulative_minutes + }; + let local = time_with_kind(None); + approx(time_with_kind(Some(TrainTypeKind::Rapid as i32)), local); + approx(time_with_kind(Some(TrainTypeKind::Branch as i32)), local); + approx( + time_with_kind(Some(TrainTypeKind::CommuterRapid as i32)), + local, + ); + // 急行 < 各停、特急 < 急行、新快速級 < 特急 の順に速い。 + // 優等種別の倍率は「経路内に中間通過駅がある路線」でのみ有効なため、 + // 末尾側に中間通過駅(4駅目)+終点(5駅目)を足した経路の 3 駅目到着で比較する。 + let time_with_kind_passing = |kind: Option| -> f64 { + let mut stations = three_collinear_stations(); + let mut passed = station(4, 100, 35.048, 139.0, None); + passed.pass = Some(1); + stations.push(passed); + stations.push(station(5, 100, 35.064, 139.0, None)); + for s in stations.iter_mut() { + s.kind = kind; + } + let refs: Vec<&Station> = stations.iter().collect(); + estimate_arrival_minutes(&refs, &p)[2].cumulative_minutes + }; + let local = time_with_kind_passing(None); + let express = time_with_kind_passing(Some(TrainTypeKind::Express as i32)); + let limited = time_with_kind_passing(Some(TrainTypeKind::LimitedExpress as i32)); + let high_speed = time_with_kind_passing(Some(TrainTypeKind::HighSpeedRapid as i32)); + assert!( + express < local, + "express {express} should be < local {local}" + ); + assert!( + limited < express, + "limited {limited} should be < express {express}" + ); + assert!( + high_speed < limited, + "high_speed {high_speed} should be < limited {limited}" + ); + } + + #[test] + fn speed_table_override_beats_general_rule() { + // 京急本線(27001)の快特(Express)は較正テーブルの 120km/h が適用され、 + // 一般則(80×1.15=92km/h)の路線より同一区間を速く走る。 + let p = EstimationParams::default(); + let time_on_line = |line_cd: i32| -> f64 { + // 8km 区間(巡航支配)で比較する。0.072 度 ≈ 8km。 + // 優等種別の速度は中間通過駅のある路線でのみ有効なため、後方に + // 中間通過駅(3駅目)+終点(4駅目)を足し、2 駅目(単一サブ区間の + // 停車駅)への到着時間を見る。 + let mut stations = [ + station(1, line_cd, 35.000, 139.0, None), + station(2, line_cd, 35.072, 139.0, None), + station(3, line_cd, 35.080, 139.0, None), + station(4, line_cd, 35.088, 139.0, None), + ]; + stations[2].pass = Some(1); + for s in stations.iter_mut() { + s.kind = Some(TrainTypeKind::Express as i32); + } + let refs: Vec<&Station> = stations.iter().collect(); + estimate_arrival_minutes(&refs, &p)[1].cumulative_minutes + }; + let keikyu = time_on_line(27001); + let generic = time_on_line(100); + assert!( + keikyu < generic, + "keikyu {keikyu} should be < generic {generic}" + ); + // テーブル値 120km/h での運動学モデルと厳密に一致する。 + let straight_m = haversine_distance(35.000, 139.0, 35.072, 139.0); + // average_distance 無し → 在来線フォールバック α=1.30。 + approx(keikyu, segment_run_minutes(straight_m * 1.30, 120.0, &p)); + } + + #[test] + fn pass_penalty_adds_time_per_passed_station() { + let mut p = EstimationParams { + pass_penalty_seconds: 0.0, + ..Default::default() + }; + let mut stations = three_collinear_stations(); + stations[1].pass = Some(1); + let refs: Vec<&Station> = stations.iter().collect(); + let base = estimate_arrival_minutes(&refs, &p)[2].cumulative_minutes; + + p.pass_penalty_seconds = 3.0; + let with_penalty = estimate_arrival_minutes(&refs, &p)[2].cumulative_minutes; + // 通過駅 1 駅ぶんのペナルティ(運転余裕率込み)だけ遅くなる。 + approx(with_penalty, base + 3.0 * p.run_margin / 60.0); + } + + #[test] + fn slice_calibration_uses_full_route_regression() { + // スライス較正バグの回帰: 「都心側は駅間 1km・郊外側は駅間 4km」の路線で + // average_distance(路線全体の平均実駅間距離 ≈ 2km)を持つとき、都心側だけを + // 切り出して較正すると α = 2.0/1.0 → 鉄道上限 1.35 に張り付き、走行距離を + // 35% 過大評価してしまう。経路全体を較正母数に渡せば α ≈ 1.0 になる。 + let p = EstimationParams::default(); + let avg_dist_m = Some(2000.0); + let mut stations: Vec = Vec::new(); + // 都心側: 1km(緯度 0.009 度)間隔 × 6 駅。 + for i in 0..6 { + stations.push(station( + i + 1, + 100, + 35.0 + 0.009 * i as f64, + 139.0, + avg_dist_m, + )); + } + // 郊外側: 4km(緯度 0.036 度)間隔 × 3 駅。 + let base_lat = 35.0 + 0.009 * 5.0; + for i in 0..3 { + stations.push(station( + 7 + i, + 100, + base_lat + 0.036 * (i + 1) as f64, + 139.0, + avg_dist_m, + )); + } + let full: Vec<&Station> = stations.iter().collect(); + let slice: Vec<&Station> = full[..6].to_vec(); + + let self_calibrated = estimate_arrival_minutes(&slice, &p); + let full_calibrated = estimate_arrival_minutes_calibrated(&slice, &full, &p); + + // スライス単体較正(旧挙動)は α が上限に張り付き大幅に遅い推定になる。 + assert!( + full_calibrated[5].cumulative_minutes < self_calibrated[5].cumulative_minutes * 0.9, + "full {} should be much faster than slice-calibrated {}", + full_calibrated[5].cumulative_minutes, + self_calibrated[5].cumulative_minutes + ); + // 経路全体較正のスライス推定は、経路全体推定の該当区間と一致する。 + let full_est = estimate_arrival_minutes(&full, &p); + approx( + full_calibrated[5].cumulative_minutes, + full_est[5].cumulative_minutes, + ); + } + + /// 西武池袋線 準急(kind=Express)の実ダイヤ較正回帰テスト。 + /// + /// 迂回係数の実測較正(`LINE_DETOUR_OVERRIDES`)の回帰: 西武池袋線は都心側 + /// 1〜2km・山間側 3〜5km と駅間隔の区間差が大きく、準急の経路(池袋→飯能)を + /// 較正母数にすると `α = 2041m / 1645m = 1.24` と実測(営業キロ比 1.06)を + /// 大きく超え、全区間の所要時間を 10〜17% 過大評価していた + /// (実車では表示 ETA より約 1 分早く到着する)。 + /// + /// 期待値は平日日中の準急 池袋→所沢の実時刻表から、石神井公園での + /// 待避停車ぶんを除いた純走行ベースで取っている。 + #[test] + fn seibu_ikebukuro_semi_express_matches_real_travel_time() { + let p = EstimationParams::default(); + // 池袋→飯能(準急の経路全体)。pass=1 は通過駅。実座標・実データ値 + // (average_distance = 2041.41825m)。 + // (station_cd, lat, lon, pass, 実所要分(池袋発・停車駅のみ)) + let data: &[(i32, f64, f64, i32, Option)] = &[ + (2200101, 35.72913, 139.711461, 0, Some(0.0)), // 池袋 + (2200102, 35.726572, 139.694363, 1, None), // 椎名町 + (2200103, 35.73003, 139.683294, 1, None), // 東長崎 + (2200104, 35.737557, 139.672814, 1, None), // 江古田 + (2200105, 35.738797, 139.662602, 1, None), // 桜台 + (2200106, 35.737893, 139.654368, 0, Some(6.5)), // 練馬 + (2200107, 35.736767, 139.637456, 1, None), // 中村橋 + (2200108, 35.735867, 139.62969, 1, None), // 富士見台 + (2200109, 35.740622, 139.616749, 1, None), // 練馬高野台 + (2200110, 35.743563, 139.606981, 0, Some(10.5)), // 石神井公園 + (2200111, 35.749406, 139.586732, 0, Some(13.0)), // 大泉学園 + (2200112, 35.748222, 139.567753, 0, Some(15.5)), // 保谷 + (2200113, 35.751485, 139.545852, 0, Some(18.5)), // ひばりヶ丘 + (2200114, 35.760445, 139.533739, 0, Some(20.5)), // 東久留米 + (2200115, 35.772221, 139.519917, 0, Some(23.0)), // 清瀬 + (2200116, 35.778614, 139.496539, 0, Some(25.5)), // 秋津 + (2200131, 35.786627, 139.473324, 0, Some(28.5)), // 所沢 + (2200117, 35.789303, 139.455959, 0, None), // 西所沢 + (2200118, 35.800535, 139.438016, 0, None), // 小手指 + (2200119, 35.810445, 139.416975, 0, None), // 狭山ヶ丘 + (2200120, 35.820963, 139.412736, 0, None), // 武蔵藤沢 + (2200121, 35.845112, 139.39842, 0, None), // 稲荷山公園 + (2200122, 35.842904, 139.390294, 0, None), // 入間市 + (2200123, 35.83769, 139.360115, 0, None), // 仏子 + (2200124, 35.84058, 139.345316, 0, None), // 元加治 + (2200125, 35.851189, 139.318824, 0, None), // 飯能 + ]; + let stations: Vec = data + .iter() + .map(|&(cd, lat, lon, pass, _)| { + let mut s = station(cd, 22001, lat, lon, Some(2041.41825)); + s.kind = Some(TrainTypeKind::Express as i32); + if pass == 1 { + s.pass = Some(1); + } + s + }) + .collect(); + // 本番同様、所沢までの乗車区間を切り出し、較正母数には経路全体を渡す。 + let full: Vec<&Station> = stations.iter().collect(); + let slice: Vec<&Station> = full[..17].to_vec(); + let est = estimate_arrival_minutes_calibrated(&slice, &full, &p); + + for (e, d) in est.iter().zip(data.iter()) { + let Some(real) = d.4 else { continue }; + assert!( + (e.cumulative_minutes - real).abs() < 1.5, + "station_cd {}: est {} vs real {}", + d.0, + e.cumulative_minutes, + real + ); + } + } + + #[test] + fn line_detour_override_lookup() { + // 西武池袋線は実測値 1.06。 + assert_eq!(line_detour_override(22001), Some(1.06)); + // 未較正の路線はエントリ無し。 + assert_eq!(line_detour_override(11302), None); + } + + #[test] + fn line_detour_override_beats_average_distance_calibration() { + let p = EstimationParams::default(); + // 西武池袋線 石神井公園→大泉学園 相当の 2 駅。average_distance(2041m)を + // 直線平均(約 2.0km)で割る較正では α ≈ 1.0 だが、実測テーブルの 1.06 が + // 優先される。 + let a = station(1, 22001, 35.743563, 139.606981, Some(2041.41825)); + let b = station(2, 22001, 35.749406, 139.586732, Some(2041.41825)); + let stations = [a, b]; + let refs: Vec<&Station> = stations.iter().collect(); + let est = estimate_arrival_minutes(&refs, &p); + + let straight_m = haversine_distance(35.743563, 139.606981, 35.749406, 139.586732); + // 在来線・kind=None → 80km/h。みなし走行距離は直線 × 1.06。 + let expected = segment_run_minutes(straight_m * 1.06, 80.0, &p); + approx(est[1].cumulative_minutes, expected); } } diff --git a/stationapi/src/domain/repository/gtfs_repository.rs b/stationapi/src/domain/repository/gtfs_repository.rs index 2db10f59..02c69757 100644 --- a/stationapi/src/domain/repository/gtfs_repository.rs +++ b/stationapi/src/domain/repository/gtfs_repository.rs @@ -1,100 +1,100 @@ -use async_trait::async_trait; - -use crate::domain::{ - entity::gtfs::{ - GtfsAgency, GtfsCalendar, GtfsCalendarDate, GtfsFeedInfo, GtfsRoute, GtfsShapePoint, - GtfsStop, GtfsStopTime, GtfsTrip, - }, - error::DomainError, -}; - -/// Repository trait for GTFS Agency operations -#[async_trait] -pub trait GtfsAgencyRepository: Send + Sync { - async fn find_by_id(&self, agency_id: &str) -> Result, DomainError>; - async fn get_all(&self) -> Result, DomainError>; - async fn get_by_company_cd(&self, company_cd: i32) -> Result, DomainError>; -} - -/// Repository trait for GTFS Route operations -#[async_trait] -pub trait GtfsRouteRepository: Send + Sync { - async fn find_by_id(&self, route_id: &str) -> Result, DomainError>; - async fn get_by_agency_id(&self, agency_id: &str) -> Result, DomainError>; - async fn get_by_line_cd(&self, line_cd: i32) -> Result, DomainError>; - async fn search_by_name( - &self, - name: &str, - limit: Option, - ) -> Result, DomainError>; -} - -/// Repository trait for GTFS Stop operations -#[async_trait] -pub trait GtfsStopRepository: Send + Sync { - async fn find_by_id(&self, stop_id: &str) -> Result, DomainError>; - async fn get_by_station_cd(&self, station_cd: i32) -> Result, DomainError>; - async fn get_by_coordinates( - &self, - latitude: f64, - longitude: f64, - limit: Option, - ) -> Result, DomainError>; - async fn search_by_name( - &self, - name: &str, - limit: Option, - ) -> Result, DomainError>; - async fn get_by_route_id(&self, route_id: &str) -> Result, DomainError>; -} - -/// Repository trait for GTFS Calendar operations -#[async_trait] -pub trait GtfsCalendarRepository: Send + Sync { - async fn find_by_id(&self, service_id: &str) -> Result, DomainError>; - async fn get_active_on_date(&self, date: &str) -> Result, DomainError>; -} - -/// Repository trait for GTFS Calendar Date operations -#[async_trait] -pub trait GtfsCalendarDateRepository: Send + Sync { - async fn get_by_service_id( - &self, - service_id: &str, - ) -> Result, DomainError>; - async fn get_by_date(&self, date: &str) -> Result, DomainError>; -} - -/// Repository trait for GTFS Trip operations -#[async_trait] -pub trait GtfsTripRepository: Send + Sync { - async fn find_by_id(&self, trip_id: &str) -> Result, DomainError>; - async fn get_by_route_id(&self, route_id: &str) -> Result, DomainError>; - async fn get_by_service_id(&self, service_id: &str) -> Result, DomainError>; -} - -/// Repository trait for GTFS Stop Time operations -#[async_trait] -pub trait GtfsStopTimeRepository: Send + Sync { - async fn get_by_trip_id(&self, trip_id: &str) -> Result, DomainError>; - async fn get_by_stop_id(&self, stop_id: &str) -> Result, DomainError>; - async fn get_departures_at_stop( - &self, - stop_id: &str, - from_time: &str, - limit: Option, - ) -> Result, DomainError>; -} - -/// Repository trait for GTFS Shape operations -#[async_trait] -pub trait GtfsShapeRepository: Send + Sync { - async fn get_by_shape_id(&self, shape_id: &str) -> Result, DomainError>; -} - -/// Repository trait for GTFS Feed Info operations -#[async_trait] -pub trait GtfsFeedInfoRepository: Send + Sync { - async fn get_latest(&self) -> Result, DomainError>; - async fn get_all(&self) -> Result, DomainError>; -} +use async_trait::async_trait; + +use crate::domain::{ + entity::gtfs::{ + GtfsAgency, GtfsCalendar, GtfsCalendarDate, GtfsFeedInfo, GtfsRoute, GtfsShapePoint, + GtfsStop, GtfsStopTime, GtfsTrip, + }, + error::DomainError, +}; + +/// Repository trait for GTFS Agency operations +#[async_trait] +pub trait GtfsAgencyRepository: Send + Sync { + async fn find_by_id(&self, agency_id: &str) -> Result, DomainError>; + async fn get_all(&self) -> Result, DomainError>; + async fn get_by_company_cd(&self, company_cd: i32) -> Result, DomainError>; +} + +/// Repository trait for GTFS Route operations +#[async_trait] +pub trait GtfsRouteRepository: Send + Sync { + async fn find_by_id(&self, route_id: &str) -> Result, DomainError>; + async fn get_by_agency_id(&self, agency_id: &str) -> Result, DomainError>; + async fn get_by_line_cd(&self, line_cd: i32) -> Result, DomainError>; + async fn search_by_name( + &self, + name: &str, + limit: Option, + ) -> Result, DomainError>; +} + +/// Repository trait for GTFS Stop operations +#[async_trait] +pub trait GtfsStopRepository: Send + Sync { + async fn find_by_id(&self, stop_id: &str) -> Result, DomainError>; + async fn get_by_station_cd(&self, station_cd: i32) -> Result, DomainError>; + async fn get_by_coordinates( + &self, + latitude: f64, + longitude: f64, + limit: Option, + ) -> Result, DomainError>; + async fn search_by_name( + &self, + name: &str, + limit: Option, + ) -> Result, DomainError>; + async fn get_by_route_id(&self, route_id: &str) -> Result, DomainError>; +} + +/// Repository trait for GTFS Calendar operations +#[async_trait] +pub trait GtfsCalendarRepository: Send + Sync { + async fn find_by_id(&self, service_id: &str) -> Result, DomainError>; + async fn get_active_on_date(&self, date: &str) -> Result, DomainError>; +} + +/// Repository trait for GTFS Calendar Date operations +#[async_trait] +pub trait GtfsCalendarDateRepository: Send + Sync { + async fn get_by_service_id( + &self, + service_id: &str, + ) -> Result, DomainError>; + async fn get_by_date(&self, date: &str) -> Result, DomainError>; +} + +/// Repository trait for GTFS Trip operations +#[async_trait] +pub trait GtfsTripRepository: Send + Sync { + async fn find_by_id(&self, trip_id: &str) -> Result, DomainError>; + async fn get_by_route_id(&self, route_id: &str) -> Result, DomainError>; + async fn get_by_service_id(&self, service_id: &str) -> Result, DomainError>; +} + +/// Repository trait for GTFS Stop Time operations +#[async_trait] +pub trait GtfsStopTimeRepository: Send + Sync { + async fn get_by_trip_id(&self, trip_id: &str) -> Result, DomainError>; + async fn get_by_stop_id(&self, stop_id: &str) -> Result, DomainError>; + async fn get_departures_at_stop( + &self, + stop_id: &str, + from_time: &str, + limit: Option, + ) -> Result, DomainError>; +} + +/// Repository trait for GTFS Shape operations +#[async_trait] +pub trait GtfsShapeRepository: Send + Sync { + async fn get_by_shape_id(&self, shape_id: &str) -> Result, DomainError>; +} + +/// Repository trait for GTFS Feed Info operations +#[async_trait] +pub trait GtfsFeedInfoRepository: Send + Sync { + async fn get_latest(&self) -> Result, DomainError>; + async fn get_all(&self) -> Result, DomainError>; +} diff --git a/stationapi/src/domain/repository/station_repository.rs b/stationapi/src/domain/repository/station_repository.rs index f0b64bcd..f9dfee05 100644 --- a/stationapi/src/domain/repository/station_repository.rs +++ b/stationapi/src/domain/repository/station_repository.rs @@ -1,559 +1,559 @@ -use async_trait::async_trait; - -use crate::domain::{ - entity::{gtfs::TransportType, station::Station}, - error::DomainError, -}; - -#[async_trait] -pub trait StationRepository: Send + Sync + 'static { - async fn find_by_id(&self, id: u32) -> Result, DomainError>; - async fn get_by_id_vec(&self, ids: &[u32]) -> Result, DomainError>; - async fn get_by_line_id( - &self, - line_id: u32, - station_id: Option, - direction_id: Option, - ) -> Result, DomainError>; - async fn get_by_line_id_vec(&self, line_ids: &[u32]) -> Result, DomainError>; - async fn get_by_line_id_vec_with_group_stations( - &self, - line_ids: &[u32], - ) -> Result, DomainError>; - async fn get_by_station_group_id( - &self, - station_group_id: u32, - ) -> Result, DomainError>; - async fn get_by_station_group_id_vec( - &self, - station_group_id_vec: &[u32], - ) -> Result, DomainError>; - async fn get_by_station_group_id_vec_no_types( - &self, - station_group_id_vec: &[u32], - ) -> Result, DomainError>; - async fn get_by_coordinates( - &self, - latitude: f64, - longitude: f64, - limit: Option, - transport_type: Option, - ) -> Result, DomainError>; - async fn get_by_name( - &self, - station_name: String, - limit: Option, - from_station_group_id: Option, - transport_type: Option, - ) -> Result, DomainError>; - async fn get_by_line_group_id(&self, line_group_id: u32) -> Result, DomainError>; - async fn get_by_line_group_id_vec( - &self, - line_group_ids: &[u32], - ) -> Result, DomainError>; - async fn get_bus_stops_near_stations( - &self, - coords: &[(u32, f64, f64)], // (station_g_cd, lat, lon) - limit_per_station: u32, - ) -> Result, DomainError>; - async fn get_route_stops( - &self, - from_station_id: u32, - to_station_id: u32, - via_line_ids: &[u32], - ) -> Result, DomainError>; - async fn get_route_stops_by_station_cd( - &self, - from_station_cd: u32, - to_station_cd: u32, - via_line_ids: &[u32], - direction_id: Option, - ) -> Result, DomainError>; -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::proto::StopCondition; - use std::collections::HashMap; - - // モック実装 - pub struct MockStationRepository { - stations: HashMap, - } - - impl MockStationRepository { - pub fn new() -> Self { - let mut stations = HashMap::new(); - - // テストデータを作成 - let station1 = create_test_station(1, "東京駅", 1001, 35.681236, 139.767125); - let station2 = create_test_station(2, "新宿駅", 1002, 35.690921, 139.700258); - let station3 = create_test_station(3, "渋谷駅", 1003, 35.659518, 139.700464); - let station4 = create_test_station(4, "品川駅", 1001, 35.630152, 139.740570); - - stations.insert(1, station1); - stations.insert(2, station2); - stations.insert(3, station3); - stations.insert(4, station4); - - Self { stations } - } - } - - #[async_trait] - impl StationRepository for MockStationRepository { - async fn find_by_id(&self, id: u32) -> Result, DomainError> { - Ok(self.stations.get(&id).cloned()) - } - - async fn get_by_id_vec(&self, ids: &[u32]) -> Result, DomainError> { - let mut result = Vec::new(); - for id in ids { - if let Some(station) = self.stations.get(id) { - result.push(station.clone()); - } - } - Ok(result) - } - - async fn get_by_line_id( - &self, - line_id: u32, - _station_id: Option, - _direction_id: Option, - ) -> Result, DomainError> { - let result: Vec = self - .stations - .values() - .filter(|station| station.line_cd == line_id as i32) - .cloned() - .collect(); - Ok(result) - } - - async fn get_by_line_id_vec(&self, line_ids: &[u32]) -> Result, DomainError> { - let result: Vec = self - .stations - .values() - .filter(|station| line_ids.contains(&(station.line_cd as u32))) - .cloned() - .collect(); - Ok(result) - } - - async fn get_by_line_id_vec_with_group_stations( - &self, - line_ids: &[u32], - ) -> Result, DomainError> { - let group_ids: Vec = self - .stations - .values() - .filter(|s| line_ids.contains(&(s.line_cd as u32))) - .map(|s| s.station_g_cd) - .collect(); - let result: Vec = self - .stations - .values() - .filter(|s| group_ids.contains(&s.station_g_cd)) - .cloned() - .collect(); - Ok(result) - } - - async fn get_by_station_group_id( - &self, - station_group_id: u32, - ) -> Result, DomainError> { - let result: Vec = self - .stations - .values() - .filter(|station| station.station_g_cd == station_group_id as i32) - .cloned() - .collect(); - Ok(result) - } - - async fn get_by_station_group_id_vec( - &self, - station_group_id_vec: &[u32], - ) -> Result, DomainError> { - let result: Vec = self - .stations - .values() - .filter(|station| station_group_id_vec.contains(&(station.station_g_cd as u32))) - .cloned() - .collect(); - Ok(result) - } - - async fn get_by_station_group_id_vec_no_types( - &self, - station_group_id_vec: &[u32], - ) -> Result, DomainError> { - self.get_by_station_group_id_vec(station_group_id_vec).await - } - - async fn get_by_coordinates( - &self, - latitude: f64, - longitude: f64, - limit: Option, - transport_type: Option, - ) -> Result, DomainError> { - let mut result: Vec = self - .stations - .values() - .filter(|station| { - transport_type - .as_ref() - .is_none_or(|tt| station.transport_type == *tt) - }) - .map(|station| { - let mut s = station.clone(); - let distance = ((station.lat - latitude).powi(2) - + (station.lon - longitude).powi(2)) - .sqrt(); - s.distance = Some(distance); - s - }) - .collect(); - - // 距離でソート - result.sort_by(|a, b| a.distance.partial_cmp(&b.distance).unwrap()); - - // 制限があれば適用 - if let Some(limit) = limit { - result.truncate(limit as usize); - } - - Ok(result) - } - - async fn get_bus_stops_near_stations( - &self, - coords: &[(u32, f64, f64)], - limit_per_station: u32, - ) -> Result, DomainError> { - let mut result = Vec::new(); - for &(source_g_cd, lat, lon) in coords { - let stops = self - .get_by_coordinates(lat, lon, Some(limit_per_station), Some(TransportType::Bus)) - .await?; - for stop in stops { - result.push((source_g_cd, stop)); - } - } - Ok(result) - } - - async fn get_by_name( - &self, - station_name: String, - limit: Option, - _from_station_group_id: Option, - transport_type: Option, - ) -> Result, DomainError> { - let mut result: Vec = self - .stations - .values() - .filter(|station| { - station.station_name.contains(&station_name) - && transport_type - .as_ref() - .is_none_or(|tt| station.transport_type == *tt) - }) - .cloned() - .collect(); - - if let Some(limit) = limit { - result.truncate(limit as usize); - } - - Ok(result) - } - - async fn get_by_line_group_id( - &self, - line_group_id: u32, - ) -> Result, DomainError> { - let result: Vec = self - .stations - .values() - .filter(|station| station.line_group_cd == Some(line_group_id as i32)) - .cloned() - .collect(); - Ok(result) - } - - async fn get_by_line_group_id_vec( - &self, - line_group_ids: &[u32], - ) -> Result, DomainError> { - let result: Vec = self - .stations - .values() - .filter(|station| { - station - .line_group_cd - .map(|v| line_group_ids.contains(&(v as u32))) - .unwrap_or(false) - }) - .cloned() - .collect(); - Ok(result) - } - - async fn get_route_stops( - &self, - from_station_id: u32, - to_station_id: u32, - via_line_ids: &[u32], - ) -> Result, DomainError> { - let mut result = Vec::new(); - - let from_station = self.stations.get(&from_station_id); - let to_station = self.stations.get(&to_station_id); - - if !via_line_ids.is_empty() { - let line_match = |s: &Station| via_line_ids.contains(&(s.line_cd as u32)); - if !from_station.is_some_and(line_match) || !to_station.is_some_and(line_match) { - return Ok(result); - } - } - - if let Some(from_station) = from_station { - result.push(from_station.clone()); - } - - if let Some(to_station) = to_station { - if from_station_id != to_station_id { - result.push(to_station.clone()); - } - } - - Ok(result) - } - - async fn get_route_stops_by_station_cd( - &self, - from_station_cd: u32, - to_station_cd: u32, - via_line_ids: &[u32], - _direction_id: Option, - ) -> Result, DomainError> { - self.get_route_stops(from_station_cd, to_station_cd, via_line_ids) - .await - } - } - - // テスト用のStation作成ヘルパー関数 - fn create_test_station( - station_cd: i32, - station_name: &str, - line_cd: i32, - lat: f64, - lon: f64, - ) -> Station { - Station::new( - station_cd, - station_cd, // station_g_cd - station_name.to_string(), - format!("{station_name}_k"), - Some(format!("{station_name}_r")), - Some(format!("{station_name}_zh")), - Some(format!("{station_name}_ko")), - vec![], - None, - None, - None, - None, - None, - line_cd, - None, - vec![], - 13, // 東京都 - "100-0000".to_string(), - "東京都".to_string(), - lon, - lat, - "20000101".to_string(), - "99991231".to_string(), - 0, - 0, - StopCondition::All, - None, - false, - None, - Some(1), - Some("山手線".to_string()), - Some("やまのてせん".to_string()), - Some("Yamanote Line".to_string()), - Some("Yamanote Line".to_string()), - Some("山手线".to_string()), - Some("야마노테선".to_string()), - Some("#00AC9A".to_string()), - Some(1), - Some("JY".to_string()), - None, - None, - None, - Some("#00AC9A".to_string()), - None, - None, - None, - Some("circle".to_string()), - None, - None, - None, - Some(1000), - Some(5.5), - Some(0), - Some(1), - Some(1), - Some(1), - Some("普通".to_string()), - Some("ふつう".to_string()), - Some("Local".to_string()), - Some("普通".to_string()), - Some("보통".to_string()), - Some("#000000".to_string()), - Some(0), - Some(1), - TransportType::Rail, - ) - } - - #[tokio::test] - async fn test_find_by_id_existing() { - let repo = MockStationRepository::new(); - let result = repo.find_by_id(1).await.unwrap(); - assert!(result.is_some()); - let station = result.unwrap(); - assert_eq!(station.station_cd, 1); - assert_eq!(station.station_name, "東京駅"); - } - - #[tokio::test] - async fn test_find_by_id_not_found() { - let repo = MockStationRepository::new(); - let result = repo.find_by_id(999).await.unwrap(); - assert!(result.is_none()); - } - - #[tokio::test] - async fn test_get_by_id_vec() { - let repo = MockStationRepository::new(); - let ids = vec![1, 3, 999]; // 999は存在しない - let result = repo.get_by_id_vec(&ids).await.unwrap(); - assert_eq!(result.len(), 2); - assert!(result.iter().any(|s| s.station_cd == 1)); - assert!(result.iter().any(|s| s.station_cd == 3)); - } - - #[tokio::test] - async fn test_get_by_line_id() { - let repo = MockStationRepository::new(); - let result = repo.get_by_line_id(1001, None, None).await.unwrap(); - assert_eq!(result.len(), 2); // 東京駅と品川駅 - assert!(result.iter().all(|s| s.line_cd == 1001)); - } - - #[tokio::test] - async fn test_get_by_station_group_id() { - let repo = MockStationRepository::new(); - let result = repo.get_by_station_group_id(1).await.unwrap(); - assert_eq!(result.len(), 1); - assert_eq!(result[0].station_cd, 1); - } - - #[tokio::test] - async fn test_get_by_station_group_id_vec() { - let repo = MockStationRepository::new(); - let group_ids = vec![1, 2]; - let result = repo.get_by_station_group_id_vec(&group_ids).await.unwrap(); - assert_eq!(result.len(), 2); - } - - #[tokio::test] - async fn test_get_by_coordinates() { - let repo = MockStationRepository::new(); - // 東京駅付近の座標 - let result = repo - .get_by_coordinates(35.681236, 139.767125, Some(2), None) - .await - .unwrap(); - assert!(result.len() <= 2); - assert!(result[0].distance.is_some()); - } - - #[tokio::test] - async fn test_get_by_name() { - let repo = MockStationRepository::new(); - let result = repo - .get_by_name("東京".to_string(), None, None, None) - .await - .unwrap(); - assert_eq!(result.len(), 1); - assert_eq!(result[0].station_name, "東京駅"); - } - - #[tokio::test] - async fn test_get_by_name_with_limit() { - let repo = MockStationRepository::new(); - let result = repo - .get_by_name("駅".to_string(), Some(2), None, None) - .await - .unwrap(); - assert!(result.len() <= 2); - } - - #[tokio::test] - async fn test_get_by_line_group_id() { - let repo = MockStationRepository::new(); - let result = repo.get_by_line_group_id(1000).await.unwrap(); - assert_eq!(result.len(), 4); // すべての駅がline_group_cd = 1000に設定されている - } - - #[tokio::test] - async fn test_get_route_stops() { - let repo = MockStationRepository::new(); - let result = repo.get_route_stops(1, 2, &[]).await.unwrap(); - assert_eq!(result.len(), 2); - assert_eq!(result[0].station_cd, 1); - assert_eq!(result[1].station_cd, 2); - } - - #[tokio::test] - async fn test_get_route_stops_same_station() { - let repo = MockStationRepository::new(); - let result = repo.get_route_stops(1, 1, &[]).await.unwrap(); - assert_eq!(result.len(), 1); - assert_eq!(result[0].station_cd, 1); - } - - #[tokio::test] - async fn test_get_route_stops_not_found() { - let repo = MockStationRepository::new(); - let result = repo.get_route_stops(999, 1000, &[]).await.unwrap(); - assert_eq!(result.len(), 0); - } - - #[tokio::test] - async fn test_get_route_stops_with_via_line_ids_match() { - let repo = MockStationRepository::new(); - // 東京駅(1) と 品川駅(4) は line_cd=1001 で一致する - let result = repo.get_route_stops(1, 4, &[1001]).await.unwrap(); - assert_eq!(result.len(), 2); - assert_eq!(result[0].station_cd, 1); - assert_eq!(result[1].station_cd, 4); - } - - #[tokio::test] - async fn test_get_route_stops_with_via_line_ids_mismatch() { - let repo = MockStationRepository::new(); - // line_cd が一致しないためルートは返さない - let result = repo.get_route_stops(1, 2, &[1001]).await.unwrap(); - assert!(result.is_empty()); - } -} +use async_trait::async_trait; + +use crate::domain::{ + entity::{gtfs::TransportType, station::Station}, + error::DomainError, +}; + +#[async_trait] +pub trait StationRepository: Send + Sync + 'static { + async fn find_by_id(&self, id: u32) -> Result, DomainError>; + async fn get_by_id_vec(&self, ids: &[u32]) -> Result, DomainError>; + async fn get_by_line_id( + &self, + line_id: u32, + station_id: Option, + direction_id: Option, + ) -> Result, DomainError>; + async fn get_by_line_id_vec(&self, line_ids: &[u32]) -> Result, DomainError>; + async fn get_by_line_id_vec_with_group_stations( + &self, + line_ids: &[u32], + ) -> Result, DomainError>; + async fn get_by_station_group_id( + &self, + station_group_id: u32, + ) -> Result, DomainError>; + async fn get_by_station_group_id_vec( + &self, + station_group_id_vec: &[u32], + ) -> Result, DomainError>; + async fn get_by_station_group_id_vec_no_types( + &self, + station_group_id_vec: &[u32], + ) -> Result, DomainError>; + async fn get_by_coordinates( + &self, + latitude: f64, + longitude: f64, + limit: Option, + transport_type: Option, + ) -> Result, DomainError>; + async fn get_by_name( + &self, + station_name: String, + limit: Option, + from_station_group_id: Option, + transport_type: Option, + ) -> Result, DomainError>; + async fn get_by_line_group_id(&self, line_group_id: u32) -> Result, DomainError>; + async fn get_by_line_group_id_vec( + &self, + line_group_ids: &[u32], + ) -> Result, DomainError>; + async fn get_bus_stops_near_stations( + &self, + coords: &[(u32, f64, f64)], // (station_g_cd, lat, lon) + limit_per_station: u32, + ) -> Result, DomainError>; + async fn get_route_stops( + &self, + from_station_id: u32, + to_station_id: u32, + via_line_ids: &[u32], + ) -> Result, DomainError>; + async fn get_route_stops_by_station_cd( + &self, + from_station_cd: u32, + to_station_cd: u32, + via_line_ids: &[u32], + direction_id: Option, + ) -> Result, DomainError>; +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::proto::StopCondition; + use std::collections::HashMap; + + // モック実装 + pub struct MockStationRepository { + stations: HashMap, + } + + impl MockStationRepository { + pub fn new() -> Self { + let mut stations = HashMap::new(); + + // テストデータを作成 + let station1 = create_test_station(1, "東京駅", 1001, 35.681236, 139.767125); + let station2 = create_test_station(2, "新宿駅", 1002, 35.690921, 139.700258); + let station3 = create_test_station(3, "渋谷駅", 1003, 35.659518, 139.700464); + let station4 = create_test_station(4, "品川駅", 1001, 35.630152, 139.740570); + + stations.insert(1, station1); + stations.insert(2, station2); + stations.insert(3, station3); + stations.insert(4, station4); + + Self { stations } + } + } + + #[async_trait] + impl StationRepository for MockStationRepository { + async fn find_by_id(&self, id: u32) -> Result, DomainError> { + Ok(self.stations.get(&id).cloned()) + } + + async fn get_by_id_vec(&self, ids: &[u32]) -> Result, DomainError> { + let mut result = Vec::new(); + for id in ids { + if let Some(station) = self.stations.get(id) { + result.push(station.clone()); + } + } + Ok(result) + } + + async fn get_by_line_id( + &self, + line_id: u32, + _station_id: Option, + _direction_id: Option, + ) -> Result, DomainError> { + let result: Vec = self + .stations + .values() + .filter(|station| station.line_cd == line_id as i32) + .cloned() + .collect(); + Ok(result) + } + + async fn get_by_line_id_vec(&self, line_ids: &[u32]) -> Result, DomainError> { + let result: Vec = self + .stations + .values() + .filter(|station| line_ids.contains(&(station.line_cd as u32))) + .cloned() + .collect(); + Ok(result) + } + + async fn get_by_line_id_vec_with_group_stations( + &self, + line_ids: &[u32], + ) -> Result, DomainError> { + let group_ids: Vec = self + .stations + .values() + .filter(|s| line_ids.contains(&(s.line_cd as u32))) + .map(|s| s.station_g_cd) + .collect(); + let result: Vec = self + .stations + .values() + .filter(|s| group_ids.contains(&s.station_g_cd)) + .cloned() + .collect(); + Ok(result) + } + + async fn get_by_station_group_id( + &self, + station_group_id: u32, + ) -> Result, DomainError> { + let result: Vec = self + .stations + .values() + .filter(|station| station.station_g_cd == station_group_id as i32) + .cloned() + .collect(); + Ok(result) + } + + async fn get_by_station_group_id_vec( + &self, + station_group_id_vec: &[u32], + ) -> Result, DomainError> { + let result: Vec = self + .stations + .values() + .filter(|station| station_group_id_vec.contains(&(station.station_g_cd as u32))) + .cloned() + .collect(); + Ok(result) + } + + async fn get_by_station_group_id_vec_no_types( + &self, + station_group_id_vec: &[u32], + ) -> Result, DomainError> { + self.get_by_station_group_id_vec(station_group_id_vec).await + } + + async fn get_by_coordinates( + &self, + latitude: f64, + longitude: f64, + limit: Option, + transport_type: Option, + ) -> Result, DomainError> { + let mut result: Vec = self + .stations + .values() + .filter(|station| { + transport_type + .as_ref() + .is_none_or(|tt| station.transport_type == *tt) + }) + .map(|station| { + let mut s = station.clone(); + let distance = ((station.lat - latitude).powi(2) + + (station.lon - longitude).powi(2)) + .sqrt(); + s.distance = Some(distance); + s + }) + .collect(); + + // 距離でソート + result.sort_by(|a, b| a.distance.partial_cmp(&b.distance).unwrap()); + + // 制限があれば適用 + if let Some(limit) = limit { + result.truncate(limit as usize); + } + + Ok(result) + } + + async fn get_bus_stops_near_stations( + &self, + coords: &[(u32, f64, f64)], + limit_per_station: u32, + ) -> Result, DomainError> { + let mut result = Vec::new(); + for &(source_g_cd, lat, lon) in coords { + let stops = self + .get_by_coordinates(lat, lon, Some(limit_per_station), Some(TransportType::Bus)) + .await?; + for stop in stops { + result.push((source_g_cd, stop)); + } + } + Ok(result) + } + + async fn get_by_name( + &self, + station_name: String, + limit: Option, + _from_station_group_id: Option, + transport_type: Option, + ) -> Result, DomainError> { + let mut result: Vec = self + .stations + .values() + .filter(|station| { + station.station_name.contains(&station_name) + && transport_type + .as_ref() + .is_none_or(|tt| station.transport_type == *tt) + }) + .cloned() + .collect(); + + if let Some(limit) = limit { + result.truncate(limit as usize); + } + + Ok(result) + } + + async fn get_by_line_group_id( + &self, + line_group_id: u32, + ) -> Result, DomainError> { + let result: Vec = self + .stations + .values() + .filter(|station| station.line_group_cd == Some(line_group_id as i32)) + .cloned() + .collect(); + Ok(result) + } + + async fn get_by_line_group_id_vec( + &self, + line_group_ids: &[u32], + ) -> Result, DomainError> { + let result: Vec = self + .stations + .values() + .filter(|station| { + station + .line_group_cd + .map(|v| line_group_ids.contains(&(v as u32))) + .unwrap_or(false) + }) + .cloned() + .collect(); + Ok(result) + } + + async fn get_route_stops( + &self, + from_station_id: u32, + to_station_id: u32, + via_line_ids: &[u32], + ) -> Result, DomainError> { + let mut result = Vec::new(); + + let from_station = self.stations.get(&from_station_id); + let to_station = self.stations.get(&to_station_id); + + if !via_line_ids.is_empty() { + let line_match = |s: &Station| via_line_ids.contains(&(s.line_cd as u32)); + if !from_station.is_some_and(line_match) || !to_station.is_some_and(line_match) { + return Ok(result); + } + } + + if let Some(from_station) = from_station { + result.push(from_station.clone()); + } + + if let Some(to_station) = to_station { + if from_station_id != to_station_id { + result.push(to_station.clone()); + } + } + + Ok(result) + } + + async fn get_route_stops_by_station_cd( + &self, + from_station_cd: u32, + to_station_cd: u32, + via_line_ids: &[u32], + _direction_id: Option, + ) -> Result, DomainError> { + self.get_route_stops(from_station_cd, to_station_cd, via_line_ids) + .await + } + } + + // テスト用のStation作成ヘルパー関数 + fn create_test_station( + station_cd: i32, + station_name: &str, + line_cd: i32, + lat: f64, + lon: f64, + ) -> Station { + Station::new( + station_cd, + station_cd, // station_g_cd + station_name.to_string(), + format!("{station_name}_k"), + Some(format!("{station_name}_r")), + Some(format!("{station_name}_zh")), + Some(format!("{station_name}_ko")), + vec![], + None, + None, + None, + None, + None, + line_cd, + None, + vec![], + 13, // 東京都 + "100-0000".to_string(), + "東京都".to_string(), + lon, + lat, + "20000101".to_string(), + "99991231".to_string(), + 0, + 0, + StopCondition::All, + None, + false, + None, + Some(1), + Some("山手線".to_string()), + Some("やまのてせん".to_string()), + Some("Yamanote Line".to_string()), + Some("Yamanote Line".to_string()), + Some("山手线".to_string()), + Some("야마노테선".to_string()), + Some("#00AC9A".to_string()), + Some(1), + Some("JY".to_string()), + None, + None, + None, + Some("#00AC9A".to_string()), + None, + None, + None, + Some("circle".to_string()), + None, + None, + None, + Some(1000), + Some(5.5), + Some(0), + Some(1), + Some(1), + Some(1), + Some("普通".to_string()), + Some("ふつう".to_string()), + Some("Local".to_string()), + Some("普通".to_string()), + Some("보통".to_string()), + Some("#000000".to_string()), + Some(0), + Some(1), + TransportType::Rail, + ) + } + + #[tokio::test] + async fn test_find_by_id_existing() { + let repo = MockStationRepository::new(); + let result = repo.find_by_id(1).await.unwrap(); + assert!(result.is_some()); + let station = result.unwrap(); + assert_eq!(station.station_cd, 1); + assert_eq!(station.station_name, "東京駅"); + } + + #[tokio::test] + async fn test_find_by_id_not_found() { + let repo = MockStationRepository::new(); + let result = repo.find_by_id(999).await.unwrap(); + assert!(result.is_none()); + } + + #[tokio::test] + async fn test_get_by_id_vec() { + let repo = MockStationRepository::new(); + let ids = vec![1, 3, 999]; // 999は存在しない + let result = repo.get_by_id_vec(&ids).await.unwrap(); + assert_eq!(result.len(), 2); + assert!(result.iter().any(|s| s.station_cd == 1)); + assert!(result.iter().any(|s| s.station_cd == 3)); + } + + #[tokio::test] + async fn test_get_by_line_id() { + let repo = MockStationRepository::new(); + let result = repo.get_by_line_id(1001, None, None).await.unwrap(); + assert_eq!(result.len(), 2); // 東京駅と品川駅 + assert!(result.iter().all(|s| s.line_cd == 1001)); + } + + #[tokio::test] + async fn test_get_by_station_group_id() { + let repo = MockStationRepository::new(); + let result = repo.get_by_station_group_id(1).await.unwrap(); + assert_eq!(result.len(), 1); + assert_eq!(result[0].station_cd, 1); + } + + #[tokio::test] + async fn test_get_by_station_group_id_vec() { + let repo = MockStationRepository::new(); + let group_ids = vec![1, 2]; + let result = repo.get_by_station_group_id_vec(&group_ids).await.unwrap(); + assert_eq!(result.len(), 2); + } + + #[tokio::test] + async fn test_get_by_coordinates() { + let repo = MockStationRepository::new(); + // 東京駅付近の座標 + let result = repo + .get_by_coordinates(35.681236, 139.767125, Some(2), None) + .await + .unwrap(); + assert!(result.len() <= 2); + assert!(result[0].distance.is_some()); + } + + #[tokio::test] + async fn test_get_by_name() { + let repo = MockStationRepository::new(); + let result = repo + .get_by_name("東京".to_string(), None, None, None) + .await + .unwrap(); + assert_eq!(result.len(), 1); + assert_eq!(result[0].station_name, "東京駅"); + } + + #[tokio::test] + async fn test_get_by_name_with_limit() { + let repo = MockStationRepository::new(); + let result = repo + .get_by_name("駅".to_string(), Some(2), None, None) + .await + .unwrap(); + assert!(result.len() <= 2); + } + + #[tokio::test] + async fn test_get_by_line_group_id() { + let repo = MockStationRepository::new(); + let result = repo.get_by_line_group_id(1000).await.unwrap(); + assert_eq!(result.len(), 4); // すべての駅がline_group_cd = 1000に設定されている + } + + #[tokio::test] + async fn test_get_route_stops() { + let repo = MockStationRepository::new(); + let result = repo.get_route_stops(1, 2, &[]).await.unwrap(); + assert_eq!(result.len(), 2); + assert_eq!(result[0].station_cd, 1); + assert_eq!(result[1].station_cd, 2); + } + + #[tokio::test] + async fn test_get_route_stops_same_station() { + let repo = MockStationRepository::new(); + let result = repo.get_route_stops(1, 1, &[]).await.unwrap(); + assert_eq!(result.len(), 1); + assert_eq!(result[0].station_cd, 1); + } + + #[tokio::test] + async fn test_get_route_stops_not_found() { + let repo = MockStationRepository::new(); + let result = repo.get_route_stops(999, 1000, &[]).await.unwrap(); + assert_eq!(result.len(), 0); + } + + #[tokio::test] + async fn test_get_route_stops_with_via_line_ids_match() { + let repo = MockStationRepository::new(); + // 東京駅(1) と 品川駅(4) は line_cd=1001 で一致する + let result = repo.get_route_stops(1, 4, &[1001]).await.unwrap(); + assert_eq!(result.len(), 2); + assert_eq!(result[0].station_cd, 1); + assert_eq!(result[1].station_cd, 4); + } + + #[tokio::test] + async fn test_get_route_stops_with_via_line_ids_mismatch() { + let repo = MockStationRepository::new(); + // line_cd が一致しないためルートは返さない + let result = repo.get_route_stops(1, 2, &[1001]).await.unwrap(); + assert!(result.is_empty()); + } +} diff --git a/stationapi/src/domain/segment_speed_table.rs b/stationapi/src/domain/segment_speed_table.rs new file mode 100644 index 00000000..1466f3d0 --- /dev/null +++ b/stationapi/src/domain/segment_speed_table.rs @@ -0,0 +1,883 @@ +//! 隣接駅間ごとの実効速度の較正テーブル(駅間別較正)。 +//! +//! 路線 × 種別単位の較正(`speed_table`)は路線内で一様な実効速度を仮定するが、 +//! 実路線には区間ごとの速度差がある(都営大江戸線の環状部南側 月島〜赤羽橋は +//! 河川横断の急勾配・急曲線で放射部より 2〜3 割遅い、など)。路線一様速度では +//! この残差を原理的に解消できないため、公開 GTFS 時刻表から隣接駅ペア単位で +//! フィットした実効速度をここで上書きする。 +//! +//! 生成は `scripts/compute_speed_table.py --apply`(路線単位テーブルと同時生成)。 +//! 駅間の純走行時間(次駅の到着時刻が別記録されていれば「出発 → 次駅到着」、 +//! 無ければ「出発 → 次駅出発 − モデル停車時分」)を複数本の平均でデクオンタイズし、 +//! `arrival_estimation` の運動学モデルを再現する実効最高速度を二分探索で求め、 +//! 路線単位の較正値から ±5% 以上乖離したペアだけを出力する(乖離が小さい +//! ペアは路線値で十分)。時刻データが無い駅間は路線単位の較正値のままになる。 +//! +//! 適用条件: +//! - 各駅停車と同速の種別(速度倍率 1.0: Default/Branch/Rapid/CommuterRapid)のみ。 +//! 急行・特急(倍率 > 1.0)は待避線前提の速達ダイヤであり、各停の実ダイヤから +//! フィットした駅間速度で引き下げない。 +//! - バスには適用しない(道路交通の駅間時間は GTFS 由来の路線単位較正で扱う)。 + +use crate::proto::TrainTypeKind; + +/// `(line_cd, station_cd_小, station_cd_大, 実効最高速度 km/h)`。 +/// `(line_cd, station_cd_小, station_cd_大)` の昇順にソート済み(二分探索で引く)。 +const SEGMENT_SPEED_OVERRIDES: &[(i32, i32, i32, f64)] = &[ + // --- BEGIN GENERATED (scripts/compute_speed_table.py) --- + // 東京メトロ銀座線 浅草〜田原町: 東京メトロ GTFS 218本 平均1.5分 (路線値 55km/h) + (28001, 2800101, 2800102, 34.0), + // 東京メトロ銀座線 田原町〜稲荷町: 東京メトロ GTFS 218本 平均1.2分 (路線値 55km/h) + (28001, 2800102, 2800103, 74.0), + // 東京メトロ銀座線 稲荷町〜上野: 東京メトロ GTFS 218本 平均1.3分 (路線値 55km/h) + (28001, 2800103, 2800104, 31.0), + // 東京メトロ銀座線 上野〜上野広小路: 東京メトロ GTFS 224本 平均1.4分 (路線値 55km/h) + (28001, 2800104, 2800105, 36.0), + // 東京メトロ銀座線 上野広小路〜末広町: 東京メトロ GTFS 224本 平均1.0分 (路線値 55km/h) + (28001, 2800105, 2800106, 75.0), + // 東京メトロ銀座線 末広町〜神田: 東京メトロ GTFS 224本 平均1.4分 (路線値 55km/h) + (28001, 2800106, 2800107, 105.0), + // 東京メトロ銀座線 神田〜三越前: 東京メトロ GTFS 224本 平均1.2分 (路線値 55km/h) + (28001, 2800107, 2800108, 90.0), + // 東京メトロ銀座線 三越前〜日本橋: 東京メトロ GTFS 224本 平均1.0分 (路線値 55km/h) + (28001, 2800108, 2800109, 77.0), + // 東京メトロ銀座線 日本橋〜京橋: 東京メトロ GTFS 224本 平均1.1分 (路線値 55km/h) + (28001, 2800109, 2800110, 83.0), + // 東京メトロ銀座線 京橋〜銀座: 東京メトロ GTFS 224本 平均1.2分 (路線値 55km/h) + (28001, 2800110, 2800111, 90.0), + // 東京メトロ銀座線 銀座〜新橋: 東京メトロ GTFS 224本 平均1.2分 (路線値 55km/h) + (28001, 2800111, 2800112, 87.0), + // 東京メトロ銀座線 新橋〜虎ノ門: 東京メトロ GTFS 224本 平均1.3分 (路線値 55km/h) + (28001, 2800112, 2800113, 94.0), + // 東京メトロ銀座線 虎ノ門〜溜池山王: 東京メトロ GTFS 224本 平均1.3分 (路線値 55km/h) + (28001, 2800113, 2800114, 95.0), + // 東京メトロ銀座線 溜池山王〜赤坂見附: 東京メトロ GTFS 224本 平均1.0分 (路線値 55km/h) + (28001, 2800114, 2800115, 76.0), + // 東京メトロ銀座線 赤坂見附〜青山一丁目: 東京メトロ GTFS 224本 平均2.2分 (路線値 55km/h) + (28001, 2800115, 2800116, 48.0), + // 東京メトロ銀座線 青山一丁目〜外苑前: 東京メトロ GTFS 224本 平均1.1分 (路線値 55km/h) + (28001, 2800116, 2800117, 81.0), + // 東京メトロ銀座線 外苑前〜表参道: 東京メトロ GTFS 224本 平均1.2分 (路線値 55km/h) + (28001, 2800117, 2800118, 90.0), + // 東京メトロ銀座線 表参道〜渋谷: 東京メトロ GTFS 224本 平均1.6分 (路線値 55km/h) + (28001, 2800118, 2800119, 94.0), + // 東京メトロ丸ノ内線 茗荷谷〜後楽園: 東京メトロ GTFS 149本 平均2.2分 (路線値 65km/h) + (28002, 2800203, 2800204, 74.0), + // 東京メトロ丸ノ内線 後楽園〜本郷三丁目: 東京メトロ GTFS 149本 平均1.2分 (路線値 65km/h) + (28002, 2800204, 2800205, 91.0), + // 東京メトロ丸ノ内線 本郷三丁目〜御茶ノ水: 東京メトロ GTFS 149本 平均1.3分 (路線値 65km/h) + (28002, 2800205, 2800206, 93.0), + // 東京メトロ丸ノ内線 御茶ノ水〜淡路町: 東京メトロ GTFS 149本 平均1.2分 (路線値 65km/h) + (28002, 2800206, 2800207, 87.0), + // 東京メトロ丸ノ内線 淡路町〜大手町: 東京メトロ GTFS 149本 平均1.4分 (路線値 65km/h) + (28002, 2800207, 2800208, 105.0), + // 東京メトロ丸ノ内線 大手町〜東京: 東京メトロ GTFS 149本 平均1.1分 (路線値 65km/h) + (28002, 2800208, 2800209, 79.0), + // 東京メトロ丸ノ内線 東京〜銀座: 東京メトロ GTFS 149本 平均2.2分 (路線値 65km/h) + (28002, 2800209, 2800210, 44.0), + // 東京メトロ丸ノ内線 霞ケ関〜国会議事堂前: 東京メトロ GTFS 149本 平均1.0分 (路線値 65km/h) + (28002, 2800211, 2800212, 76.0), + // 東京メトロ丸ノ内線 国会議事堂前〜赤坂見附: 東京メトロ GTFS 149本 平均1.3分 (路線値 65km/h) + (28002, 2800212, 2800213, 75.0), + // 東京メトロ丸ノ内線 赤坂見附〜四ツ谷: 東京メトロ GTFS 149本 平均2.3分 (路線値 65km/h) + (28002, 2800213, 2800214, 40.0), + // 東京メトロ丸ノ内線 四ツ谷〜四谷三丁目: 東京メトロ GTFS 149本 平均1.4分 (路線値 65km/h) + (28002, 2800214, 2800215, 104.0), + // 東京メトロ丸ノ内線 四谷三丁目〜新宿御苑前: 東京メトロ GTFS 149本 平均1.3分 (路線値 65km/h) + (28002, 2800215, 2800216, 82.0), + // 東京メトロ丸ノ内線 新宿御苑前〜新宿三丁目: 東京メトロ GTFS 149本 平均1.1分 (路線値 65km/h) + (28002, 2800216, 2800217, 81.0), + // 東京メトロ丸ノ内線 新宿〜西新宿: 東京メトロ GTFS 149本 平均1.2分 (路線値 65km/h) + (28002, 2800218, 2800219, 92.0), + // 東京メトロ丸ノ内線 西新宿〜中野坂上: 東京メトロ GTFS 149本 平均1.4分 (路線値 65km/h) + (28002, 2800219, 2800220, 105.0), + // 東京メトロ丸ノ内線 中野坂上〜新中野: 東京メトロ GTFS 149本 平均1.7分 (路線値 65km/h) + (28002, 2800220, 2800221, 83.0), + // 東京メトロ丸ノ内線 新中野〜東高円寺: 東京メトロ GTFS 149本 平均1.4分 (路線値 65km/h) + (28002, 2800221, 2800222, 107.0), + // 東京メトロ丸ノ内線 東高円寺〜新高円寺: 東京メトロ GTFS 149本 平均1.3分 (路線値 65km/h) + (28002, 2800222, 2800223, 99.0), + // 東京メトロ丸ノ内線 南阿佐ケ谷〜荻窪: 東京メトロ GTFS 149本 平均2.0分 (路線値 65km/h) + (28002, 2800224, 2800225, 76.0), + // 東京メトロ日比谷線 北千住〜南千住: 東京メトロ GTFS 177本 平均2.3分 (路線値 50km/h) + (28003, 2800301, 2800302, 68.0), + // 東京メトロ日比谷線 入谷〜上野: 東京メトロ GTFS 184本 平均1.5分 (路線値 50km/h) + (28003, 2800304, 2800305, 109.0), + // 東京メトロ日比谷線 上野〜仲御徒町: 東京メトロ GTFS 184本 平均1.0分 (路線値 50km/h) + (28003, 2800305, 2800306, 76.0), + // 東京メトロ日比谷線 仲御徒町〜秋葉原: 東京メトロ GTFS 184本 平均1.4分 (路線値 50km/h) + (28003, 2800306, 2800307, 100.0), + // 東京メトロ日比谷線 秋葉原〜小伝馬町: 東京メトロ GTFS 184本 平均1.3分 (路線値 50km/h) + (28003, 2800307, 2800308, 96.0), + // 東京メトロ日比谷線 小伝馬町〜人形町: 東京メトロ GTFS 184本 平均1.1分 (路線値 50km/h) + (28003, 2800308, 2800309, 80.0), + // 東京メトロ日比谷線 人形町〜茅場町: 東京メトロ GTFS 184本 平均1.2分 (路線値 50km/h) + (28003, 2800309, 2800310, 90.0), + // 東京メトロ日比谷線 茅場町〜八丁堀: 東京メトロ GTFS 184本 平均1.1分 (路線値 50km/h) + (28003, 2800310, 2800311, 80.0), + // 東京メトロ日比谷線 八丁堀〜築地: 東京メトロ GTFS 184本 平均1.3分 (路線値 50km/h) + (28003, 2800311, 2800312, 95.0), + // 東京メトロ日比谷線 築地〜東銀座: 東京メトロ GTFS 184本 平均1.0分 (路線値 50km/h) + (28003, 2800312, 2800313, 73.0), + // 東京メトロ日比谷線 東銀座〜銀座: 東京メトロ GTFS 184本 平均1.1分 (路線値 50km/h) + (28003, 2800313, 2800314, 35.0), + // 東京メトロ日比谷線 銀座〜日比谷: 東京メトロ GTFS 184本 平均0.9分 (路線値 50km/h) + (28003, 2800314, 2800315, 69.0), + // 東京メトロ日比谷線 日比谷〜霞ケ関: 東京メトロ GTFS 184本 平均1.7分 (路線値 50km/h) + (28003, 2800315, 2800316, 43.0), + // 東京メトロ日比谷線 霞ケ関〜虎ノ門ヒルズ: 東京メトロ GTFS 184本 平均1.2分 (路線値 50km/h) + (28003, 2800316, 2800322, 90.0), + // 東京メトロ日比谷線 神谷町〜六本木: 東京メトロ GTFS 184本 平均1.6分 (路線値 50km/h) + (28003, 2800317, 2800318, 83.0), + // 東京メトロ日比谷線 神谷町〜虎ノ門ヒルズ: 東京メトロ GTFS 184本 平均1.0分 (路線値 50km/h) + (28003, 2800317, 2800322, 77.0), + // 東京メトロ日比谷線 広尾〜恵比寿: 東京メトロ GTFS 184本 平均2.4分 (路線値 50km/h) + (28003, 2800319, 2800320, 45.0), + // 東京メトロ日比谷線 恵比寿〜中目黒: 東京メトロ GTFS 184本 平均2.0分 (路線値 50km/h) + (28003, 2800320, 2800321, 43.0), + // 東京メトロ東西線 中野〜落合: 東京メトロ GTFS 126本 平均2.5分 (路線値 60km/h) + (28004, 2800401, 2800402, 71.0), + // 東京メトロ東西線 落合〜高田馬場: 東京メトロ GTFS 126本 平均2.5分 (路線値 60km/h) + (28004, 2800402, 2800403, 51.0), + // 東京メトロ東西線 早稲田〜神楽坂: 東京メトロ GTFS 126本 平均1.5分 (路線値 60km/h) + (28004, 2800404, 2800405, 95.0), + // 東京メトロ東西線 神楽坂〜飯田橋: 東京メトロ GTFS 126本 平均2.1分 (路線値 60km/h) + (28004, 2800405, 2800406, 41.0), + // 東京メトロ東西線 飯田橋〜九段下: 東京メトロ GTFS 126本 平均1.4分 (路線値 60km/h) + (28004, 2800406, 2800407, 68.0), + // 東京メトロ東西線 九段下〜竹橋: 東京メトロ GTFS 126本 平均1.4分 (路線値 60km/h) + (28004, 2800407, 2800408, 45.0), + // 東京メトロ東西線 竹橋〜大手町: 東京メトロ GTFS 126本 平均1.4分 (路線値 60km/h) + (28004, 2800408, 2800409, 105.0), + // 東京メトロ東西線 大手町〜日本橋: 東京メトロ GTFS 126本 平均1.3分 (路線値 60km/h) + (28004, 2800409, 2800410, 57.0), + // 東京メトロ東西線 日本橋〜茅場町: 東京メトロ GTFS 126本 平均1.1分 (路線値 60km/h) + (28004, 2800410, 2800411, 81.0), + // 東京メトロ東西線 茅場町〜門前仲町: 東京メトロ GTFS 126本 平均2.0分 (路線値 60km/h) + (28004, 2800411, 2800412, 82.0), + // 東京メトロ東西線 門前仲町〜木場: 東京メトロ GTFS 126本 平均1.4分 (路線値 60km/h) + (28004, 2800412, 2800413, 103.0), + // 東京メトロ東西線 木場〜東陽町: 東京メトロ GTFS 126本 平均1.3分 (路線値 60km/h) + (28004, 2800413, 2800414, 99.0), + // 東京メトロ東西線 南砂町〜西葛西: 東京メトロ GTFS 117本 平均2.4分 (路線値 60km/h) + (28004, 2800415, 2800416, 106.0), + // 東京メトロ東西線 西葛西〜葛西: 東京メトロ GTFS 117本 平均1.6分 (路線値 60km/h) + (28004, 2800416, 2800417, 81.0), + // 東京メトロ東西線 葛西〜浦安: 東京メトロ GTFS 117本 平均2.5分 (路線値 60km/h) + (28004, 2800417, 2800418, 66.0), + // 東京メトロ東西線 浦安〜南行徳: 東京メトロ GTFS 117本 平均1.5分 (路線値 60km/h) + (28004, 2800418, 2800419, 107.0), + // 東京メトロ東西線 行徳〜妙典: 東京メトロ GTFS 117本 平均1.6分 (路線値 60km/h) + (28004, 2800420, 2800421, 90.0), + // 東京メトロ東西線 妙典〜原木中山: 東京メトロ GTFS 113本 平均2.1分 (路線値 60km/h) + (28004, 2800421, 2800422, 108.0), + // 東京メトロ東西線 原木中山〜西船橋: 東京メトロ GTFS 113本 平均1.9分 (路線値 60km/h) + (28004, 2800422, 2800423, 84.0), + // 東京メトロ千代田線 北綾瀬〜綾瀬: 東京メトロ GTFS 50本 平均4.2分 (路線値 75km/h) + (28005, 2800501, 2800502, 33.0), + // 東京メトロ千代田線 綾瀬〜北千住: 東京メトロ GTFS 176本 平均3.2分 (路線値 75km/h) + (28005, 2800502, 2800503, 66.0), + // 東京メトロ千代田線 北千住〜町屋: 東京メトロ GTFS 176本 平均2.7分 (路線値 75km/h) + (28005, 2800503, 2800504, 79.0), + // 東京メトロ千代田線 西日暮里〜千駄木: 東京メトロ GTFS 176本 平均1.3分 (路線値 75km/h) + (28005, 2800505, 2800506, 95.0), + // 東京メトロ千代田線 千駄木〜根津: 東京メトロ GTFS 176本 平均1.4分 (路線値 75km/h) + (28005, 2800506, 2800507, 102.0), + // 東京メトロ千代田線 根津〜湯島: 東京メトロ GTFS 176本 平均1.5分 (路線値 75km/h) + (28005, 2800507, 2800508, 111.0), + // 東京メトロ千代田線 湯島〜新御茶ノ水: 東京メトロ GTFS 176本 平均1.6分 (路線値 75km/h) + (28005, 2800508, 2800509, 115.0), + // 東京メトロ千代田線 大手町〜二重橋前: 東京メトロ GTFS 176本 平均1.1分 (路線値 75km/h) + (28005, 2800510, 2800511, 81.0), + // 東京メトロ千代田線 二重橋前〜日比谷: 東京メトロ GTFS 176本 平均1.3分 (路線値 75km/h) + (28005, 2800511, 2800512, 96.0), + // 東京メトロ千代田線 日比谷〜霞ケ関: 東京メトロ GTFS 176本 平均1.2分 (路線値 75km/h) + (28005, 2800512, 2800513, 89.0), + // 東京メトロ千代田線 国会議事堂前〜赤坂: 東京メトロ GTFS 176本 平均1.1分 (路線値 75km/h) + (28005, 2800514, 2800515, 84.0), + // 東京メトロ千代田線 乃木坂〜表参道: 東京メトロ GTFS 176本 平均1.6分 (路線値 75km/h) + (28005, 2800516, 2800517, 119.0), + // 東京メトロ千代田線 表参道〜明治神宮前〈原宿〉: 東京メトロ GTFS 176本 平均1.3分 (路線値 75km/h) + (28005, 2800517, 2800518, 98.0), + // 東京メトロ千代田線 明治神宮前〈原宿〉〜代々木公園: 東京メトロ GTFS 176本 平均1.8分 (路線値 75km/h) + (28005, 2800518, 2800519, 84.0), + // 東京メトロ千代田線 代々木公園〜代々木上原: 東京メトロ GTFS 176本 平均1.3分 (路線値 75km/h) + (28005, 2800519, 2800520, 95.0), + // 東京メトロ有楽町線 和光市〜地下鉄成増: 東京メトロ GTFS 90本 平均2.5分 (路線値 65km/h) + (28006, 2800601, 2800602, 79.0), + // 東京メトロ有楽町線 地下鉄成増〜地下鉄赤塚: 東京メトロ GTFS 90本 平均1.8分 (路線値 65km/h) + (28006, 2800602, 2800603, 76.0), + // 東京メトロ有楽町線 地下鉄赤塚〜平和台: 東京メトロ GTFS 90本 平均2.1分 (路線値 65km/h) + (28006, 2800603, 2800604, 71.0), + // 東京メトロ有楽町線 氷川台〜小竹向原: 東京メトロ GTFS 90本 平均1.6分 (路線値 65km/h) + (28006, 2800605, 2800606, 101.0), + // 東京メトロ有楽町線 小竹向原〜千川: 東京メトロ GTFS 142本 平均1.6分 (路線値 65km/h) + (28006, 2800606, 2800607, 74.0), + // 東京メトロ有楽町線 千川〜要町: 東京メトロ GTFS 142本 平均1.4分 (路線値 65km/h) + (28006, 2800607, 2800608, 103.0), + // 東京メトロ有楽町線 池袋〜東池袋: 東京メトロ GTFS 143本 平均1.7分 (路線値 65km/h) + (28006, 2800609, 2800610, 49.0), + // 東京メトロ有楽町線 東池袋〜護国寺: 東京メトロ GTFS 143本 平均1.4分 (路線値 65km/h) + (28006, 2800610, 2800611, 104.0), + // 東京メトロ有楽町線 江戸川橋〜飯田橋: 東京メトロ GTFS 143本 平均2.4分 (路線値 65km/h) + (28006, 2800612, 2800613, 41.0), + // 東京メトロ有楽町線 市ケ谷〜麹町: 東京メトロ GTFS 143本 平均1.3分 (路線値 65km/h) + (28006, 2800614, 2800615, 93.0), + // 東京メトロ有楽町線 麹町〜永田町: 東京メトロ GTFS 143本 平均1.2分 (路線値 65km/h) + (28006, 2800615, 2800616, 49.0), + // 東京メトロ有楽町線 永田町〜桜田門: 東京メトロ GTFS 143本 平均1.4分 (路線値 65km/h) + (28006, 2800616, 2800617, 94.0), + // 東京メトロ有楽町線 桜田門〜有楽町: 東京メトロ GTFS 143本 平均1.4分 (路線値 65km/h) + (28006, 2800617, 2800618, 106.0), + // 東京メトロ有楽町線 銀座一丁目〜新富町: 東京メトロ GTFS 143本 平均1.2分 (路線値 65km/h) + (28006, 2800619, 2800620, 88.0), + // 東京メトロ有楽町線 新富町〜月島: 東京メトロ GTFS 143本 平均1.5分 (路線値 65km/h) + (28006, 2800620, 2800621, 109.0), + // 東京メトロ有楽町線 月島〜豊洲: 東京メトロ GTFS 143本 平均1.9分 (路線値 65km/h) + (28006, 2800621, 2800622, 82.0), + // 東京メトロ有楽町線 豊洲〜辰巳: 東京メトロ GTFS 143本 平均1.9分 (路線値 65km/h) + (28006, 2800622, 2800623, 85.0), + // 東京メトロ半蔵門線 渋谷〜表参道: 東京メトロ GTFS 184本 平均1.7分 (路線値 55km/h) + (28008, 2800801, 2800802, 85.0), + // 東京メトロ半蔵門線 表参道〜青山一丁目: 東京メトロ GTFS 184本 平均1.7分 (路線値 55km/h) + (28008, 2800802, 2800803, 107.0), + // 東京メトロ半蔵門線 青山一丁目〜永田町: 東京メトロ GTFS 184本 平均1.9分 (路線値 55km/h) + (28008, 2800803, 2800804, 95.0), + // 東京メトロ半蔵門線 永田町〜半蔵門: 東京メトロ GTFS 184本 平均1.3分 (路線値 55km/h) + (28008, 2800804, 2800805, 74.0), + // 東京メトロ半蔵門線 九段下〜神保町: 東京メトロ GTFS 184本 平均1.0分 (路線値 55km/h) + (28008, 2800806, 2800807, 75.0), + // 東京メトロ半蔵門線 神保町〜大手町: 東京メトロ GTFS 184本 平均1.5分 (路線値 55km/h) + (28008, 2800807, 2800808, 105.0), + // 東京メトロ半蔵門線 大手町〜三越前: 東京メトロ GTFS 184本 平均1.3分 (路線値 55km/h) + (28008, 2800808, 2800809, 93.0), + // 東京メトロ半蔵門線 三越前〜水天宮前: 東京メトロ GTFS 184本 平均2.3分 (路線値 55km/h) + (28008, 2800809, 2800810, 42.0), + // 東京メトロ半蔵門線 水天宮前〜清澄白河: 東京メトロ GTFS 184本 平均2.4分 (路線値 55km/h) + (28008, 2800810, 2800811, 43.0), + // 東京メトロ半蔵門線 清澄白河〜住吉: 東京メトロ GTFS 183本 平均2.4分 (路線値 55km/h) + (28008, 2800811, 2800814, 65.0), + // 東京メトロ半蔵門線 錦糸町〜押上〈スカイツリー前〉: 東京メトロ GTFS 183本 平均1.9分 (路線値 55km/h) + (28008, 2800812, 2800813, 87.0), + // 東京メトロ半蔵門線 錦糸町〜住吉: 東京メトロ GTFS 183本 平均1.4分 (路線値 55km/h) + (28008, 2800812, 2800814, 102.0), + // 東京メトロ南北線 赤羽岩淵〜志茂: 東京メトロ GTFS 140本 平均1.5分 (路線値 65km/h) + (28009, 2800901, 2800902, 109.0), + // 東京メトロ南北線 志茂〜王子神谷: 東京メトロ GTFS 140本 平均1.9分 (路線値 65km/h) + (28009, 2800902, 2800903, 71.0), + // 東京メトロ南北線 王子〜西ケ原: 東京メトロ GTFS 140本 平均1.4分 (路線値 65km/h) + (28009, 2800904, 2800905, 102.0), + // 東京メトロ南北線 西ケ原〜駒込: 東京メトロ GTFS 140本 平均1.4分 (路線値 65km/h) + (28009, 2800905, 2800906, 106.0), + // 東京メトロ南北線 駒込〜本駒込: 東京メトロ GTFS 140本 平均2.1分 (路線値 65km/h) + (28009, 2800906, 2800907, 70.0), + // 東京メトロ南北線 本駒込〜東大前: 東京メトロ GTFS 140本 平均1.3分 (路線値 65km/h) + (28009, 2800907, 2800908, 93.0), + // 東京メトロ南北線 東大前〜後楽園: 東京メトロ GTFS 140本 平均1.5分 (路線値 65km/h) + (28009, 2800908, 2800909, 104.0), + // 東京メトロ南北線 後楽園〜飯田橋: 東京メトロ GTFS 140本 平均1.7分 (路線値 65km/h) + (28009, 2800909, 2800910, 55.0), + // 東京メトロ南北線 市ケ谷〜四ツ谷: 東京メトロ GTFS 140本 平均1.4分 (路線値 65km/h) + (28009, 2800911, 2800912, 102.0), + // 東京メトロ南北線 四ツ谷〜永田町: 東京メトロ GTFS 140本 平均1.6分 (路線値 65km/h) + (28009, 2800912, 2800913, 107.0), + // 東京メトロ南北線 永田町〜溜池山王: 東京メトロ GTFS 140本 平均1.1分 (路線値 65km/h) + (28009, 2800913, 2800914, 78.0), + // 東京メトロ南北線 溜池山王〜六本木一丁目: 東京メトロ GTFS 140本 平均1.7分 (路線値 65km/h) + (28009, 2800914, 2800915, 50.0), + // 東京メトロ南北線 麻布十番〜白金高輪: 東京メトロ GTFS 140本 平均1.7分 (路線値 65km/h) + (28009, 2800916, 2800917, 81.0), + // 東京メトロ南北線 白金高輪〜白金台: 東京メトロ GTFS 79本 平均1.7分 (路線値 65km/h) + (28009, 2800917, 2800918, 48.0), + // 東京メトロ南北線 白金台〜目黒: 東京メトロ GTFS 79本 平均1.9分 (路線値 65km/h) + (28009, 2800918, 2800919, 50.0), + // 東京メトロ副都心線 和光市〜地下鉄成増: 東京メトロ GTFS 82本 平均2.6分 (路線値 55km/h) + (28010, 2801001, 2801002, 75.0), + // 東京メトロ副都心線 地下鉄成増〜地下鉄赤塚: 東京メトロ GTFS 82本 平均1.8分 (路線値 55km/h) + (28010, 2801002, 2801003, 79.0), + // 東京メトロ副都心線 地下鉄赤塚〜平和台: 東京メトロ GTFS 82本 平均2.0分 (路線値 55km/h) + (28010, 2801003, 2801004, 77.0), + // 東京メトロ副都心線 小竹向原〜千川: 東京メトロ GTFS 115本 平均1.7分 (路線値 55km/h) + (28010, 2801006, 2801007, 65.0), + // 東京メトロ副都心線 千川〜要町: 東京メトロ GTFS 115本 平均1.4分 (路線値 55km/h) + (28010, 2801007, 2801008, 104.0), + // 東京メトロ副都心線 要町〜池袋: 東京メトロ GTFS 115本 平均1.3分 (路線値 55km/h) + (28010, 2801008, 2801009, 97.0), + // 東京メトロ副都心線 池袋〜雑司が谷: 東京メトロ GTFS 136本 平均1.9分 (路線値 55km/h) + (28010, 2801009, 2801010, 72.0), + // 東京メトロ副都心線 西早稲田〜東新宿: 東京メトロ GTFS 136本 平均1.4分 (路線値 55km/h) + (28010, 2801011, 2801012, 105.0), + // 東京メトロ副都心線 東新宿〜新宿三丁目: 東京メトロ GTFS 136本 平均1.4分 (路線値 55km/h) + (28010, 2801012, 2801013, 72.0), + // 東京メトロ副都心線 新宿三丁目〜北参道: 東京メトロ GTFS 138本 平均2.0分 (路線値 55km/h) + (28010, 2801013, 2801014, 62.0), + // 東京メトロ副都心線 北参道〜明治神宮前〈原宿〉: 東京メトロ GTFS 138本 平均1.5分 (路線値 55km/h) + (28010, 2801014, 2801015, 108.0), + // 東京メトロ副都心線 明治神宮前〈原宿〉〜渋谷: 東京メトロ GTFS 138本 平均1.6分 (路線値 55km/h) + (28010, 2801015, 2801016, 59.0), + // 函館市電2系統 湯の川〜湯の川温泉: 函館市電 GTFS 53本 平均1.6分 (路線値 20km/h) + (99105, 9910501, 9910502, 23.0), + // 函館市電2系統 函館アリーナ前〜駒場車庫前: 函館市電 GTFS 53本 平均0.9分 (路線値 20km/h) + (99105, 9910503, 9910504, 29.0), + // 函館市電2系統 競馬場前〜深堀町: 函館市電 GTFS 53本 平均1.7分 (路線値 20km/h) + (99105, 9910505, 9910506, 26.0), + // 函館市電2系統 深堀町〜柏木町: 函館市電 GTFS 53本 平均1.4分 (路線値 20km/h) + (99105, 9910506, 9910507, 25.0), + // 函館市電2系統 杉並町〜五稜郭公園前: 函館市電 GTFS 53本 平均1.9分 (路線値 20km/h) + (99105, 9910508, 9910509, 28.0), + // 函館市電2系統 五稜郭公園前〜中央病院前: 函館市電 GTFS 53本 平均2.3分 (路線値 20km/h) + (99105, 9910509, 9910510, 9.0), + // 函館市電2系統 中央病院前〜千代台: 函館市電 GTFS 53本 平均1.4分 (路線値 20km/h) + (99105, 9910510, 9910511, 23.0), + // 函館市電2系統 堀川町〜昭和橋: 函館市電 GTFS 53本 平均1.4分 (路線値 20km/h) + (99105, 9910512, 9910513, 23.0), + // 函館市電2系統 千歳町〜新川町: 函館市電 GTFS 53本 平均0.9分 (路線値 20km/h) + (99105, 9910514, 9910515, 24.0), + // 函館市電2系統 新川町〜松風町: 函館市電 GTFS 53本 平均1.4分 (路線値 20km/h) + (99105, 9910515, 9910516, 31.0), + // 函館市電2系統 松風町〜函館駅前: 函館市電 GTFS 53本 平均2.7分 (路線値 20km/h) + (99105, 9910516, 9910517, 13.0), + // 函館市電2系統 函館駅前〜市役所前: 函館市電 GTFS 53本 平均1.4分 (路線値 20km/h) + (99105, 9910517, 9910518, 32.0), + // 函館市電2系統 十字街〜宝来町: 函館市電 GTFS 53本 平均2.0分 (路線値 20km/h) + (99105, 9910520, 9910521, 14.0), + // 函館市電2系統 宝来町〜青柳町: 函館市電 GTFS 53本 平均1.7分 (路線値 20km/h) + (99105, 9910521, 9910522, 28.0), + // 函館市電2系統 青柳町〜谷地頭: 函館市電 GTFS 53本 平均2.2分 (路線値 20km/h) + (99105, 9910522, 9910523, 13.0), + // 函館市電5系統 湯の川〜湯の川温泉: 函館市電 GTFS 53本 平均1.6分 (路線値 25km/h) + (99106, 9910601, 9910602, 23.0), + // 函館市電5系統 函館アリーナ前〜駒場車庫前: 函館市電 GTFS 53本 平均0.9分 (路線値 25km/h) + (99106, 9910603, 9910604, 29.0), + // 函館市電5系統 柏木町〜杉並町: 函館市電 GTFS 53本 平均1.4分 (路線値 25km/h) + (99106, 9910607, 9910608, 32.0), + // 函館市電5系統 杉並町〜五稜郭公園前: 函館市電 GTFS 53本 平均1.7分 (路線値 25km/h) + (99106, 9910608, 9910609, 33.0), + // 函館市電5系統 中央病院前〜千代台: 函館市電 GTFS 53本 平均1.4分 (路線値 25km/h) + (99106, 9910610, 9910611, 23.0), + // 函館市電5系統 千代台〜堀川町: 函館市電 GTFS 53本 平均1.4分 (路線値 25km/h) + (99106, 9910611, 9910612, 40.0), + // 函館市電5系統 堀川町〜昭和橋: 函館市電 GTFS 53本 平均1.4分 (路線値 25km/h) + (99106, 9910612, 9910613, 23.0), + // 函館市電5系統 昭和橋〜千歳町: 函館市電 GTFS 53本 平均0.9分 (路線値 25km/h) + (99106, 9910613, 9910614, 31.0), + // 函館市電5系統 新川町〜松風町: 函館市電 GTFS 53本 平均1.3分 (路線値 25km/h) + (99106, 9910615, 9910616, 32.0), + // 函館市電5系統 松風町〜函館駅前: 函館市電 GTFS 53本 平均2.7分 (路線値 25km/h) + (99106, 9910616, 9910617, 13.0), + // 函館市電5系統 函館駅前〜市役所前: 函館市電 GTFS 53本 平均1.4分 (路線値 25km/h) + (99106, 9910617, 9910618, 31.0), + // 函館市電5系統 魚市場通〜十字街: 函館市電 GTFS 53本 平均1.4分 (路線値 25km/h) + (99106, 9910619, 9910620, 20.0), + // 函館市電5系統 十字街〜末広町: 函館市電 GTFS 53本 平均3.0分 (路線値 25km/h) + (99106, 9910620, 9910621, 17.0), + // 函館市電5系統 大町〜函館どつく前: 函館市電 GTFS 53本 平均1.4分 (路線値 25km/h) + (99106, 9910622, 9910623, 32.0), + // 都営大江戸線 都庁前〜新宿西口: 都営地下鉄 GTFS 145本 平均1.0分 (路線値 70km/h) + (99301, 9930100, 9930102, 87.0), + // 都営大江戸線 都庁前〜新宿: 都営地下鉄 GTFS 146本 平均1.6分 (路線値 70km/h) + (99301, 9930101, 9930128, 32.0), + // 都営大江戸線 都庁前〜西新宿五丁目: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 70km/h) + (99301, 9930101, 9930129, 92.0), + // 都営大江戸線 新宿西口〜東新宿: 都営地下鉄 GTFS 145本 平均2.0分 (路線値 70km/h) + (99301, 9930102, 9930103, 40.0), + // 都営大江戸線 東新宿〜若松河田: 都営地下鉄 GTFS 145本 平均1.5分 (路線値 70km/h) + (99301, 9930103, 9930104, 74.0), + // 都営大江戸線 若松河田〜牛込柳町: 都営地下鉄 GTFS 145本 平均1.0分 (路線値 70km/h) + (99301, 9930104, 9930105, 83.0), + // 都営大江戸線 牛込柳町〜牛込神楽坂: 都営地下鉄 GTFS 145本 平均1.2分 (路線値 70km/h) + (99301, 9930105, 9930106, 105.0), + // 都営大江戸線 牛込神楽坂〜飯田橋: 都営地下鉄 GTFS 145本 平均2.0分 (路線値 70km/h) + (99301, 9930106, 9930107, 37.0), + // 都営大江戸線 飯田橋〜春日: 都営地下鉄 GTFS 145本 平均1.4分 (路線値 70km/h) + (99301, 9930107, 9930108, 109.0), + // 都営大江戸線 春日〜本郷三丁目: 都営地下鉄 GTFS 145本 平均1.0分 (路線値 70km/h) + (99301, 9930108, 9930109, 86.0), + // 都営大江戸線 本郷三丁目〜上野御徒町: 都営地下鉄 GTFS 145本 平均2.0分 (路線値 70km/h) + (99301, 9930109, 9930110, 62.0), + // 都営大江戸線 上野御徒町〜新御徒町: 都営地下鉄 GTFS 145本 平均1.0分 (路線値 70km/h) + (99301, 9930110, 9930111, 88.0), + // 都営大江戸線 新御徒町〜蔵前: 都営地下鉄 GTFS 145本 平均1.0分 (路線値 70km/h) + (99301, 9930111, 9930112, 101.0), + // 都営大江戸線 蔵前〜両国: 都営地下鉄 GTFS 145本 平均2.0分 (路線値 70km/h) + (99301, 9930112, 9930113, 40.0), + // 都営大江戸線 両国〜森下: 都営地下鉄 GTFS 145本 平均1.0分 (路線値 70km/h) + (99301, 9930113, 9930114, 106.0), + // 都営大江戸線 森下〜清澄白河: 都営地下鉄 GTFS 145本 平均1.0分 (路線値 70km/h) + (99301, 9930114, 9930115, 87.0), + // 都営大江戸線 清澄白河〜門前仲町: 都営地下鉄 GTFS 146本 平均2.0分 (路線値 70km/h) + (99301, 9930115, 9930116, 54.0), + // 都営大江戸線 月島〜勝どき: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 70km/h) + (99301, 9930117, 9930118, 106.0), + // 都営大江戸線 勝どき〜築地市場: 都営地下鉄 GTFS 146本 平均2.0分 (路線値 70km/h) + (99301, 9930118, 9930119, 51.0), + // 都営大江戸線 築地市場〜汐留: 都営地下鉄 GTFS 146本 平均1.7分 (路線値 70km/h) + (99301, 9930119, 9930120, 30.0), + // 都営大江戸線 汐留〜大門: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 70km/h) + (99301, 9930120, 9930121, 103.0), + // 都営大江戸線 大門〜赤羽橋: 都営地下鉄 GTFS 146本 平均2.0分 (路線値 70km/h) + (99301, 9930121, 9930122, 45.0), + // 都営大江戸線 赤羽橋〜麻布十番: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 70km/h) + (99301, 9930122, 9930123, 89.0), + // 都営大江戸線 六本木〜青山一丁目: 都営地下鉄 GTFS 146本 平均2.0分 (路線値 70km/h) + (99301, 9930124, 9930125, 57.0), + // 都営大江戸線 青山一丁目〜国立競技場: 都営地下鉄 GTFS 146本 平均2.0分 (路線値 70km/h) + (99301, 9930125, 9930126, 51.0), + // 都営大江戸線 国立競技場〜代々木: 都営地下鉄 GTFS 146本 平均2.0分 (路線値 70km/h) + (99301, 9930126, 9930127, 60.0), + // 都営大江戸線 代々木〜新宿: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 70km/h) + (99301, 9930127, 9930128, 86.0), + // 都営大江戸線 西新宿五丁目〜中野坂上: 都営地下鉄 GTFS 146本 平均2.0分 (路線値 70km/h) + (99301, 9930129, 9930130, 36.0), + // 都営大江戸線 中野坂上〜東中野: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 70km/h) + (99301, 9930130, 9930131, 111.0), + // 都営大江戸線 東中野〜中井: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 70km/h) + (99301, 9930131, 9930132, 98.0), + // 都営大江戸線 中井〜落合南長崎: 都営地下鉄 GTFS 146本 平均2.0分 (路線値 70km/h) + (99301, 9930132, 9930133, 50.0), + // 都営大江戸線 落合南長崎〜新江古田: 都営地下鉄 GTFS 146本 平均2.0分 (路線値 70km/h) + (99301, 9930133, 9930134, 78.0), + // 都営大江戸線 新江古田〜練馬: 都営地下鉄 GTFS 146本 平均2.0分 (路線値 70km/h) + (99301, 9930134, 9930135, 80.0), + // 都営大江戸線 練馬〜豊島園: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 70km/h) + (99301, 9930135, 9930136, 93.0), + // 都営大江戸線 豊島園〜練馬春日町: 都営地下鉄 GTFS 146本 平均2.0分 (路線値 70km/h) + (99301, 9930136, 9930137, 60.0), + // 都営浅草線 西馬込〜馬込: 都営地下鉄 GTFS 100本 平均1.6分 (路線値 65km/h) + (99302, 9930201, 9930202, 75.0), + // 都営浅草線 馬込〜中延: 都営地下鉄 GTFS 100本 平均1.0分 (路線値 65km/h) + (99302, 9930202, 9930203, 104.0), + // 都営浅草線 中延〜戸越: 都営地下鉄 GTFS 100本 平均1.0分 (路線値 65km/h) + (99302, 9930203, 9930204, 103.0), + // 都営浅草線 戸越〜五反田: 都営地下鉄 GTFS 100本 平均2.0分 (路線値 65km/h) + (99302, 9930204, 9930205, 72.0), + // 都営浅草線 五反田〜高輪台: 都営地下鉄 GTFS 100本 平均1.0分 (路線値 65km/h) + (99302, 9930205, 9930206, 88.0), + // 都営浅草線 高輪台〜泉岳寺: 都営地下鉄 GTFS 100本 平均2.2分 (路線値 65km/h) + (99302, 9930206, 9930207, 43.0), + // 都営浅草線 三田〜大門: 都営地下鉄 GTFS 166本 平均1.8分 (路線値 65km/h) + (99302, 9930208, 9930209, 53.0), + // 都営浅草線 大門〜新橋: 都営地下鉄 GTFS 166本 平均1.3分 (路線値 65km/h) + (99302, 9930209, 9930210, 105.0), + // 都営浅草線 新橋〜東銀座: 都営地下鉄 GTFS 166本 平均1.7分 (路線値 65km/h) + (99302, 9930210, 9930211, 40.0), + // 都営浅草線 東銀座〜宝町: 都営地下鉄 GTFS 166本 平均1.0分 (路線値 65km/h) + (99302, 9930211, 9930212, 90.0), + // 都営浅草線 宝町〜日本橋: 都営地下鉄 GTFS 166本 平均1.0分 (路線値 65km/h) + (99302, 9930212, 9930213, 90.0), + // 都営浅草線 日本橋〜人形町: 都営地下鉄 GTFS 166本 平均1.0分 (路線値 65km/h) + (99302, 9930213, 9930214, 90.0), + // 都営浅草線 人形町〜東日本橋: 都営地下鉄 GTFS 166本 平均1.0分 (路線値 65km/h) + (99302, 9930214, 9930215, 84.0), + // 都営浅草線 東日本橋〜浅草橋: 都営地下鉄 GTFS 166本 平均1.0分 (路線値 65km/h) + (99302, 9930215, 9930216, 79.0), + // 都営浅草線 浅草橋〜蔵前: 都営地下鉄 GTFS 166本 平均1.0分 (路線値 65km/h) + (99302, 9930216, 9930217, 89.0), + // 都営浅草線 蔵前〜浅草: 都営地下鉄 GTFS 166本 平均1.0分 (路線値 65km/h) + (99302, 9930217, 9930218, 96.0), + // 都営浅草線 浅草〜本所吾妻橋: 都営地下鉄 GTFS 166本 平均1.0分 (路線値 65km/h) + (99302, 9930218, 9930219, 85.0), + // 都営浅草線 本所吾妻橋〜押上(スカイツリー前): 都営地下鉄 GTFS 166本 平均1.0分 (路線値 65km/h) + (99302, 9930219, 9930220, 90.0), + // 都営三田線 目黒〜白金台: 都営地下鉄 GTFS 90本 平均2.0分 (路線値 75km/h) + (99303, 9930301, 9930302, 46.0), + // 都営三田線 白金台〜白金高輪: 都営地下鉄 GTFS 90本 平均1.8分 (路線値 75km/h) + (99303, 9930302, 9930303, 43.0), + // 都営三田線 白金高輪〜三田: 都営地下鉄 GTFS 146本 平均2.8分 (路線値 75km/h) + (99303, 9930303, 9930304, 40.0), + // 都営三田線 三田〜芝公園: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930304, 9930305, 83.0), + // 都営三田線 芝公園〜御成門: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930305, 9930306, 92.0), + // 都営三田線 御成門〜内幸町: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930306, 9930307, 103.0), + // 都営三田線 内幸町〜日比谷: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930307, 9930308, 92.0), + // 都営三田線 日比谷〜大手町: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930308, 9930309, 103.0), + // 都営三田線 大手町〜神保町: 都営地下鉄 GTFS 146本 平均2.2分 (路線値 75km/h) + (99303, 9930309, 9930310, 48.0), + // 都営三田線 神保町〜水道橋: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930310, 9930311, 98.0), + // 都営三田線 水道橋〜春日: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930311, 9930312, 86.0), + // 都営三田線 春日〜白山: 都営地下鉄 GTFS 146本 平均1.6分 (路線値 75km/h) + (99303, 9930312, 9930313, 117.0), + // 都営三田線 白山〜千石: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930313, 9930314, 102.0), + // 都営三田線 千石〜巣鴨: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930314, 9930315, 94.0), + // 都営三田線 西巣鴨〜新板橋: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930316, 9930317, 101.0), + // 都営三田線 新板橋〜板橋区役所前: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930317, 9930318, 99.0), + // 都営三田線 板橋区役所前〜板橋本町: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930318, 9930319, 112.0), + // 都営三田線 板橋本町〜本蓮沼: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930319, 9930320, 96.0), + // 都営三田線 本蓮沼〜志村坂上: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930320, 9930321, 102.0), + // 都営三田線 志村坂上〜志村三丁目: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99303, 9930321, 9930322, 96.0), + // 都営三田線 志村三丁目〜蓮根: 都営地下鉄 GTFS 146本 平均1.3分 (路線値 75km/h) + (99303, 9930322, 9930323, 102.0), + // 都営三田線 西台〜高島平: 都営地下鉄 GTFS 146本 平均1.1分 (路線値 75km/h) + (99303, 9930324, 9930325, 111.0), + // 都営三田線 高島平〜新高島平: 都営地下鉄 GTFS 140本 平均1.0分 (路線値 75km/h) + (99303, 9930325, 9930326, 82.0), + // 都営三田線 新高島平〜西高島平: 都営地下鉄 GTFS 140本 平均1.0分 (路線値 75km/h) + (99303, 9930326, 9930327, 90.0), + // 都営新宿線 新宿〜新宿三丁目: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99304, 9930401, 9930402, 85.0), + // 都営新宿線 新宿三丁目〜曙橋: 都営地下鉄 GTFS 146本 平均2.0分 (路線値 75km/h) + (99304, 9930402, 9930403, 68.0), + // 都営新宿線 曙橋〜市ヶ谷: 都営地下鉄 GTFS 146本 平均2.0分 (路線値 75km/h) + (99304, 9930403, 9930404, 57.0), + // 都営新宿線 市ヶ谷〜九段下: 都営地下鉄 GTFS 146本 平均1.1分 (路線値 75km/h) + (99304, 9930404, 9930405, 118.0), + // 都営新宿線 九段下〜神保町: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99304, 9930405, 9930406, 59.0), + // 都営新宿線 神保町〜小川町: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99304, 9930406, 9930407, 92.0), + // 都営新宿線 小川町〜岩本町: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99304, 9930407, 9930408, 92.0), + // 都営新宿線 岩本町〜馬喰横山: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99304, 9930408, 9930409, 86.0), + // 都営新宿線 馬喰横山〜浜町: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99304, 9930409, 9930410, 80.0), + // 都営新宿線 浜町〜森下: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99304, 9930410, 9930411, 91.0), + // 都営新宿線 森下〜菊川: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99304, 9930411, 9930412, 91.0), + // 都営新宿線 菊川〜住吉: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99304, 9930412, 9930413, 95.0), + // 都営新宿線 住吉〜西大島: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99304, 9930413, 9930414, 99.0), + // 都営新宿線 西大島〜大島: 都営地下鉄 GTFS 146本 平均1.0分 (路線値 75km/h) + (99304, 9930414, 9930415, 94.0), + // 都営新宿線 大島〜東大島: 都営地下鉄 GTFS 142本 平均2.0分 (路線値 75km/h) + (99304, 9930415, 9930416, 37.0), + // 都営新宿線 東大島〜船堀: 都営地下鉄 GTFS 142本 平均2.0分 (路線値 75km/h) + (99304, 9930416, 9930417, 90.0), + // 都営新宿線 船堀〜一之江: 都営地下鉄 GTFS 142本 平均2.0分 (路線値 75km/h) + (99304, 9930417, 9930418, 82.0), + // 都営新宿線 一之江〜瑞江: 都営地下鉄 GTFS 142本 平均2.0分 (路線値 75km/h) + (99304, 9930418, 9930419, 71.0), + // 都営新宿線 瑞江〜篠崎: 都営地下鉄 GTFS 142本 平均2.0分 (路線値 75km/h) + (99304, 9930419, 9930420, 68.0), + // 東京さくらトラム(都電荒川線) 三ノ輪橋〜荒川一中前: 都営地下鉄 GTFS 138本 平均1.2分 (路線値 25km/h) + (99305, 9930501, 9930502, 18.0), + // 東京さくらトラム(都電荒川線) 町屋駅前〜町屋二丁目: 都営地下鉄 GTFS 99本 平均2.4分 (路線値 25km/h) + (99305, 9930506, 9930507, 14.0), + // 東京さくらトラム(都電荒川線) 宮ノ前〜小台: 都営地下鉄 GTFS 102本 平均1.0分 (路線値 25km/h) + (99305, 9930510, 9930511, 27.0), + // 東京さくらトラム(都電荒川線) 小台〜荒川遊園地前: 都営地下鉄 GTFS 98本 平均1.0分 (路線値 25km/h) + (99305, 9930511, 9930512, 36.0), + // 東京さくらトラム(都電荒川線) 荒川遊園地前〜荒川車庫前: 都営地下鉄 GTFS 105本 平均3.5分 (路線値 25km/h) + (99305, 9930512, 9930513, 10.0), + // 東京さくらトラム(都電荒川線) 荒川車庫前〜梶原: 都営地下鉄 GTFS 99本 平均2.9分 (路線値 25km/h) + (99305, 9930513, 9930514, 13.0), + // 東京さくらトラム(都電荒川線) 栄町〜王子駅前: 都営地下鉄 GTFS 102本 平均3.0分 (路線値 25km/h) + (99305, 9930515, 9930516, 10.0), + // 東京さくらトラム(都電荒川線) 滝野川一丁目〜西ヶ原四丁目: 都営地下鉄 GTFS 103本 平均2.0分 (路線値 25km/h) + (99305, 9930518, 9930519, 16.0), + // 東京さくらトラム(都電荒川線) 西ヶ原四丁目〜新庚申塚: 都営地下鉄 GTFS 97本 平均2.0分 (路線値 25km/h) + (99305, 9930519, 9930520, 16.0), + // 東京さくらトラム(都電荒川線) 巣鴨新田〜大塚駅前: 都営地下鉄 GTFS 101本 平均3.0分 (路線値 25km/h) + (99305, 9930522, 9930523, 12.0), + // 東京さくらトラム(都電荒川線) 大塚駅前〜向原: 都営地下鉄 GTFS 97本 平均3.1分 (路線値 25km/h) + (99305, 9930523, 9930524, 12.0), + // 東京さくらトラム(都電荒川線) 向原〜東池袋四丁目: 都営地下鉄 GTFS 139本 平均1.6分 (路線値 25km/h) + (99305, 9930524, 9930525, 33.0), + // 東京さくらトラム(都電荒川線) 東池袋四丁目〜都電雑司ヶ谷: 都営地下鉄 GTFS 97本 平均1.0分 (路線値 25km/h) + (99305, 9930525, 9930526, 18.0), + // 東京さくらトラム(都電荒川線) 学習院下〜面影橋: 都営地下鉄 GTFS 139本 平均1.2分 (路線値 25km/h) + (99305, 9930528, 9930529, 32.0), + // 東京さくらトラム(都電荒川線) 面影橋〜早稲田: 都営地下鉄 GTFS 139本 平均1.2分 (路線値 25km/h) + (99305, 9930529, 9930530, 31.0), + // つくばエクスプレス線 秋葉原〜新御徒町: つくばエクスプレス GTFS 86本 平均2.1分 (路線値 95km/h) + (99309, 9930901, 9930902, 47.0), + // つくばエクスプレス線 新御徒町〜浅草: つくばエクスプレス GTFS 86本 平均1.9分 (路線値 95km/h) + (99309, 9930902, 9930903, 55.0), + // つくばエクスプレス線 浅草〜南千住: つくばエクスプレス GTFS 86本 平均2.4分 (路線値 95km/h) + (99309, 9930903, 9930904, 84.0), + // つくばエクスプレス線 南千住〜北千住: つくばエクスプレス GTFS 86本 平均2.0分 (路線値 95km/h) + (99309, 9930904, 9930905, 145.0), + // つくばエクスプレス線 北千住〜青井: つくばエクスプレス GTFS 86本 平均2.4分 (路線値 95km/h) + (99309, 9930905, 9930906, 141.0), + // つくばエクスプレス線 青井〜六町: つくばエクスプレス GTFS 86本 平均1.7分 (路線値 95km/h) + (99309, 9930906, 9930907, 125.0), + // つくばエクスプレス線 六町〜八潮: つくばエクスプレス GTFS 86本 平均3.0分 (路線値 95km/h) + (99309, 9930907, 9930908, 101.0), + // つくばエクスプレス線 八潮〜三郷中央: つくばエクスプレス GTFS 86本 平均2.8分 (路線値 95km/h) + (99309, 9930908, 9930909, 127.0), + // つくばエクスプレス線 三郷中央〜南流山: つくばエクスプレス GTFS 86本 平均2.4分 (路線値 95km/h) + (99309, 9930909, 9930910, 129.0), + // つくばエクスプレス線 南流山〜流山セントラルパーク: つくばエクスプレス GTFS 86本 平均2.0分 (路線値 95km/h) + (99309, 9930910, 9930911, 148.0), + // つくばエクスプレス線 流山セントラルパーク〜流山おおたかの森: つくばエクスプレス GTFS 86本 平均2.0分 (路線値 95km/h) + (99309, 9930911, 9930912, 150.0), + // つくばエクスプレス線 柏の葉キャンパス〜柏たなか: つくばエクスプレス GTFS 86本 平均2.0分 (路線値 95km/h) + (99309, 9930913, 9930914, 147.0), + // つくばエクスプレス線 柏たなか〜守谷: つくばエクスプレス GTFS 86本 平均4.0分 (路線値 95km/h) + (99309, 9930914, 9930915, 122.0), + // つくばエクスプレス線 守谷〜みらい平: つくばエクスプレス GTFS 28本 平均4.9分 (路線値 95km/h) + (99309, 9930915, 9930916, 111.0), + // つくばエクスプレス線 万博記念公園〜研究学園: つくばエクスプレス GTFS 28本 平均2.8分 (路線値 95km/h) + (99309, 9930918, 9930919, 127.0), + // 横浜市営地下鉄ブルーライン 中川〜センター北: 横浜市営地下鉄 GTFS 69本 平均1.9分 (路線値 75km/h) + (99316, 9931602, 9931603, 62.0), + // 横浜市営地下鉄ブルーライン センター北〜センター南: 横浜市営地下鉄 GTFS 69本 平均1.0分 (路線値 75km/h) + (99316, 9931603, 9931604, 102.0), + // 横浜市営地下鉄ブルーライン センター南〜仲町台: 横浜市営地下鉄 GTFS 69本 平均2.1分 (路線値 75km/h) + (99316, 9931604, 9931605, 81.0), + // 横浜市営地下鉄ブルーライン 仲町台〜新羽: 横浜市営地下鉄 GTFS 69本 平均2.4分 (路線値 75km/h) + (99316, 9931605, 9931606, 84.0), + // 横浜市営地下鉄ブルーライン 新羽〜北新横浜: 横浜市営地下鉄 GTFS 94本 平均1.5分 (路線値 75km/h) + (99316, 9931606, 9931607, 64.0), + // 横浜市営地下鉄ブルーライン 北新横浜〜新横浜: 横浜市営地下鉄 GTFS 94本 平均1.2分 (路線値 75km/h) + (99316, 9931607, 9931608, 116.0), + // 横浜市営地下鉄ブルーライン 新横浜〜岸根公園: 横浜市営地下鉄 GTFS 94本 平均2.0分 (路線値 75km/h) + (99316, 9931608, 9931609, 64.0), + // 横浜市営地下鉄ブルーライン 岸根公園〜片倉町: 横浜市営地下鉄 GTFS 94本 平均1.0分 (路線値 75km/h) + (99316, 9931609, 9931610, 111.0), + // 横浜市営地下鉄ブルーライン 三ツ沢上町〜三ツ沢下町: 横浜市営地下鉄 GTFS 94本 平均1.0分 (路線値 75km/h) + (99316, 9931611, 9931612, 95.0), + // 横浜市営地下鉄ブルーライン 三ツ沢下町〜横浜: 横浜市営地下鉄 GTFS 94本 平均2.0分 (路線値 75km/h) + (99316, 9931612, 9931613, 57.0), + // 横浜市営地下鉄ブルーライン 横浜〜高島町: 横浜市営地下鉄 GTFS 94本 平均1.0分 (路線値 75km/h) + (99316, 9931613, 9931614, 95.0), + // 横浜市営地下鉄ブルーライン 高島町〜桜木町: 横浜市営地下鉄 GTFS 94本 平均1.0分 (路線値 75km/h) + (99316, 9931614, 9931615, 113.0), + // 横浜市営地下鉄ブルーライン 桜木町〜関内: 横浜市営地下鉄 GTFS 94本 平均1.0分 (路線値 75km/h) + (99316, 9931615, 9931616, 82.0), + // 横浜市営地下鉄ブルーライン 伊勢佐木長者町〜阪東橋: 横浜市営地下鉄 GTFS 94本 平均1.0分 (路線値 75km/h) + (99316, 9931617, 9931618, 95.0), + // 横浜市営地下鉄ブルーライン 阪東橋〜吉野町: 横浜市営地下鉄 GTFS 94本 平均1.0分 (路線値 75km/h) + (99316, 9931618, 9931619, 81.0), + // 横浜市営地下鉄ブルーライン 吉野町〜蒔田: 横浜市営地下鉄 GTFS 94本 平均1.0分 (路線値 75km/h) + (99316, 9931619, 9931620, 102.0), + // 横浜市営地下鉄ブルーライン 蒔田〜弘明寺: 横浜市営地下鉄 GTFS 94本 平均1.0分 (路線値 75km/h) + (99316, 9931620, 9931621, 105.0), + // 横浜市営地下鉄ブルーライン 弘明寺〜上大岡: 横浜市営地下鉄 GTFS 94本 平均2.0分 (路線値 75km/h) + (99316, 9931621, 9931622, 87.0), + // 横浜市営地下鉄ブルーライン 上大岡〜港南中央: 横浜市営地下鉄 GTFS 94本 平均1.0分 (路線値 75km/h) + (99316, 9931622, 9931623, 101.0), + // 横浜市営地下鉄ブルーライン 港南中央〜上永谷: 横浜市営地下鉄 GTFS 94本 平均2.4分 (路線値 75km/h) + (99316, 9931623, 9931624, 60.0), + // 横浜市営地下鉄ブルーライン 上永谷〜下永谷: 横浜市営地下鉄 GTFS 94本 平均1.9分 (路線値 75km/h) + (99316, 9931624, 9931625, 59.0), + // 横浜市営地下鉄ブルーライン 下永谷〜舞岡: 横浜市営地下鉄 GTFS 94本 平均1.0分 (路線値 75km/h) + (99316, 9931625, 9931626, 87.0), + // 横浜市営地下鉄ブルーライン 戸塚〜踊場: 横浜市営地下鉄 GTFS 94本 平均1.8分 (路線値 75km/h) + (99316, 9931627, 9931628, 105.0), + // 横浜市営地下鉄ブルーライン 踊場〜中田: 横浜市営地下鉄 GTFS 71本 平均1.0分 (路線値 75km/h) + (99316, 9931628, 9931629, 95.0), + // 横浜市営地下鉄ブルーライン 中田〜立場: 横浜市営地下鉄 GTFS 71本 平均1.0分 (路線値 75km/h) + (99316, 9931629, 9931630, 106.0), + // 横浜市営地下鉄ブルーライン 立場〜下飯田: 横浜市営地下鉄 GTFS 71本 平均2.0分 (路線値 75km/h) + (99316, 9931630, 9931631, 114.0), + // 横浜市営地下鉄ブルーライン 下飯田〜湘南台: 横浜市営地下鉄 GTFS 71本 平均2.0分 (路線値 75km/h) + (99316, 9931631, 9931632, 81.0), + // 多摩モノレール 多摩センター〜松が谷: 多摩都市モノレール GTFS 88本 平均1.8分 (路線値 50km/h) + (99334, 9933401, 9933402, 41.0), + // 多摩モノレール 大塚・帝京大学〜中央大学・明星大学: 多摩都市モノレール GTFS 88本 平均1.4分 (路線値 50km/h) + (99334, 9933403, 9933404, 72.0), + // 多摩モノレール 中央大学・明星大学〜多摩動物公園: 多摩都市モノレール GTFS 88本 平均2.0分 (路線値 50km/h) + (99334, 9933404, 9933405, 34.0), + // 多摩モノレール 多摩動物公園〜程久保: 多摩都市モノレール GTFS 88本 平均1.4分 (路線値 50km/h) + (99334, 9933405, 9933406, 75.0), + // 多摩モノレール 程久保〜高幡不動: 多摩都市モノレール GTFS 88本 平均1.4分 (路線値 50km/h) + (99334, 9933406, 9933407, 56.0), + // 多摩モノレール 高幡不動〜万願寺: 多摩都市モノレール GTFS 88本 平均2.2分 (路線値 50km/h) + (99334, 9933407, 9933408, 42.0), + // 多摩モノレール 柴崎体育館〜立川南: 多摩都市モノレール GTFS 88本 平均1.3分 (路線値 50km/h) + (99334, 9933410, 9933411, 62.0), + // 多摩モノレール 立川南〜立川北: 多摩都市モノレール GTFS 88本 平均0.9分 (路線値 50km/h) + (99334, 9933411, 9933412, 63.0), + // 多摩モノレール 立川北〜高松: 多摩都市モノレール GTFS 88本 平均1.7分 (路線値 50km/h) + (99334, 9933412, 9933413, 70.0), + // 多摩モノレール 高松〜立飛: 多摩都市モノレール GTFS 87本 平均1.1分 (路線値 50km/h) + (99334, 9933413, 9933414, 61.0), + // 多摩モノレール 立飛〜泉体育館: 多摩都市モノレール GTFS 87本 平均1.1分 (路線値 50km/h) + (99334, 9933414, 9933415, 45.0), + // 多摩モノレール 泉体育館〜砂川七番: 多摩都市モノレール GTFS 87本 平均1.0分 (路線値 50km/h) + (99334, 9933415, 9933416, 74.0), + // 多摩モノレール 桜街道〜上北台: 多摩都市モノレール GTFS 87本 平均1.5分 (路線値 50km/h) + (99334, 9933418, 9933419, 45.0), + // りんかい線 新木場〜東雲: りんかい線 GTFS 106本 平均2.3分 (路線値 65km/h) + (99337, 9933701, 9933702, 96.0), + // りんかい線 国際展示場〜東京テレポート: りんかい線 GTFS 106本 平均1.9分 (路線値 65km/h) + (99337, 9933703, 9933704, 72.0), + // りんかい線 東京テレポート〜天王洲アイル: りんかい線 GTFS 104本 平均2.9分 (路線値 65km/h) + (99337, 9933704, 9933705, 79.0), + // りんかい線 品川シーサイド〜大井町: りんかい線 GTFS 104本 平均2.0分 (路線値 65km/h) + (99337, 9933706, 9933707, 61.0), + // りんかい線 大井町〜大崎: りんかい線 GTFS 104本 平均2.7分 (路線値 65km/h) + (99337, 9933707, 9933708, 44.0), + // 日暮里・舎人ライナー 日暮里〜西日暮里: 都営地下鉄 GTFS 151本 平均1.0分 (路線値 60km/h) + (99342, 9934201, 9934202, 78.0), + // 日暮里・舎人ライナー 赤土小学校前〜熊野前: 都営地下鉄 GTFS 151本 平均1.0分 (路線値 60km/h) + (99342, 9934203, 9934204, 86.0), + // 日暮里・舎人ライナー 熊野前〜足立小台: 都営地下鉄 GTFS 151本 平均1.0分 (路線値 60km/h) + (99342, 9934204, 9934205, 81.0), + // 日暮里・舎人ライナー 扇大橋〜高野: 都営地下鉄 GTFS 141本 平均1.0分 (路線値 60km/h) + (99342, 9934206, 9934207, 54.0), + // 日暮里・舎人ライナー 高野〜江北: 都営地下鉄 GTFS 151本 平均1.0分 (路線値 60km/h) + (99342, 9934207, 9934208, 80.0), + // 日暮里・舎人ライナー 江北〜西新井大師西: 都営地下鉄 GTFS 151本 平均1.0分 (路線値 60km/h) + (99342, 9934208, 9934209, 92.0), + // 日暮里・舎人ライナー 西新井大師西〜谷在家: 都営地下鉄 GTFS 151本 平均1.0分 (路線値 60km/h) + (99342, 9934209, 9934210, 91.0), + // 日暮里・舎人ライナー 谷在家〜舎人公園: 都営地下鉄 GTFS 151本 平均1.1分 (路線値 60km/h) + (99342, 9934210, 9934211, 92.0), + // 横浜市営地下鉄グリーンライン 川和町〜都筑ふれあいの丘: 横浜市営地下鉄 GTFS 85本 平均2.0分 (路線値 75km/h) + (99343, 9934302, 9934303, 67.0), + // 横浜市営地下鉄グリーンライン 都筑ふれあいの丘〜センター南: 横浜市営地下鉄 GTFS 85本 平均2.0分 (路線値 75km/h) + (99343, 9934303, 9934304, 71.0), + // 横浜市営地下鉄グリーンライン センター南〜センター北: 横浜市営地下鉄 GTFS 85本 平均1.0分 (路線値 75km/h) + (99343, 9934304, 9934305, 98.0), + // 横浜市営地下鉄グリーンライン センター北〜北山田: 横浜市営地下鉄 GTFS 85本 平均2.0分 (路線値 75km/h) + (99343, 9934305, 9934306, 68.0), + // 横浜市営地下鉄グリーンライン 北山田〜東山田: 横浜市営地下鉄 GTFS 85本 平均1.6分 (路線値 75km/h) + (99343, 9934306, 9934307, 99.0), + // 横浜市営地下鉄グリーンライン 東山田〜高田: 横浜市営地下鉄 GTFS 85本 平均2.0分 (路線値 75km/h) + (99343, 9934307, 9934308, 69.0), + // 横浜市営地下鉄グリーンライン 高田〜日吉本町: 横浜市営地下鉄 GTFS 85本 平均1.0分 (路線値 75km/h) + (99343, 9934308, 9934309, 112.0), + // 横浜市営地下鉄グリーンライン 日吉本町〜日吉: 横浜市営地下鉄 GTFS 85本 平均1.9分 (路線値 75km/h) + (99343, 9934309, 9934310, 56.0), + // 京都市営地下鉄烏丸線 国際会館〜松ヶ崎: 京都市営地下鉄 GTFS 127本 平均2.2分 (路線値 75km/h) + (99610, 9961001, 9961002, 58.0), + // 京都市営地下鉄烏丸線 松ヶ崎〜北山: 京都市営地下鉄 GTFS 127本 平均1.4分 (路線値 75km/h) + (99610, 9961002, 9961003, 101.0), + // 京都市営地下鉄烏丸線 北山〜北大路: 京都市営地下鉄 GTFS 127本 平均1.4分 (路線値 75km/h) + (99610, 9961003, 9961004, 102.0), + // 京都市営地下鉄烏丸線 北大路〜鞍馬口: 京都市営地下鉄 GTFS 127本 平均1.3分 (路線値 75km/h) + (99610, 9961004, 9961005, 94.0), + // 京都市営地下鉄烏丸線 鞍馬口〜今出川: 京都市営地下鉄 GTFS 127本 平均1.2分 (路線値 75km/h) + (99610, 9961005, 9961006, 92.0), + // 京都市営地下鉄烏丸線 今出川〜丸太町: 京都市営地下鉄 GTFS 127本 平均1.9分 (路線値 75km/h) + (99610, 9961006, 9961007, 79.0), + // 京都市営地下鉄烏丸線 丸太町〜烏丸御池: 京都市営地下鉄 GTFS 127本 平均1.1分 (路線値 75km/h) + (99610, 9961007, 9961008, 84.0), + // 京都市営地下鉄烏丸線 烏丸御池〜四条: 京都市営地下鉄 GTFS 127本 平均1.3分 (路線値 75km/h) + (99610, 9961008, 9961009, 97.0), + // 京都市営地下鉄烏丸線 四条〜五条: 京都市営地下鉄 GTFS 127本 平均1.2分 (路線値 75km/h) + (99610, 9961009, 9961010, 91.0), + // 京都市営地下鉄烏丸線 五条〜京都: 京都市営地下鉄 GTFS 127本 平均1.3分 (路線値 75km/h) + (99610, 9961010, 9961011, 99.0), + // 京都市営地下鉄烏丸線 京都〜九条: 京都市営地下鉄 GTFS 127本 平均1.3分 (路線値 75km/h) + (99610, 9961011, 9961012, 95.0), + // 京都市営地下鉄烏丸線 九条〜十条: 京都市営地下鉄 GTFS 127本 平均1.2分 (路線値 75km/h) + (99610, 9961012, 9961013, 90.0), + // 京都市営地下鉄烏丸線 十条〜くいな橋: 京都市営地下鉄 GTFS 127本 平均1.4分 (路線値 75km/h) + (99610, 9961013, 9961014, 106.0), + // 京都市営地下鉄烏丸線 くいな橋〜竹田: 京都市営地下鉄 GTFS 127本 平均1.1分 (路線値 75km/h) + (99610, 9961014, 9961015, 83.0), + // 京都市営地下鉄東西線 六地蔵〜石田: 京都市営地下鉄 GTFS 112本 平均1.6分 (路線値 65km/h) + (99611, 9961101, 9961102, 58.0), + // 京都市営地下鉄東西線 醍醐〜小野: 京都市営地下鉄 GTFS 112本 平均1.6分 (路線値 65km/h) + (99611, 9961103, 9961104, 71.0), + // 京都市営地下鉄東西線 小野〜椥辻: 京都市営地下鉄 GTFS 112本 平均1.7分 (路線値 65km/h) + (99611, 9961104, 9961105, 74.0), + // 京都市営地下鉄東西線 椥辻〜東野: 京都市営地下鉄 GTFS 112本 平均1.4分 (路線値 65km/h) + (99611, 9961105, 9961106, 104.0), + // 京都市営地下鉄東西線 東野〜山科: 京都市営地下鉄 GTFS 112本 平均1.4分 (路線値 65km/h) + (99611, 9961106, 9961107, 105.0), + // 京都市営地下鉄東西線 山科〜御陵: 京都市営地下鉄 GTFS 112本 平均2.0分 (路線値 65km/h) + (99611, 9961107, 9961108, 70.0), + // 京都市営地下鉄東西線 御陵〜蹴上: 京都市営地下鉄 GTFS 154本 平均2.1分 (路線値 65km/h) + (99611, 9961108, 9961109, 76.0), + // 京都市営地下鉄東西線 東山〜三条京阪: 京都市営地下鉄 GTFS 154本 平均1.1分 (路線値 65km/h) + (99611, 9961110, 9961111, 79.0), + // 京都市営地下鉄東西線 三条京阪〜京都市役所前: 京都市営地下鉄 GTFS 154本 平均1.0分 (路線値 65km/h) + (99611, 9961111, 9961112, 71.0), + // 京都市営地下鉄東西線 京都市役所前〜烏丸御池: 京都市営地下鉄 GTFS 154本 平均1.3分 (路線値 65km/h) + (99611, 9961112, 9961113, 93.0), + // 京都市営地下鉄東西線 烏丸御池〜二条城前: 京都市営地下鉄 GTFS 154本 平均1.3分 (路線値 65km/h) + (99611, 9961113, 9961114, 94.0), + // 京都市営地下鉄東西線 二条城前〜二条: 京都市営地下鉄 GTFS 154本 平均1.2分 (路線値 65km/h) + (99611, 9961114, 9961115, 91.0), + // 京都市営地下鉄東西線 二条〜西大路御池: 京都市営地下鉄 GTFS 154本 平均1.4分 (路線値 65km/h) + (99611, 9961115, 9961116, 100.0), + // --- END GENERATED --- +]; + +/// 隣接駅ペアに対応する実効最高速度(km/h)を返す。エントリが無ければ `None`。 +/// 駅の並び順(進行方向)は問わない。 +pub fn segment_speed_override_kmh( + line_cd: i32, + station_cd_a: i32, + station_cd_b: i32, +) -> Option { + let (lo, hi) = if station_cd_a <= station_cd_b { + (station_cd_a, station_cd_b) + } else { + (station_cd_b, station_cd_a) + }; + SEGMENT_SPEED_OVERRIDES + .binary_search_by(|&(lc, a, b, _)| (lc, a, b).cmp(&(line_cd, lo, hi))) + .ok() + .map(|i| SEGMENT_SPEED_OVERRIDES[i].3) +} + +/// 駅間別較正を適用してよい種別か(速度倍率 1.0 の各停系のみ)。 +/// +/// `arrival_estimation` と `GetTrainRoute` の速度プロファイルの両方から参照し、 +/// 適用条件を一箇所で管理する。 +pub fn segment_override_applies_to_kind(kind: Option) -> bool { + !matches!( + kind.and_then(|v| TrainTypeKind::try_from(v).ok()), + Some(TrainTypeKind::Express) + | Some(TrainTypeKind::LimitedExpress) + | Some(TrainTypeKind::HighSpeedRapid) + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn table_is_sorted_for_binary_search() { + // 二分探索の前提: 生成テーブルが (line_cd, cd小, cd大) 昇順であること。 + // スクリプトはソート済みで出力するが、手動編集事故を回帰検知する。 + assert!(SEGMENT_SPEED_OVERRIDES + .windows(2) + .all(|w| (w[0].0, w[0].1, w[0].2) < (w[1].0, w[1].1, w[1].2))); + // ペアは (小, 大) 正規化済みであること。 + assert!(SEGMENT_SPEED_OVERRIDES.iter().all(|&(_, a, b, _)| a < b)); + } + + #[test] + fn lookup_is_order_insensitive() { + // エントリの有無は生成結果に依存するため、両方向で同じ結果になることだけを + // 全エントリに対して検証する。 + for &(lc, a, b, v) in SEGMENT_SPEED_OVERRIDES { + assert_eq!(segment_speed_override_kmh(lc, a, b), Some(v)); + assert_eq!(segment_speed_override_kmh(lc, b, a), Some(v)); + } + assert_eq!(segment_speed_override_kmh(-1, 1, 2), None); + } + + #[test] + fn express_kinds_are_excluded() { + assert!(segment_override_applies_to_kind(None)); + assert!(segment_override_applies_to_kind(Some( + TrainTypeKind::Default as i32 + ))); + assert!(segment_override_applies_to_kind(Some( + TrainTypeKind::Rapid as i32 + ))); + assert!(!segment_override_applies_to_kind(Some( + TrainTypeKind::Express as i32 + ))); + assert!(!segment_override_applies_to_kind(Some( + TrainTypeKind::LimitedExpress as i32 + ))); + assert!(!segment_override_applies_to_kind(Some( + TrainTypeKind::HighSpeedRapid as i32 + ))); + } +} diff --git a/stationapi/src/domain/speed_table.rs b/stationapi/src/domain/speed_table.rs new file mode 100644 index 00000000..3eeb1b42 --- /dev/null +++ b/stationapi/src/domain/speed_table.rs @@ -0,0 +1,187 @@ +//! 路線 × 列車種別ごとの実効最高速度の較正テーブル。 +//! +//! 到着時間推定(`arrival_estimation`)の速度モデルは「路線種別の基本速度 × +//! 列車種別倍率」の一般則で決まるが、実勢速度が一般則から大きく外れる路線 +//! (120km/h 超の高速運転を行う私鉄優等、過密ダイヤ・急曲線で実効速度が +//! 上がらない路線など)は種別データだけでは表現できない。ここでは実路線の +//! 公表運転速度と時刻表所要時間への較正に基づく (line_cd, kind) 単位の +//! 上書き値を一元管理する。 +//! +//! 値の意味は「その路線・種別での実効巡航速度(km/h)」。理論上の車両性能では +//! なく、時刻表所要時間を運動学モデルで再現する値として較正している。 +//! 到着時間推定と GetTrainRoute の速度プロファイル(`resolve_speed_profile`)の +//! 両方から参照される。 +//! +//! エントリ追加の指針: +//! - 公表運転速度(例: 京急快特 120km/h、スカイライナー 160km/h)を起点にし、 +//! 実時刻表の所要時間と突き合わせて検証した路線だけを載せる。 +//! - 検証していない路線を推測で追加しない(一般則フォールバックに任せる)。 +//! - 公開 GTFS 時刻表が利用できる路線は `scripts/compute_speed_table.py` で +//! 自動較正し、下部の自動生成ブロックへ書き込む(手動テーブルが優先)。 + +use crate::proto::TrainTypeKind; + +/// (line_cd, kind, 実効最高速度 km/h)。kind は `TrainTypeKind` の値。 +/// 較正ベンチマーク: 各行のコメントの実所要時間(日中標準)に対し誤差 ±10% 以内。 +const LINE_SPEED_OVERRIDES: &[(i32, TrainTypeKind, f64)] = &[ + // 京急本線: 快特・特急 120km/h 運転。品川→横浜 快特 実17分。 + (27001, TrainTypeKind::Express, 120.0), + (27001, TrainTypeKind::LimitedExpress, 120.0), + // 小田急線: 最高 110km/h。新宿→町田 快速急行 実34分。 + (25001, TrainTypeKind::Express, 110.0), + // 東急東横線: 特急は最高 110km/h だが過密ダイヤ・急曲線で実効は各停並み。 + // 渋谷→横浜 特急 実27分。 + (26001, TrainTypeKind::LimitedExpress, 80.0), + // 京王井の頭線: 急行の実効速度。渋谷→吉祥寺 急行 実17分。 + (24006, TrainTypeKind::Express, 80.0), + // 京成本線(都心側): スカイライナーの上野→高砂間の実効速度。 + (23001, TrainTypeKind::LimitedExpress, 100.0), + // 成田スカイアクセス線: スカイライナー 160km/h 運転、アクセス特急 120km/h 運転。 + // 日暮里→空港第2ビル スカイライナー 実36分。 + (23006, TrainTypeKind::LimitedExpress, 160.0), + (23006, TrainTypeKind::Express, 120.0), + // つくばエクスプレス: 各停も 125km/h 運転(駅間が短いため実効値で較正)。 + // 秋葉原→つくば 普通 実66分。快速(kind=HighSpeedRapid)は一般則 120km/h で十分。 + (99309, TrainTypeKind::Default, 95.0), + // 阪急神戸本線: 特急 115km/h 運転。大阪梅田→神戸三宮 実27分。 + (34001, TrainTypeKind::LimitedExpress, 110.0), + // 近鉄特急(名阪甲特急ひのとり): 大阪難波→近鉄名古屋 実125分。 + // 難波線は地下線、大阪線は山間曲線区間を含むため実効値で較正。 + (31001, TrainTypeKind::LimitedExpress, 80.0), + (31005, TrainTypeKind::LimitedExpress, 115.0), + (31027, TrainTypeKind::LimitedExpress, 120.0), + // 都営大江戸線: リニア地下鉄で公表最高速度 70km/h(地下鉄一般則 75km/h より低い)。 + // 都営 GTFS の一様フィットは 60km/h だが、サンプルの大半が 6の字全区間直通 + // (光が丘⇔都庁前 環状部経由・実83〜88分)で、急曲線の多い環状部に引きずられ + // 放射部(落合南長崎→光が丘 実11分)が +14% になるため採用しない。 + // 公表最高速度 70km/h なら全ベンチマーク(放射部 実11分・新宿→光が丘 実24分・ + // 光が丘→都庁前 実22分・清澄白河→赤羽橋 実16分・全区間 実85分)が ±9% 以内。 + // 環状部南側(月島〜赤羽橋の河川横断・急曲線区間)の残差 -8% は路線一様速度では + // 解消できない(区間別較正が必要)。 + (99301, TrainTypeKind::Default, 70.0), +]; + +/// 公開 GTFS 時刻表からの自動較正エントリ。`scripts/compute_speed_table.py --apply` +/// がマーカー間を再生成する。手動テーブル(`LINE_SPEED_OVERRIDES`)と重複するキーは +/// スクリプト側で除外される。手動編集しないこと。 +const LINE_SPEED_OVERRIDES_GTFS: &[(i32, TrainTypeKind, f64)] = &[ + // --- BEGIN GENERATED (scripts/compute_speed_table.py) --- + // 東京メトロ銀座線 Default: 東京メトロ GTFS 15本 中央値34分 (一般則 75km/h) + (28001, TrainTypeKind::Default, 55.0), + // 東京メトロ丸ノ内線 Default: 東京メトロ GTFS 10本 中央値51分 (一般則 75km/h) + (28002, TrainTypeKind::Default, 65.0), + // 東京メトロ日比谷線 Default: 東京メトロ GTFS 7本 中央値45分 (一般則 75km/h) + (28003, TrainTypeKind::Default, 50.0), + // 東京メトロ東西線 Default: 東京メトロ GTFS 20本 中央値54分 (一般則 75km/h) + (28004, TrainTypeKind::Default, 60.0), + // 東京メトロ有楽町線 Default: 東京メトロ GTFS 19本 中央値52分 (一般則 75km/h) + (28006, TrainTypeKind::Default, 65.0), + // 東京メトロ半蔵門線 Default: 東京メトロ GTFS 10本 中央値32分 (一般則 75km/h) + (28008, TrainTypeKind::Default, 55.0), + // 東京メトロ南北線 Default: 東京メトロ GTFS 12本 中央値38分 (一般則 75km/h) + (28009, TrainTypeKind::Default, 65.0), + // 東京メトロ副都心線 Default: 東京メトロ GTFS 31本 中央値27分 (一般則 75km/h) + (28010, TrainTypeKind::Default, 55.0), + // 東京メトロ副都心線 Express: 東京メトロ GTFS 15本 中央値28分 (一般則 86km/h) + (28010, TrainTypeKind::Express, 60.0), + // 函館市電2系統 Default: 函館市電 GTFS 4本 中央値48分 (一般則 40km/h) + (99105, TrainTypeKind::Default, 20.0), + // 函館市電5系統 Default: 函館市電 GTFS 6本 中央値47分 (一般則 40km/h) + (99106, TrainTypeKind::Default, 25.0), + // 都営浅草線 Default: 都営地下鉄 GTFS 18本 中央値37分 (一般則 75km/h) + (99302, TrainTypeKind::Default, 65.0), + // 都営浅草線 LimitedExpress: 都営地下鉄 GTFS 5本 中央値21分 (一般則 90km/h) + (99302, TrainTypeKind::LimitedExpress, 55.0), + // 東京さくらトラム(都電荒川線) Default: 都営地下鉄 GTFS 13本 中央値56分 (一般則 40km/h) + (99305, TrainTypeKind::Default, 25.0), + // 横浜市営地下鉄ブルーライン Rapid: 横浜市営地下鉄 GTFS 3本 中央値61分 (一般則 75km/h) + (99316, TrainTypeKind::Rapid, 65.0), + // 多摩モノレール Default: 多摩都市モノレール GTFS 6本 中央値38分 (一般則 60km/h) + (99334, TrainTypeKind::Default, 50.0), + // りんかい線 Default: りんかい線 GTFS 8本 中央値20分 (一般則 80km/h) + (99337, TrainTypeKind::Default, 65.0), + // 京都市営地下鉄東西線 Default: 京都市営地下鉄 GTFS 9本 中央値33分 (一般則 75km/h) + (99611, TrainTypeKind::Default, 65.0), + // --- END GENERATED --- +]; + +/// (line_cd, kind) に対応する実効最高速度(km/h)を返す。エントリが無ければ `None`。 +/// +/// 手動較正テーブルを優先し、次に GTFS 自動較正テーブルを引く。 +/// `kind` が `None`(列車種別なし=路線内各駅停車扱い)は `Default` として引く。 +pub fn line_speed_override_kmh(line_cd: i32, kind: Option) -> Option { + let kind = TrainTypeKind::try_from(kind.unwrap_or(0)).ok()?; + LINE_SPEED_OVERRIDES + .iter() + .chain(LINE_SPEED_OVERRIDES_GTFS.iter()) + .find(|(lc, k, _)| *lc == line_cd && *k == kind) + .map(|(_, _, v)| *v) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn keikyu_express_kinds_are_overridden() { + approx( + line_speed_override_kmh(27001, Some(TrainTypeKind::Express as i32)), + Some(120.0), + ); + approx( + line_speed_override_kmh(27001, Some(TrainTypeKind::LimitedExpress as i32)), + Some(120.0), + ); + // 京急でも各停・快速は一般則にフォールバック。 + assert_eq!(line_speed_override_kmh(27001, None), None); + assert_eq!( + line_speed_override_kmh(27001, Some(TrainTypeKind::Rapid as i32)), + None + ); + } + + #[test] + fn none_kind_is_treated_as_default() { + // つくばエクスプレスの各停エントリは kind 未指定(路線クエリ)でも引ける。 + approx(line_speed_override_kmh(99309, None), Some(95.0)); + approx( + line_speed_override_kmh(99309, Some(TrainTypeKind::Default as i32)), + Some(95.0), + ); + // 快速(HighSpeedRapid)はエントリ無し → 一般則(80×1.5=120km/h)に任せる。 + assert_eq!( + line_speed_override_kmh(99309, Some(TrainTypeKind::HighSpeedRapid as i32)), + None + ); + } + + #[test] + fn unknown_line_or_kind_returns_none() { + assert_eq!(line_speed_override_kmh(11302, None), None); + assert_eq!(line_speed_override_kmh(27001, Some(999)), None); + } + + #[test] + fn gtfs_generated_entries_are_looked_up() { + // GTFS 自動較正ブロックのエントリも lookup 対象になる(値は再生成で変わり得る + // ため存在だけを確認する)。函館市電2系統は認証不要フィードなので常に較正可能。 + assert!(line_speed_override_kmh(99105, None).is_some()); + } + + #[test] + fn manual_table_takes_precedence_over_gtfs_on_key_collision() { + // 手動テーブルと同じキーが仮に GTFS テーブルにも存在した場合でも、 + // lookup は手動テーブルを先に引くため手動の値が返ることを回帰検知する。 + approx( + line_speed_override_kmh(27001, Some(TrainTypeKind::Express as i32)), + Some(120.0), + ); + } + + fn approx(actual: Option, expected: Option) { + match (actual, expected) { + (Some(a), Some(e)) => assert!((a - e).abs() < 1e-9, "expected {e}, got {a}"), + (a, e) => assert_eq!(a, e), + } + } +} diff --git a/stationapi/src/import.rs b/stationapi/src/import.rs index 7cebd2bb..5cb5f0dd 100644 --- a/stationapi/src/import.rs +++ b/stationapi/src/import.rs @@ -269,7 +269,6 @@ struct GtfsFeed { path: &'static str, url: &'static str, requires_consumer_key: bool, - experimental: bool, } const GTFS_FEEDS: &[GtfsFeed] = &[ @@ -279,7 +278,6 @@ const GTFS_FEEDS: &[GtfsFeed] = &[ path: "data/ToeiBus-GTFS", url: "https://api-public.odpt.org/api/v4/files/Toei/data/ToeiBus-GTFS.zip", requires_consumer_key: false, - experimental: false, }, GtfsFeed { id: "seibu", @@ -287,12 +285,10 @@ const GTFS_FEEDS: &[GtfsFeed] = &[ path: "data/SeibuBus-GTFS", url: "https://api.odpt.org/api/v4/files/SeibuBus/data/SeibuBus-GTFS.zip", requires_consumer_key: true, - experimental: true, }, ]; const DEFAULT_GTFS_BUS_LINE_COLOR: &str = "#1f63c6"; -const ENABLE_EXPERIMENTAL_BUS_FEATURE_ENV: &str = "ENABLE_EXPERIMENTAL_BUS_FEATURE"; fn scoped_gtfs_id(feed: &GtfsFeed, id: &str) -> String { format!("{}:{}", feed.id, id) @@ -318,18 +314,6 @@ fn gtfs_download_url(feed: &GtfsFeed) -> Result Vec { - GTFS_FEEDS - .iter() - .copied() - .filter(|feed| !feed.experimental || enabled) - .collect() -} - -fn enabled_gtfs_feeds() -> Vec { - gtfs_feeds_for_experimental_enabled(is_experimental_bus_feature_enabled()) -} - /// Download and extract GTFS data from ODPT API fn download_gtfs(feed: GtfsFeed) -> Result<(), Box> { let gtfs_path = Path::new(feed.path); @@ -423,7 +407,7 @@ pub async fn import_gtfs() -> Result<(), Box> { return Ok(()); } info!("[gtfs] bus feature enabled, starting download/extract"); - let enabled_feeds = enabled_gtfs_feeds(); + let enabled_feeds = GTFS_FEEDS.to_vec(); info!( "[gtfs] enabled feeds: {}", enabled_feeds @@ -1602,10 +1586,6 @@ fn is_bus_feature_disabled() -> bool { env_flag_enabled("DISABLE_BUS_FEATURE") } -fn is_experimental_bus_feature_enabled() -> bool { - env_flag_enabled(ENABLE_EXPERIMENTAL_BUS_FEATURE_ENV) -} - fn env_flag_enabled(name: &str) -> bool { match env::var(name) { Ok(s) => s.eq_ignore_ascii_case("true") || s == "1", @@ -3145,16 +3125,9 @@ mod tests { } #[test] - fn test_gtfs_feeds_for_experimental_enabled() { - let stable_feeds = gtfs_feeds_for_experimental_enabled(false); - assert_eq!( - stable_feeds.iter().map(|feed| feed.id).collect::>(), - vec!["toei"] - ); - - let all_feeds = gtfs_feeds_for_experimental_enabled(true); + fn test_gtfs_feeds() { assert_eq!( - all_feeds.iter().map(|feed| feed.id).collect::>(), + GTFS_FEEDS.iter().map(|feed| feed.id).collect::>(), vec!["toei", "seibu"] ); } diff --git a/stationapi/src/main.rs b/stationapi/src/main.rs index 317e0ad0..46c85f67 100644 --- a/stationapi/src/main.rs +++ b/stationapi/src/main.rs @@ -1,349 +1,349 @@ -mod import; - -use sqlx::postgres::PgPoolOptions; -use sqlx::{Connection, PgConnection}; -use stationapi::config::fetch_database_url; -use stationapi::infrastructure::company_repository::MyCompanyRepository; -use stationapi::infrastructure::line_repository::MyLineRepository; -use stationapi::infrastructure::station_repository::MyStationRepository; -use stationapi::infrastructure::train_type_repository::MyTrainTypeRepository; -use stationapi::presentation::controller::grpc::MyApi; -use stationapi::presentation::middleware::metrics::GrpcMetricsLayer; -use stationapi::proto; -use stationapi::proto::station_api_server::StationApiServer; -use stationapi::use_case::interactor::query::QueryInteractor; -use tonic::transport::Server; -use tonic_health::server::HealthReporter; - -use std::sync::Arc; -use std::{ - env::{self, VarError}, - net::{AddrParseError, SocketAddr}, -}; -use tracing::{info, warn}; - -#[derive(sqlx::FromRow)] -struct AliveRow { - pub alive: Option, -} - -async fn station_api_service_status(mut reporter: HealthReporter) { - let db_url = fetch_database_url(); - let mut conn = match PgConnection::connect(&db_url).await { - Ok(conn) => conn, - Err(e) => { - tracing::error!("Failed to connect to database: {}", e); - panic!("Failed to connect to database: {e}"); - } - }; - // NOTE: 今までの障害でDBのデータが一部だけ消えたという現象はなかったので駅数だけ見ればいい - let row = sqlx::query_as!( - AliveRow, - "SELECT COUNT(stations.station_cd) <> 0 AS alive FROM stations" - ) - .fetch_one(&mut conn) - .await - .expect("Failed to fetch station count"); - - if row.alive.unwrap_or(false) { - reporter.set_serving::>().await; - } else { - reporter.set_not_serving::>().await; - } -} - -#[tokio::main] -async fn main() -> std::result::Result<(), anyhow::Error> { - run().await -} - -async fn run() -> std::result::Result<(), anyhow::Error> { - tracing_subscriber::fmt::init(); - - if dotenv::from_filename(".env.local").is_err() { - warn!("Could not load .env.local"); - }; - - // Initialize Prometheus metrics exporter on a separate HTTP port - let metrics_host = fetch_metrics_host(); - let metrics_port = fetch_metrics_port(); - let metrics_addr: SocketAddr = format!("{metrics_host}:{metrics_port}") - .parse() - .expect("Failed to parse metrics address"); - metrics_exporter_prometheus::PrometheusBuilder::new() - .set_buckets(&[ - 0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0, - ]) - .expect("Failed to set histogram buckets") - .with_http_listener(metrics_addr) - .install() - .expect("Failed to install Prometheus exporter"); - info!("Prometheus metrics server listening on {}", metrics_addr); - - // Create schema first so that CSV and GTFS imports can run against existing tables. - if let Err(e) = import::create_schema().await { - return Err(anyhow::anyhow!("Failed to create schema: {}", e)); - } - - // Run GTFS import in parallel with CSV import. - // GTFS errors are non-fatal; server continues to serve CSV-only data. - // The error from import_gtfs is not Send, so stringify it before returning from the task. - let gtfs_handle = tokio::spawn(async { - info!("Starting GTFS import in background (parallel with CSV)..."); - import::import_gtfs().await.map_err(|e| e.to_string()) - }); - - if let Err(e) = import::import_csv().await { - return Err(anyhow::anyhow!("Failed to import CSV: {}", e)); - } - - // After CSV completes, wait for GTFS in background and run integration. - // This task lives past server startup; health check passes as soon as CSV is done. - tokio::spawn(async move { - info!("[post-csv] awaiting GTFS import handle..."); - let gtfs_wait_start = std::time::Instant::now(); - match gtfs_handle.await { - Ok(Ok(())) => { - info!( - "[post-csv] GTFS import completed, waited {:?}", - gtfs_wait_start.elapsed() - ); - } - Ok(Err(e)) => { - warn!( - "Failed to import GTFS data: {}. Continuing without GTFS data.", - e - ); - return; - } - Err(e) => { - warn!( - "GTFS import task panicked: {}. Continuing without GTFS data.", - e - ); - return; - } - } - - // Refresh statistics on freshly-populated gtfs_* tables before running - // the heavy CTE query in integrate_gtfs_to_stations. Without this, - // PostgreSQL plans against empty-table statistics (from the CSV-side - // ANALYZE that ran while GTFS was still importing) and picks a plan - // that effectively hangs on build_stop_route_mapping. - info!("[post-csv] running ANALYZE on gtfs_* tables before integration"); - let analyze_start = std::time::Instant::now(); - let pre_db_url = fetch_database_url(); - match sqlx::PgConnection::connect(&pre_db_url).await { - Ok(mut conn) => { - for table in [ - "gtfs_agencies", - "gtfs_routes", - "gtfs_stops", - "gtfs_calendar", - "gtfs_calendar_dates", - "gtfs_shapes", - "gtfs_trips", - "gtfs_stop_times", - "gtfs_feed_info", - ] { - let sql = format!("ANALYZE {table}"); - if let Err(e) = sqlx::query(&sql).execute(&mut conn).await { - warn!("Failed to ANALYZE {}: {}", table, e); - } - } - info!( - "[post-csv] gtfs_* ANALYZE done in {:?}", - analyze_start.elapsed() - ); - } - Err(e) => { - warn!("Failed to connect for pre-integrate ANALYZE: {}", e); - } - } - - // Integrate GTFS data into stations/lines tables - // This is wrapped in a transaction - if any step fails, all changes are rolled back - info!("[post-csv] starting GTFS integration"); - if let Err(e) = import::integrate_gtfs_to_stations().await { - tracing::error!( - "Failed to integrate GTFS to stations (transaction rolled back): {}", - e - ); - return; - } - - // Run ANALYZE after all GTFS imports are complete - let db_url = fetch_database_url(); - match sqlx::PgConnection::connect(&db_url).await { - Ok(mut conn) => { - if let Err(e) = sqlx::query("ANALYZE;").execute(&mut conn).await { - warn!("Failed to run ANALYZE: {}", e); - } else { - info!("ANALYZE completed after GTFS import."); - } - } - Err(e) => { - warn!("Failed to connect for ANALYZE: {}", e); - } - } - - info!("GTFS import completed in background."); - }); - - let db_url = &fetch_database_url(); - const DEFAULT_MAX_CONNECTIONS: u32 = 20; - let max_connections: u32 = match std::env::var("DATABASE_MAX_CONNECTIONS") { - Ok(v) => match v.parse::() { - Ok(n) if (1..=1000).contains(&n) => n, - Ok(n) => { - tracing::warn!( - "DATABASE_MAX_CONNECTIONS={} is out of range (1..=1000), using default {}", - n, - DEFAULT_MAX_CONNECTIONS - ); - DEFAULT_MAX_CONNECTIONS - } - Err(e) => { - tracing::warn!( - "Failed to parse DATABASE_MAX_CONNECTIONS: {}, using default {}", - e, - DEFAULT_MAX_CONNECTIONS - ); - DEFAULT_MAX_CONNECTIONS - } - }, - Err(_) => DEFAULT_MAX_CONNECTIONS, - }; - let pool = Arc::new( - match PgPoolOptions::new() - .max_connections(max_connections) - .connect(db_url) - .await - { - Ok(conn) => conn, - Err(e) => { - tracing::error!("Failed to connect to database: {}", e); - panic!("Failed to connect to database: {e}"); - } - }, - ); - - let (mut health_reporter, health_service) = tonic_health::server::health_reporter(); - health_reporter - .set_serving::>() - .await; - - tokio::spawn(station_api_service_status(health_reporter.clone())); - - let disable_grpc_web = fetch_disable_grpc_web_flag(); - let addr = fetch_addr()?; - - let station_repository = MyStationRepository::new(Arc::clone(&pool)); - let line_repository = MyLineRepository::new(Arc::clone(&pool)); - let train_type_repository = MyTrainTypeRepository::new(Arc::clone(&pool)); - let company_repository = MyCompanyRepository::new(Arc::clone(&pool)); - - let query_use_case = QueryInteractor { - station_repository, - line_repository, - train_type_repository, - company_repository, - }; - - let my_api = MyApi { query_use_case }; - - let svc = StationApiServer::new(my_api); - - let reflection_svc = tonic_reflection::server::Builder::configure() - .register_encoded_file_descriptor_set(proto::FILE_DESCRIPTOR_SET) - .build_v1() - .expect("Failed to build reflection service"); - - info!("StationAPI Server listening on {}", addr); - - if disable_grpc_web { - Server::builder() - .layer(GrpcMetricsLayer) - .add_service(health_service) - .add_service(svc) - .add_service(reflection_svc) - .serve(addr) - .await?; - } else { - Server::builder() - .accept_http1(true) - .layer(GrpcMetricsLayer) - .add_service(health_service) - .add_service(tonic_web::enable(svc)) - .add_service(tonic_web::enable(reflection_svc)) - .serve(addr) - .await?; - } - - Ok(()) -} - -fn fetch_port() -> u16 { - match env::var("PORT") { - Ok(s) => s.parse().expect("Failed to parse $PORT"), - Err(env::VarError::NotPresent) => { - warn!("$PORT is not set. Falling back to 50051."); - 50051 - } - Err(VarError::NotUnicode(_)) => panic!("$PORT should be written in Unicode."), - } -} - -fn fetch_addr() -> Result { - let port = fetch_port(); - match env::var("HOST") { - Ok(s) => format!("{s}:{port}").parse(), - Err(env::VarError::NotPresent) => { - let fallback_host = format!("[::1]:{port}"); - warn!("$HOST is not set. Falling back to {}.", fallback_host); - fallback_host.parse() - } - Err(VarError::NotUnicode(_)) => panic!("$HOST should be written in Unicode."), - } -} - -fn fetch_metrics_host() -> String { - match env::var("METRICS_HOST") { - Ok(s) => s, - Err(env::VarError::NotPresent) => { - warn!("$METRICS_HOST is not set. Falling back to 127.0.0.1."); - "127.0.0.1".to_owned() - } - Err(VarError::NotUnicode(_)) => panic!("$METRICS_HOST should be written in Unicode."), - } -} - -fn fetch_metrics_port() -> u16 { - match env::var("METRICS_PORT") { - Ok(s) => s.parse().expect("Failed to parse $METRICS_PORT"), - Err(env::VarError::NotPresent) => { - let port = fetch_port(); - let default = port.checked_add(1).unwrap_or_else(|| { - tracing::error!( - "Cannot derive default METRICS_PORT: PORT={} would overflow u16. Set $METRICS_PORT explicitly.", - port - ); - std::process::exit(1); - }); - warn!("$METRICS_PORT is not set. Falling back to {}.", default); - default - } - Err(VarError::NotUnicode(_)) => panic!("$METRICS_PORT should be written in Unicode."), - } -} - -fn fetch_disable_grpc_web_flag() -> bool { - match env::var("DISABLE_GRPC_WEB") { - Ok(s) => s.parse().expect("Failed to parse $DISABLE_GRPC_WEB"), - Err(env::VarError::NotPresent) => { - warn!("$DISABLE_GRPC_WEB is not set. Falling back to false."); - false - } - Err(VarError::NotUnicode(_)) => panic!("$DISABLE_GRPC_WEB should be written in Unicode."), - } -} +mod import; + +use sqlx::postgres::PgPoolOptions; +use sqlx::{Connection, PgConnection}; +use stationapi::config::fetch_database_url; +use stationapi::infrastructure::company_repository::MyCompanyRepository; +use stationapi::infrastructure::line_repository::MyLineRepository; +use stationapi::infrastructure::station_repository::MyStationRepository; +use stationapi::infrastructure::train_type_repository::MyTrainTypeRepository; +use stationapi::presentation::controller::grpc::MyApi; +use stationapi::presentation::middleware::metrics::GrpcMetricsLayer; +use stationapi::proto; +use stationapi::proto::station_api_server::StationApiServer; +use stationapi::use_case::interactor::query::QueryInteractor; +use tonic::transport::Server; +use tonic_health::server::HealthReporter; + +use std::sync::Arc; +use std::{ + env::{self, VarError}, + net::{AddrParseError, SocketAddr}, +}; +use tracing::{info, warn}; + +#[derive(sqlx::FromRow)] +struct AliveRow { + pub alive: Option, +} + +async fn station_api_service_status(mut reporter: HealthReporter) { + let db_url = fetch_database_url(); + let mut conn = match PgConnection::connect(&db_url).await { + Ok(conn) => conn, + Err(e) => { + tracing::error!("Failed to connect to database: {}", e); + panic!("Failed to connect to database: {e}"); + } + }; + // NOTE: 今までの障害でDBのデータが一部だけ消えたという現象はなかったので駅数だけ見ればいい + let row = sqlx::query_as!( + AliveRow, + "SELECT COUNT(stations.station_cd) <> 0 AS alive FROM stations" + ) + .fetch_one(&mut conn) + .await + .expect("Failed to fetch station count"); + + if row.alive.unwrap_or(false) { + reporter.set_serving::>().await; + } else { + reporter.set_not_serving::>().await; + } +} + +#[tokio::main] +async fn main() -> std::result::Result<(), anyhow::Error> { + run().await +} + +async fn run() -> std::result::Result<(), anyhow::Error> { + tracing_subscriber::fmt::init(); + + if dotenv::from_filename(".env.local").is_err() { + warn!("Could not load .env.local"); + }; + + // Initialize Prometheus metrics exporter on a separate HTTP port + let metrics_host = fetch_metrics_host(); + let metrics_port = fetch_metrics_port(); + let metrics_addr: SocketAddr = format!("{metrics_host}:{metrics_port}") + .parse() + .expect("Failed to parse metrics address"); + metrics_exporter_prometheus::PrometheusBuilder::new() + .set_buckets(&[ + 0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0, + ]) + .expect("Failed to set histogram buckets") + .with_http_listener(metrics_addr) + .install() + .expect("Failed to install Prometheus exporter"); + info!("Prometheus metrics server listening on {}", metrics_addr); + + // Create schema first so that CSV and GTFS imports can run against existing tables. + if let Err(e) = import::create_schema().await { + return Err(anyhow::anyhow!("Failed to create schema: {}", e)); + } + + // Run GTFS import in parallel with CSV import. + // GTFS errors are non-fatal; server continues to serve CSV-only data. + // The error from import_gtfs is not Send, so stringify it before returning from the task. + let gtfs_handle = tokio::spawn(async { + info!("Starting GTFS import in background (parallel with CSV)..."); + import::import_gtfs().await.map_err(|e| e.to_string()) + }); + + if let Err(e) = import::import_csv().await { + return Err(anyhow::anyhow!("Failed to import CSV: {}", e)); + } + + // After CSV completes, wait for GTFS in background and run integration. + // This task lives past server startup; health check passes as soon as CSV is done. + tokio::spawn(async move { + info!("[post-csv] awaiting GTFS import handle..."); + let gtfs_wait_start = std::time::Instant::now(); + match gtfs_handle.await { + Ok(Ok(())) => { + info!( + "[post-csv] GTFS import completed, waited {:?}", + gtfs_wait_start.elapsed() + ); + } + Ok(Err(e)) => { + warn!( + "Failed to import GTFS data: {}. Continuing without GTFS data.", + e + ); + return; + } + Err(e) => { + warn!( + "GTFS import task panicked: {}. Continuing without GTFS data.", + e + ); + return; + } + } + + // Refresh statistics on freshly-populated gtfs_* tables before running + // the heavy CTE query in integrate_gtfs_to_stations. Without this, + // PostgreSQL plans against empty-table statistics (from the CSV-side + // ANALYZE that ran while GTFS was still importing) and picks a plan + // that effectively hangs on build_stop_route_mapping. + info!("[post-csv] running ANALYZE on gtfs_* tables before integration"); + let analyze_start = std::time::Instant::now(); + let pre_db_url = fetch_database_url(); + match sqlx::PgConnection::connect(&pre_db_url).await { + Ok(mut conn) => { + for table in [ + "gtfs_agencies", + "gtfs_routes", + "gtfs_stops", + "gtfs_calendar", + "gtfs_calendar_dates", + "gtfs_shapes", + "gtfs_trips", + "gtfs_stop_times", + "gtfs_feed_info", + ] { + let sql = format!("ANALYZE {table}"); + if let Err(e) = sqlx::query(&sql).execute(&mut conn).await { + warn!("Failed to ANALYZE {}: {}", table, e); + } + } + info!( + "[post-csv] gtfs_* ANALYZE done in {:?}", + analyze_start.elapsed() + ); + } + Err(e) => { + warn!("Failed to connect for pre-integrate ANALYZE: {}", e); + } + } + + // Integrate GTFS data into stations/lines tables + // This is wrapped in a transaction - if any step fails, all changes are rolled back + info!("[post-csv] starting GTFS integration"); + if let Err(e) = import::integrate_gtfs_to_stations().await { + tracing::error!( + "Failed to integrate GTFS to stations (transaction rolled back): {}", + e + ); + return; + } + + // Run ANALYZE after all GTFS imports are complete + let db_url = fetch_database_url(); + match sqlx::PgConnection::connect(&db_url).await { + Ok(mut conn) => { + if let Err(e) = sqlx::query("ANALYZE;").execute(&mut conn).await { + warn!("Failed to run ANALYZE: {}", e); + } else { + info!("ANALYZE completed after GTFS import."); + } + } + Err(e) => { + warn!("Failed to connect for ANALYZE: {}", e); + } + } + + info!("GTFS import completed in background."); + }); + + let db_url = &fetch_database_url(); + const DEFAULT_MAX_CONNECTIONS: u32 = 20; + let max_connections: u32 = match std::env::var("DATABASE_MAX_CONNECTIONS") { + Ok(v) => match v.parse::() { + Ok(n) if (1..=1000).contains(&n) => n, + Ok(n) => { + tracing::warn!( + "DATABASE_MAX_CONNECTIONS={} is out of range (1..=1000), using default {}", + n, + DEFAULT_MAX_CONNECTIONS + ); + DEFAULT_MAX_CONNECTIONS + } + Err(e) => { + tracing::warn!( + "Failed to parse DATABASE_MAX_CONNECTIONS: {}, using default {}", + e, + DEFAULT_MAX_CONNECTIONS + ); + DEFAULT_MAX_CONNECTIONS + } + }, + Err(_) => DEFAULT_MAX_CONNECTIONS, + }; + let pool = Arc::new( + match PgPoolOptions::new() + .max_connections(max_connections) + .connect(db_url) + .await + { + Ok(conn) => conn, + Err(e) => { + tracing::error!("Failed to connect to database: {}", e); + panic!("Failed to connect to database: {e}"); + } + }, + ); + + let (mut health_reporter, health_service) = tonic_health::server::health_reporter(); + health_reporter + .set_serving::>() + .await; + + tokio::spawn(station_api_service_status(health_reporter.clone())); + + let disable_grpc_web = fetch_disable_grpc_web_flag(); + let addr = fetch_addr()?; + + let station_repository = MyStationRepository::new(Arc::clone(&pool)); + let line_repository = MyLineRepository::new(Arc::clone(&pool)); + let train_type_repository = MyTrainTypeRepository::new(Arc::clone(&pool)); + let company_repository = MyCompanyRepository::new(Arc::clone(&pool)); + + let query_use_case = QueryInteractor { + station_repository, + line_repository, + train_type_repository, + company_repository, + }; + + let my_api = MyApi { query_use_case }; + + let svc = StationApiServer::new(my_api); + + let reflection_svc = tonic_reflection::server::Builder::configure() + .register_encoded_file_descriptor_set(proto::FILE_DESCRIPTOR_SET) + .build_v1() + .expect("Failed to build reflection service"); + + info!("StationAPI Server listening on {}", addr); + + if disable_grpc_web { + Server::builder() + .layer(GrpcMetricsLayer) + .add_service(health_service) + .add_service(svc) + .add_service(reflection_svc) + .serve(addr) + .await?; + } else { + Server::builder() + .accept_http1(true) + .layer(GrpcMetricsLayer) + .add_service(health_service) + .add_service(tonic_web::enable(svc)) + .add_service(tonic_web::enable(reflection_svc)) + .serve(addr) + .await?; + } + + Ok(()) +} + +fn fetch_port() -> u16 { + match env::var("PORT") { + Ok(s) => s.parse().expect("Failed to parse $PORT"), + Err(env::VarError::NotPresent) => { + warn!("$PORT is not set. Falling back to 50051."); + 50051 + } + Err(VarError::NotUnicode(_)) => panic!("$PORT should be written in Unicode."), + } +} + +fn fetch_addr() -> Result { + let port = fetch_port(); + match env::var("HOST") { + Ok(s) => format!("{s}:{port}").parse(), + Err(env::VarError::NotPresent) => { + let fallback_host = format!("[::1]:{port}"); + warn!("$HOST is not set. Falling back to {}.", fallback_host); + fallback_host.parse() + } + Err(VarError::NotUnicode(_)) => panic!("$HOST should be written in Unicode."), + } +} + +fn fetch_metrics_host() -> String { + match env::var("METRICS_HOST") { + Ok(s) => s, + Err(env::VarError::NotPresent) => { + warn!("$METRICS_HOST is not set. Falling back to 127.0.0.1."); + "127.0.0.1".to_owned() + } + Err(VarError::NotUnicode(_)) => panic!("$METRICS_HOST should be written in Unicode."), + } +} + +fn fetch_metrics_port() -> u16 { + match env::var("METRICS_PORT") { + Ok(s) => s.parse().expect("Failed to parse $METRICS_PORT"), + Err(env::VarError::NotPresent) => { + let port = fetch_port(); + let default = port.checked_add(1).unwrap_or_else(|| { + tracing::error!( + "Cannot derive default METRICS_PORT: PORT={} would overflow u16. Set $METRICS_PORT explicitly.", + port + ); + std::process::exit(1); + }); + warn!("$METRICS_PORT is not set. Falling back to {}.", default); + default + } + Err(VarError::NotUnicode(_)) => panic!("$METRICS_PORT should be written in Unicode."), + } +} + +fn fetch_disable_grpc_web_flag() -> bool { + match env::var("DISABLE_GRPC_WEB") { + Ok(s) => s.parse().expect("Failed to parse $DISABLE_GRPC_WEB"), + Err(env::VarError::NotPresent) => { + warn!("$DISABLE_GRPC_WEB is not set. Falling back to false."); + false + } + Err(VarError::NotUnicode(_)) => panic!("$DISABLE_GRPC_WEB should be written in Unicode."), + } +} diff --git a/stationapi/src/use_case/dto.rs b/stationapi/src/use_case/dto.rs index 813c4073..584c7b77 100644 --- a/stationapi/src/use_case/dto.rs +++ b/stationapi/src/use_case/dto.rs @@ -1,8 +1,8 @@ -pub mod company; -pub mod line; -pub mod line_symbol; -pub mod simulation; -pub mod station; -pub mod station_number; -pub mod train_type; -pub mod tts; +pub mod company; +pub mod line; +pub mod line_symbol; +pub mod simulation; +pub mod station; +pub mod station_number; +pub mod train_type; +pub mod tts; diff --git a/stationapi/src/use_case/dto/simulation.rs b/stationapi/src/use_case/dto/simulation.rs index 74f22901..eae26371 100644 --- a/stationapi/src/use_case/dto/simulation.rs +++ b/stationapi/src/use_case/dto/simulation.rs @@ -1,3 +1,4 @@ +use crate::domain::speed_table::line_speed_override_kmh; use crate::proto::{LineType, TrainTypeKind}; #[derive(Debug, Clone, Copy, PartialEq)] @@ -20,6 +21,7 @@ const TRAM_MAX_SPEED: f64 = 11.111_111_111_11; // 40 km/h const LIMITED_EXPRESS_KIND_FLOOR_SPEED: f64 = 36.111_111_111_1; // 130 km/h pub fn resolve_speed_profile( + line_cd: i32, line_type: Option, is_bus: bool, kind: Option, @@ -40,6 +42,17 @@ pub fn resolve_speed_profile( _ => (NORMAL_MAX_SPEED, 0.83, 0.69), }; + // 路線 × 種別の較正テーブル(実路線の時刻表と公表運転速度に基づく実効値)が + // あれば最優先で使う。スカイライナー 160km/h のような路線種別・種別の + // 一般則では表現できない実勢速度をここで反映する。 + if let Some(v_kmh) = line_speed_override_kmh(line_cd, kind) { + return SpeedProfile { + max_speed: v_kmh / 3.6, + max_acceleration: accel, + max_deceleration: decel, + }; + } + // 種別による 130km/h は在来線の速達種別を底上げするための下限値。 // 新幹線(のぞみ等は kind=LimitedExpress)では路線種別の上限の方が速いため、 // 種別値で引き下げない。 @@ -63,7 +76,7 @@ mod tests { #[test] fn bus_overrides_line_type() { - let p = resolve_speed_profile(Some(LineType::BulletTrain as i32), true, None); + let p = resolve_speed_profile(0, Some(LineType::BulletTrain as i32), true, None); assert_eq!(p.max_speed, BUS_MAX_SPEED); assert_eq!(p.max_acceleration, BUS_MAX_ACCEL); assert_eq!(p.max_deceleration, BUS_MAX_DECEL); @@ -71,7 +84,7 @@ mod tests { #[test] fn bullet_train_profile() { - let p = resolve_speed_profile(Some(LineType::BulletTrain as i32), false, None); + let p = resolve_speed_profile(0, Some(LineType::BulletTrain as i32), false, None); assert_eq!(p.max_speed, BULLET_TRAIN_MAX_SPEED); assert_eq!(p.max_acceleration, 0.72); assert_eq!(p.max_deceleration, 0.56); @@ -79,14 +92,14 @@ mod tests { #[test] fn subway_has_stronger_deceleration() { - let p = resolve_speed_profile(Some(LineType::Subway as i32), false, None); + let p = resolve_speed_profile(0, Some(LineType::Subway as i32), false, None); assert_eq!(p.max_speed, SUBWAY_MAX_SPEED); assert_eq!(p.max_deceleration, 0.83); } #[test] fn unknown_line_type_falls_back_to_normal() { - let p = resolve_speed_profile(None, false, None); + let p = resolve_speed_profile(0, None, false, None); assert_eq!(p.max_speed, NORMAL_MAX_SPEED); assert_eq!(p.max_acceleration, 0.83); assert_eq!(p.max_deceleration, 0.69); @@ -95,6 +108,7 @@ mod tests { #[test] fn limited_express_kind_raises_speed_over_line_type() { let p = resolve_speed_profile( + 0, Some(LineType::Normal as i32), false, Some(TrainTypeKind::LimitedExpress as i32), @@ -109,6 +123,7 @@ mod tests { // のぞみ等は kind=LimitedExpress で登録されているが、 // 新幹線の路線上限(320km/h)を 130km/h に引き下げてはいけない。 let p = resolve_speed_profile( + 0, Some(LineType::BulletTrain as i32), false, Some(TrainTypeKind::LimitedExpress as i32), @@ -121,6 +136,7 @@ mod tests { #[test] fn high_speed_rapid_kind_raises_speed() { let p = resolve_speed_profile( + 0, Some(LineType::Normal as i32), false, Some(TrainTypeKind::HighSpeedRapid as i32), @@ -131,10 +147,51 @@ mod tests { #[test] fn default_kind_keeps_line_type_speed() { let p = resolve_speed_profile( + 0, Some(LineType::Normal as i32), false, Some(TrainTypeKind::Default as i32), ); assert_eq!(p.max_speed, NORMAL_MAX_SPEED); } + + #[test] + fn speed_table_override_takes_precedence() { + // 成田スカイアクセス線(23006)のスカイライナー(LimitedExpress)は + // 較正テーブルの 160km/h が種別下限 130km/h より優先される。 + let p = resolve_speed_profile( + 23006, + Some(LineType::Normal as i32), + false, + Some(TrainTypeKind::LimitedExpress as i32), + ); + assert!((p.max_speed - 160.0 / 3.6).abs() < 1e-9, "{}", p.max_speed); + assert_eq!(p.max_acceleration, 0.83); + assert_eq!(p.max_deceleration, 0.69); + + // 東急東横線(26001)の特急は実効 80km/h へ引き下げる(130km/h 下限より優先)。 + let p = resolve_speed_profile( + 26001, + Some(LineType::Normal as i32), + false, + Some(TrainTypeKind::LimitedExpress as i32), + ); + assert!((p.max_speed - 80.0 / 3.6).abs() < 1e-9, "{}", p.max_speed); + + // テーブルに無い (line, kind) は従来どおり(130km/h 下限)。 + let p = resolve_speed_profile( + 26001, + Some(LineType::Normal as i32), + false, + Some(TrainTypeKind::HighSpeedRapid as i32), + ); + assert_eq!(p.max_speed, LIMITED_EXPRESS_KIND_FLOOR_SPEED); + } + + #[test] + fn bus_ignores_speed_table() { + // バスは line_cd がテーブルに載る路線でも固定プロファイルのまま。 + let p = resolve_speed_profile(23006, Some(3), true, Some(7)); + assert_eq!(p.max_speed, BUS_MAX_SPEED); + } } diff --git a/stationapi/src/use_case/interactor/query.rs b/stationapi/src/use_case/interactor/query.rs index 8af18956..7836f833 100644 --- a/stationapi/src/use_case/interactor/query.rs +++ b/stationapi/src/use_case/interactor/query.rs @@ -24,8 +24,8 @@ fn filter_to_db_type(filter: TransportTypeFilter) -> Option { use crate::{ domain::{ arrival_estimation::{ - estimate_arrival_minutes, is_circular_route, select_circular_arc, EstimatedStop, - EstimationParams, + estimate_arrival_minutes_calibrated, is_circular_route, select_circular_arc, + EstimatedStop, EstimationParams, }, entity::{ company::Company, @@ -41,6 +41,7 @@ use crate::{ company_repository::CompanyRepository, line_repository::LineRepository, station_repository::StationRepository, train_type_repository::TrainTypeRepository, }, + segment_speed_table::{segment_override_applies_to_kind, segment_speed_override_kmh}, }, proto::{self, Route}, use_case::{ @@ -1086,19 +1087,55 @@ where }; let mut segments: Vec = Vec::with_capacity(sliced.len()); - let mut prev_coord: Option<(f64, f64)> = None; + // 経路スライス内で路線ごとに通過駅があるか。通過駅が無い路線では優等種別でも + // 実質各駅停車として走る(東急田園都市線の急行が半蔵門線内で各駅停車になる + // 直通など)ため、種別の速度を適用せず各停(Default)として扱う。 + // arrival_estimation と同様に端点は常に停車扱いとし、中間の通過駅だけを + // 優等扱いの根拠にする。 + let sliced_len = sliced.len(); + let mut line_has_pass: std::collections::HashMap = + std::collections::HashMap::new(); + for (i, station) in sliced.iter().enumerate() { + let is_endpoint = i == 0 || i + 1 == sliced_len; + let passed = !is_endpoint + && (station.stop_condition == proto::StopCondition::Not || station.pass == Some(1)); + let entry = line_has_pass.entry(station.line_cd).or_insert(false); + *entry = *entry || passed; + } + let mut prev_stop: Option<(f64, f64, i32)> = None; for station in sliced { let stops = station.stop_condition != proto::StopCondition::Not; - let distance_from_previous = match prev_coord { - Some((plat, plon)) => haversine_distance(plat, plon, station.lat, station.lon), + let distance_from_previous = match prev_stop { + Some((plat, plon, _)) => haversine_distance(plat, plon, station.lat, station.lon), None => 0.0, }; - prev_coord = Some((station.lat, station.lon)); let is_bus = station.transport_type == TransportType::Bus; let kind = station.train_type.as_ref().and_then(|tt| tt.kind); - let profile = resolve_speed_profile(station.line_type, is_bus, kind); + let effective_kind = if line_has_pass + .get(&station.line_cd) + .copied() + .unwrap_or(false) + { + kind + } else { + None + }; + let mut profile = + resolve_speed_profile(station.line_cd, station.line_type, is_bus, effective_kind); + // 隣接駅ペア単位の較正(GTFS 実ダイヤ由来)があれば、このセグメントの + // 最高速度を路線単位のプロファイルより優先して上書きする(各停系のみ)。 + if !is_bus && segment_override_applies_to_kind(effective_kind) { + if let Some((_, _, prev_cd)) = prev_stop { + if let Some(v_kmh) = + segment_speed_override_kmh(station.line_cd, prev_cd, station.station_cd) + { + profile.max_speed = v_kmh / 3.6; + } + } + } + prev_stop = Some((station.lat, station.lon, station.station_cd)); let grpc_station: proto::Station = station.into(); segments.push(proto::TrainRouteSegment { @@ -1199,15 +1236,29 @@ where // 環状経路(山手線・大阪環状線など)は線形スライスだと格納順の // 継ぎ目(例: 品川⇔大崎)を跨ぐ乗車で逆側の弧を返してしまうため、 // シームをラップする弧を選択する。 + // 迂回係数の較正母数には切り出し前の経路全体を渡す。切り出した区間の + // 駅間隔が路線平均と異なると較正が破綻するため(スライス較正バグ)。 if is_circular_route(route_stops) { let arc = select_circular_arc(route_stops, fi, ti, direction_id.is_some()); - result.extend(estimate_arrival_minutes(&arc, ¶ms)); + result.extend(estimate_arrival_minutes_calibrated( + &arc, + route_stops, + ¶ms, + )); } else if fi < ti { - result.extend(estimate_arrival_minutes(&route_stops[fi..=ti], ¶ms)); + result.extend(estimate_arrival_minutes_calibrated( + &route_stops[fi..=ti], + route_stops, + ¶ms, + )); } else { let mut segment: Vec<&Station> = route_stops[ti..=fi].to_vec(); segment.reverse(); - result.extend(estimate_arrival_minutes(&segment, ¶ms)); + result.extend(estimate_arrival_minutes_calibrated( + &segment, + route_stops, + ¶ms, + )); } } @@ -2603,6 +2654,214 @@ mod tests { assert!((est[0].cumulative_minutes - 0.0).abs() < 1e-9); } + /// 都営大江戸線の実データ(修正後CSV)を e_sort 順に再現する。 + /// 都庁前は環状部始端(9930100)と放射部側(9930101)の2レコード。 + fn oedo_stops() -> Vec { + let data: Vec<(i32, f64, f64)> = vec![ + (9930100, 35.690551, 139.69257), // 都庁前(A) + (9930102, 35.693315, 139.699155), // 新宿西口 + (9930103, 35.69792, 139.707549), // 東新宿 + (9930104, 35.699218, 139.718184), // 若松河田 + (9930105, 35.699518, 139.725027), // 牛込柳町 + (9930106, 35.700851, 139.735802), // 牛込神楽坂 + (9930107, 35.702927, 139.744999), // 飯田橋 + (9930108, 35.709598, 139.75325), // 春日 + (9930109, 35.707462, 139.760095), // 本郷三丁目 + (9930110, 35.707893, 139.774332), // 上野御徒町 + (9930111, 35.707045, 139.781958), // 新御徒町 + (9930112, 35.703236, 139.790931), // 蔵前 + (9930113, 35.696881, 139.797421), // 両国 + (9930114, 35.68796, 139.797042), // 森下 + (9930115, 35.682105, 139.798851), // 清澄白河 + (9930116, 35.671851, 139.796209), // 門前仲町 + (9930117, 35.664871, 139.784233), // 月島 + (9930118, 35.658507, 139.776442), // 勝どき + (9930119, 35.664895, 139.766915), // 築地市場 + (9930120, 35.663703, 139.760642), // 汐留 + (9930121, 35.656785, 139.75466), // 大門 + (9930122, 35.655007, 139.743642), // 赤羽橋 + (9930123, 35.656503, 139.736116), // 麻布十番 + (9930124, 35.663921, 139.731567), // 六本木 + (9930125, 35.672929, 139.72396), // 青山一丁目 + (9930126, 35.679831, 139.714932), // 国立競技場 + (9930127, 35.683218, 139.701666), // 代々木 + (9930128, 35.68869, 139.698812), // 新宿 + (9930101, 35.690551, 139.69257), // 都庁前(B) + (9930129, 35.689798, 139.684304), // 西新宿五丁目 + (9930130, 35.69709, 139.682279), // 中野坂上 + (9930131, 35.706891, 139.682987), // 東中野 + (9930132, 35.714035, 139.686356), // 中井 + (9930133, 35.723608, 139.683303), // 落合南長崎 + (9930134, 35.732538, 139.670653), // 新江古田 + (9930135, 35.737404, 139.65477), // 練馬 + (9930136, 35.742567043044, 139.64894845621), // 豊島園 + (9930137, 35.751452, 139.640236), // 練馬春日町 + (9930138, 35.758526, 139.628603), // 光が丘 + ]; + data.iter() + .enumerate() + .map(|(i, &(cd, lat, lon))| { + let mut s = create_test_station(cd, 9930100, 99301, None); + s.lat = lat; + s.lon = lon; + s.e_sort = 9930101 + i as i32; + s.line_type = Some(3); + s.average_distance = Some(1066.83815); + s.pass = Some(0); + s + }) + .collect() + } + + /// 都営大江戸線の「6の字」経路で、放射部⇔環状部を跨ぐ乗車の推定に + /// 都庁前(9930101)が正しく含まれることを検証する。 + /// + /// 都庁前は環状部始端(9930100)と放射部接続側(9930101)の2レコードで表現 + /// されるため、並び順が「…新宿→都庁前(9930101)→西新宿五丁目…」から + /// 崩れると、新宿⇔放射部を跨ぐ区間のスライスから都庁前が丸ごと欠落し、 + /// 全駅のETAが一駅分(約1.5〜2分)短くなる退行が起きる(#1589で発生、 + /// #1595 のデータ修正で解消)。データ側の並びは data_validator が守るが、 + /// スライスロジック側の退行もここで検知する。 + #[tokio::test] + async fn test_estimate_route_arrival_times_oedo_radial_loop_crossing() { + // 新宿(9930128)→光が丘(9930138): 都庁前(9930101)を跨ぐ放射部方面の乗車。 + let interactor = build_interactor(oedo_stops(), vec![], vec![], vec![]); + let est = interactor + .estimate_route_arrival_times(9930128, 9930138, &[], None) + .await + .unwrap(); + + let sequence: Vec = est.iter().map(|e| e.station_cd).collect(); + assert_eq!( + sequence, + vec![ + 9930128, // 新宿 + 9930101, // 都庁前 + 9930129, // 西新宿五丁目 + 9930130, // 中野坂上 + 9930131, // 東中野 + 9930132, // 中井 + 9930133, // 落合南長崎 + 9930134, // 新江古田 + 9930135, // 練馬 + 9930136, // 豊島園 + 9930137, // 練馬春日町 + 9930138, // 光が丘 + ], + "都庁前(9930101)が新宿の直後に含まれること" + ); + assert!(est + .windows(2) + .all(|w| w[1].cumulative_minutes > w[0].cumulative_minutes)); + // 実所要時間は約24分。都庁前が欠落すると約22分に縮む。 + let total = est.last().unwrap().cumulative_minutes; + assert!((22.5..26.0).contains(&total), "got {total}"); + } + + /// 東京メトロ半蔵門線の実データ(e_sort 順・実座標)。全駅各駅停車。 + /// 東急田園都市線からの直通急行も半蔵門線内は各駅停車になる。 + fn hanzomon_stops(kind: Option) -> Vec { + let data: Vec<(i32, f64, f64)> = vec![ + (2800801, 35.659066, 139.701), // 渋谷 + (2800802, 35.665247, 139.712314), // 表参道 + (2800803, 35.672765, 139.724159), // 青山一丁目 + (2800804, 35.678757, 139.740258), // 永田町 + (2800805, 35.685703, 139.74163), // 半蔵門 + (2800806, 35.695589, 139.751948), // 九段下 + (2800807, 35.695966, 139.757606), // 神保町 + (2800808, 35.68686, 139.764107), // 大手町 + (2800809, 35.684908, 139.773147), // 三越前 + (2800810, 35.682683, 139.785377), // 水天宮前 + (2800811, 35.682105, 139.798851), // 清澄白河 + (2800814, 35.689073, 139.815681), // 住吉 + (2800812, 35.697578, 139.814941), // 錦糸町 + (2800813, 35.710702, 139.812935), // 押上 + ]; + data.iter() + .enumerate() + .map(|(i, &(cd, lat, lon))| { + let mut s = create_test_station(cd, cd, 28008, None); + s.lat = lat; + s.lon = lon; + s.e_sort = 2800801 + i as i32; + s.line_type = Some(3); + s.average_distance = Some(1283.41956); + s.pass = Some(0); + s.kind = kind; + s + }) + .collect() + } + + /// 直通急行の線内各駅停車の回帰テスト。 + /// 半蔵門線内は急行(Express)でも全駅に停車するため、経路スライス内に + /// 通過駅が無ければ各停と同じ推定になること(実所要 押上→神保町 約18分)。 + /// 修正前は種別倍率(×1.15)が掛かり駅間別較正も外れて約15分に縮んでいた。 + #[tokio::test] + async fn test_estimate_route_arrival_times_through_express_all_stops_matches_local() { + let local = build_interactor(hanzomon_stops(None), vec![], vec![], vec![]); + let local_est = local + .estimate_route_arrival_times(2800813, 2800807, &[], None) + .await + .unwrap(); + + let express_kind = Some(proto::TrainTypeKind::Express as i32); + let express = build_interactor(hanzomon_stops(express_kind), vec![], vec![], vec![]); + let express_est = express + .estimate_route_arrival_times(2800813, 2800807, &[], None) + .await + .unwrap(); + + assert_eq!(local_est.len(), 8); + assert_eq!(express_est.len(), 8); + for (e, l) in express_est.iter().zip(local_est.iter()) { + assert!( + (e.cumulative_minutes - l.cumulative_minutes).abs() < 1e-9, + "express {} != local {}", + e.cumulative_minutes, + l.cumulative_minutes + ); + } + // 実所要 18 分に対し較正ポリシーの許容誤差 ±10%。 + let total = express_est.last().unwrap().cumulative_minutes; + assert!((16.2..19.8).contains(&total), "got {total}"); + } + + /// 環状部南側(河川横断の急勾配・急曲線区間)の駅間別較正の回帰テスト。 + /// 路線一様速度(70km/h)では実16分に対し約14.7分と -8% に過小評価される。 + /// GTFS 実ダイヤ由来の駅間別較正(segment_speed_table)で ±5% 以内に入る。 + #[tokio::test] + async fn test_estimate_route_arrival_times_oedo_kiyosumi_to_akabanebashi() { + // 清澄白河(9930115)→赤羽橋(9930122): 実所要時間 16分。 + let interactor = build_interactor(oedo_stops(), vec![], vec![], vec![]); + let est = interactor + .estimate_route_arrival_times(9930115, 9930122, &[], None) + .await + .unwrap(); + + assert_eq!(est.len(), 8); + assert_eq!(est.first().unwrap().station_cd, 9930115); + assert_eq!(est.last().unwrap().station_cd, 9930122); + let total = est.last().unwrap().cumulative_minutes; + assert!((15.0..17.0).contains(&total), "got {total}"); + } + + #[tokio::test] + async fn test_estimate_route_arrival_times_oedo_hikarigaoka_to_tochomae() { + // 光が丘(9930138)→都庁前(9930101): 放射部の全区間。実所要時間は約22分。 + let interactor = build_interactor(oedo_stops(), vec![], vec![], vec![]); + let est = interactor + .estimate_route_arrival_times(9930138, 9930101, &[], None) + .await + .unwrap(); + + assert_eq!(est.len(), 11); + assert_eq!(est.first().unwrap().station_cd, 9930138); + assert_eq!(est.last().unwrap().station_cd, 9930101); + let total = est.last().unwrap().cumulative_minutes; + assert!((20.0..24.0).contains(&total), "got {total}"); + } + #[tokio::test] async fn test_estimate_route_arrival_times_circular_closed_loop_dedups_endpoint() { // 先頭駅が末尾にも重複格納された「閉じた」環状データ(ポートライナー等)。