etalab / transport-validator

GTFS validator
https://transport.data.gouv.fr/validation/
MIT License
38 stars 10 forks source link

How to evaluate validation result? #109

Closed dancesWithCycles closed 3 years ago

dancesWithCycles commented 3 years ago

Hi folks, How are you? Thank you very much for creating and maintaining this repository. I am running the validator the first time on a GTFS archive. You see my call and result below. I am wondering, how do you usually process this kind of result. It does not look very friendly to be processed by human eyes. I appreciate any hint about evaluating the validators result!

Call:

cargo run --release -- -i ~/gtfs/vrn/vrn_gtfs_11.12.2020_0.zip

Here is a snippet from the result, as the entire result humongous:

[...],{"id":"vrn-40-698-1","object_type":"Route","name":"Fürth - Rimbach - Heppenheim - Bensheim"}],"details":"travel duration is null, but there are 2117 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:06431:419:0:Ri O","object_type":"Stop","object_name":"Bürstadt, Beethovenplatz","related_objects":[{"id":"de:06431:421:0:1","object_type":"Stop","name":"Bürstadt, Erich-Kästner-Schule"},{"id":"vrn-40-645-1","object_type":"Route","name":"Schulverkehr Groß-Rohrheim - Biblis - Bürstadt - Lampertheim"}],"details":"travel duration is null, but there are 649 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:08128:12022:0:Bus1","object_type":"Stop","object_name":"Bad Mgh., Herrenwiesen/Diesel.","related_objects":[{"id":"de:08128:12007:0:Bus1","object_type":"Stop","name":"Bad Mergentheim, Bembe"},{"id":"vrn-49-945-1","object_type":"Route","name":"Bad Mergentheim - Königshofen - Lauda"}],"details":"travel duration is null, but there are 599 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:07340:95210:0:RiO","object_type":"Stop","object_name":"Ruppertsweiler, Semler","related_objects":[{"id":"de:07340:95206:0:RiO","object_type":"Stop","name":"Ruppertsweiler, Ortsmitte"},{"id":"vrn-50-256-1","object_type":"Route","name":"Pirmasens - Lemberg - Glashütte / Münchweiler - Leimen"}],"details":"travel duration is null, but there are 548 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:07332:470:2:Bus","object_type":"Stop","object_name":"Deidesheim, Bahnhof","related_objects":[{"id":"de:07332:747","object_type":"Stop","name":"Forst, Waage"},{"id":"vrn-22-512-1","object_type":"Route","name":"Forst - Deidesheim - Königsbach - Haardt - Neustadt"}],"details":"travel duration is null, but there are 1464 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:07340:3784:0:RiN","object_type":"Stop","object_name":"Fischbach/Dahn, Grundschule","related_objects":[{"id":"de:07340:5978:0:RiW","object_type":"Stop","name":"Fischbach/Dahn, Feuerwehrhaus"},{"id":"vrn-50-251-1","object_type":"Route","name":"(Hinterweidenthal) - Dahn - Bundenthal - Fischbach/Dahn - Ludwigswinkel"}],"details":"travel duration is null, but there are 603 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:06437:23328","object_type":"Stop","object_name":"Ober-Sensbach, Gasthaus Pflug","related_objects":[{"id":"de:06437:23330","object_type":"Stop","name":"Ober-Sensbach, Das Tolle Rott"},{"id":"vrn-48-53t-1","object_type":"Route","name":"(Hesselbach) - Gaimühle - Sensbachtal - Hetzbach - Beeerfelden"}],"details":"travel duration is null, but there are 1766 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:07317:92168:0:1","object_type":"Stop","object_name":"Pirmasens, Mississippi Ave. N.","related_objects":[{"id":"de:07317:92014:0:1","object_type":"Stop","name":"Pirmasens, Zweibrücker Straße 148"},{"id":"vrn-82-11-1","object_type":"Route","name":"Ruftaxi Pirmasens Hbf-Exerzierplatz-Sommerwald-Husterhöhe-Fehrbach-Hengsberg-Hbf"}],"details":"travel duration is null, but there are 790 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:07333:4823","object_type":"Stop","object_name":"Morschheim, Römerhof","related_objects":[{"id":"de:07333:4894","object_type":"Stop","name":"Oberwiesen, Ort"},{"id":"vrn-80-902-1","object_type":"Route","name":"Gaugrehweiler - Kriegsfeld - Kirchheimbolanden - Eisenberg"}],"details":"travel duration is null, but there are 4930 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:06437:16146","object_type":"Stop","object_name":"Ober-Ostern, Kindergarten","related_objects":[{"id":"de:06437:23997","object_type":"Stop","name":"Ober-Ostern, Oberdorf"},{"id":"vrn-48-14t-1","object_type":"Route","name":"Reichelsheim - Ostern - Weschnitz - Rohrbach - Reichelsheim"},{"id":"vrn-48-14b-1","object_type":"Route","name":"Reichelsheim - Ostern - Weschnitz - Rohrbach - Reichelsheim"}],"details":"travel duration is null, but there are 646 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:08225:4795:0:RiS","object_type":"Stop","object_name":"Waldkatzenbach, Feriendorf","related_objects":[{"id":"de:08225:4770:0:RiN","object_type":"Stop","name":"Waldkatzenbach, Meisentalsiedl"},{"id":"vrn-33-821-1","object_type":"Route","name":"Buchen - Mudau - Eberbach"}],"details":"travel duration is null, but there are 519 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:07320:93003:0:RiS","object_type":"Stop","object_name":"Mittelbach, Altheimer Straße","related_objects":[{"id":"de:07320:93048:0:1","object_type":"Stop","name":"Mittelbach, Hengstbach"},{"id":"vrn-83-222b-1","object_type":"Route","name":"Europaring (Ernstweiler) - Stadtmitte - Mittelbach"}],"details":"travel duration is null, but there are 670 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:08225:15178","object_type":"Stop","object_name":"Haßmersheim, Steg","related_objects":[{"id":"de:08225:53:0:RiW","object_type":"Stop","name":"Neckarzimmern, Schleuse"},{"id":"vrn-33-828-1","object_type":"Route","name":"Neckarmühlbach - Haßmersheim/Hüffenhardt - Mosbach"}],"details":"travel duration is null, but there are 1920 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:06437:23242","object_type":"Stop","object_name":"Ober-Mossau, Friedrich","related_objects":[{"id":"de:06437:23244","object_type":"Stop","name":"Ober-Mossau, Oberdorf"},{"id":"vrn-48-45t-1","object_type":"Route","name":"Hiltersklingen - Mossautal - Steinbuch - Michelstadt - Erbach"},{"id":"vrn-48-45b-1","object_type":"Route","name":"Hiltersklingen - Mossautal - Steinbuch - Michelstadt - Erbach"}],"details":"travel duration is null, but there are 824 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:07337:2728:0:RiO","object_type":"Stop","object_name":"Annweiler, Heller","related_objects":[{"id":"de:07337:8054:1:RiO","object_type":"Stop","name":"Annweiler, Bahnhof"},{"id":"vrn-50-525-1","object_type":"Route","name":"Annweiler - Wernersberg - Lug - Vorderweidenthal - (Bad Bergzabern)"}],"details":"travel duration is null, but there are 826 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:08225:2705:0:RiS","object_type":"Stop","object_name":"Mosbach, Duale Hochschule","related_objects":[{"id":"de:08225:6039:0:RiO","object_type":"Stop","name":"Mosbach, Schorre"},{"id":"vrn-33-835-1","object_type":"Route","name":"Mosbach - Billigheim - Oberschefflenz"}],"details":"travel duration is null, but there are 538 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:06437:23231","object_type":"Stop","object_name":"Hiltersklingen, Mitte","related_objects":[{"id":"de:06437:23232","object_type":"Stop","name":"Hiltersklingen, Oberdorf"},{"id":"vrn-48-45t-1","object_type":"Route","name":"Hiltersklingen - Mossautal - Steinbuch - Michelstadt - Erbach"}],"details":"travel duration is null, but there are 1109 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:07316:3131","object_type":"Stop","object_name":"Lachen, Linde","related_objects":[{"id":"de:07316:55557","object_type":"Stop","name":"Lachen, Bonhoefferstraße"},{"id":"vrn-32-507-1","object_type":"Route","name":"Neustadt - Geinsheim - Weingarten - Harthausen - Speyer"}],"details":"travel duration is null, but there are 566 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:06437:23951","object_type":"Stop","object_name":"Ober-Mossau, Brau. Schmucker","related_objects":[{"id":"de:06437:23950","object_type":"Stop","name":"Unter-Mossau, Am Rehholz"},{"id":"vrn-48-45b-1","object_type":"Route","name":"Hiltersklingen - Mossautal - Steinbuch - Michelstadt - Erbach"}],"details":"travel duration is null, but there are 582 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:08222:5698","object_type":"Stop","object_name":"Rheinau, Dortmunder Straße","related_objects":[{"id":"de:08222:2349","object_type":"Stop","name":"Rheinau, Riedwiesen"},{"id":"vrn-17-48-1","object_type":"Route","name":"MA Rheinau Bahnhof - Am Rheinauer See - MA Rheinauhafen"}],"details":"travel duration is null, but there are 558 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:06437:23032","object_type":"Stop","object_name":"Airlenbach, Eiche","related_objects":[{"id":"de:06437:23034","object_type":"Stop","name":"Airlenbach, Liederbach"},{"id":"vrn-48-54t-1","object_type":"Route","name":"Beerfelden - Finkenbach/Rothenberg - Hirschhorn"}],"details":"travel duration is null, but there are 1284 meters between the stops"},{"severity":"Warning","issue_type":"NullDuration","object_id":"de:07317:92037:0:1","object_type":"Stop","object_name":"Pirmasens, Christiansgasse","related_objects":[{"id":"de:07317:92049:0:1","object_type":"Stop","name":"Pirmasens, Parkwaldsiedlung"},{"id":"vrn-82-12-1","object_type":"Route","name":"Ruftaxi Pirmasens Hbf-Exerzierpl.-Horeb-Kirchberg-Niedersimten-Ruhbank-Erlenbr."}],"details":"travel duration is null, but there are 1554 meters between the stops"}],"MissingCoordinates":[{"severity":"Warning","issue_type":"MissingCoordinates","object_id":"de:07311:775","object_type":"Stop","object_name":"775","related_objects":[],"details":"Latitude and longitude are missing"},{"severity":"Warning","issue_type":"MissingCoordinates","object_id":"de:08221:1700","object_type":"Stop","object_name":"1700","related_objects":[],"details":"Latitude and longitude are missing"}],"DuplicateStops":[{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08226:566:0:1","object_type":"Stop","object_name":"Eberbach, Verbindungsweg","related_objects":[{"id":"de:08226:566:0:2","object_type":"Stop","name":"Eberbach, Verbindungsweg"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:07319:4387:0:2","object_type":"Stop","object_name":"Rheindürkheim, Rhenania","related_objects":[{"id":"de:07319:4387:0:1","object_type":"Stop","name":"Rheindürkheim, Rhenania"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08215:32529:0:1","object_type":"Stop","object_name":"Östringen, Mitte","related_objects":[{"id":"de:08215:32529:0:2","object_type":"Stop","name":"Östringen, Mitte"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:07336:96261:0:2","object_type":"Stop","object_name":"Konken, Ortsmitte","related_objects":[{"id":"de:07336:96261:0:1","object_type":"Stop","name":"Konken, Ortsmitte"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:07336:96261:0:2","object_type":"Stop","object_name":"Konken, Ortsmitte","related_objects":[{"id":"de:07336:96261:0:3","object_type":"Stop","name":"Konken, Ortsmitte"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:07336:96261:0:1","object_type":"Stop","object_name":"Konken, Ortsmitte","related_objects":[{"id":"de:07336:96261:0:3","object_type":"Stop","name":"Konken, Ortsmitte"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08221:1196:2:BRiW","object_type":"Stop","object_name":"Heidelberg, Altes Hallenbad","related_objects":[{"id":"de:08221:1196:1:RiW","object_type":"Stop","name":"Heidelberg, Altes Hallenbad"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08221:1168:1:TrRiN","object_type":"Stop","object_name":"Heidelberg, Seegarten","related_objects":[{"id":"de:08221:1168:2:BuRiN","object_type":"Stop","name":"Heidelberg, Seegarten"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08222:5548:1:TrRiS","object_type":"Stop","object_name":"Mannheim, Alte Feuerwache","related_objects":[{"id":"de:08222:5548:2:BuRiS","object_type":"Stop","name":"Mannheim, Alte Feuerwache"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08221:1168:1:TrRiW","object_type":"Stop","object_name":"Heidelberg, Seegarten","related_objects":[{"id":"de:08221:1168:2:BuRiW","object_type":"Stop","name":"Heidelberg, Seegarten"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:07331:8007:2:Bus","object_type":"Stop","object_name":"Saulheim, Bahnhof","related_objects":[{"id":"de:07331:8007:2","object_type":"Stop","name":"Saulheim, Bahnhof"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08222:2451:2:NBus","object_type":"Stop","object_name":"Mannheim, Paradeplatz","related_objects":[{"id":"de:08222:2451:2:A","object_type":"Stop","name":"Mannheim, Paradeplatz"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08226:4149:1:RiW","object_type":"Stop","object_name":"Weinheim, Wormser Straße","related_objects":[{"id":"de:08226:4149:2","object_type":"Stop","name":"Weinheim, Wormser Straße"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08221:1196:1:RiO","object_type":"Stop","object_name":"Heidelberg, Altes Hallenbad","related_objects":[{"id":"de:08221:1196:2:BRiO","object_type":"Stop","name":"Heidelberg, Altes Hallenbad"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08221:1193:1:TrRiO","object_type":"Stop","object_name":"Heidelberg, Stadtbücherei","related_objects":[{"id":"de:08221:1193:2:Bus O","object_type":"Stop","name":"Heidelberg, Stadtbücherei"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08226:2971:0:Ri S","object_type":"Stop","object_name":"Dilsberg, Blumenstrich","related_objects":[{"id":"de:08226:2971:0:Ri N","object_type":"Stop","name":"Dilsberg, Blumenstrich"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:06431:1590:2:2","object_type":"Stop","object_name":"Hirschhorn, Bahnhof","related_objects":[{"id":"de:06431:1590:2:1","object_type":"Stop","name":"Hirschhorn, Bahnhof"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08221:1185:1:RiN","object_type":"Stop","object_name":"Heidelberg, Rheinstraße","related_objects":[{"id":"de:08221:1185:2:RiN","object_type":"Stop","name":"Heidelberg, Rheinstraße"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08221:1246:0:RiW","object_type":"Stop","object_name":"Neuenh., Med. Kl./Chirurg./Zoo","related_objects":[{"id":"de:08221:1246","object_type":"Stop","name":"Neuenh., Med. Kl./Chirurg./Zoo"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08222:2520:0:NBus","object_type":"Stop","object_name":"Neuostheim, Maimarkt","related_objects":[{"id":"de:08222:2520:0:RiN","object_type":"Stop","name":"Neuostheim, Maimarkt"}]},{"severity":"Information","issue_type":"DuplicateStops","object_id":"de:08222:2410:0:TrRiN","object_type":"Stop","object_name":"Mannheim, Carl-Benz-Straße","related_objects":[{"id":"de:08222:2410:0:BuRiN","object_type":"Stop","name":"Mannheim, Carl-Benz-Straße"}]}]}}

Cheers!

fchabouis commented 3 years ago

Hello !

You can see how we use it on the website we are working for, the french national access point for mobility data. => https://transport.data.gouv.fr/validation?locale=en

You can of course use the tool online if you like, or see a possible user friendly presentation of the validator results.

Note that the validator by himself do not give the possibility to show a map, because the stops coordinates are not in the output. To do that, we run a second tool called gtfs-to-geojson and mix the output of both tools.

dancesWithCycles commented 3 years ago

Hi @fchabouis , thank you very much for your helpful and prompt reply. Does the validator has any options or parameters to present the command line output in a more user friendly manner?

fchabouis commented 3 years ago

Can you give it another try with a yaml formatted output @dancesWithCycles ? Thank you @Tristramg for the PR.

dancesWithCycles commented 3 years ago

Hi @fchabouis , hi @Tristramg , Thank you so much for your help. Using the --output-format yaml switch really makes the output more human friendly to read.

Cheers!

Tristramg commented 3 years ago

I'm glad that this small tweak helps you. Out of curiosity, in which context are you using the validator?

Le mer. 12 mai 2021 à 15:32, Stefan Begerad @.***> a écrit :

Hi @fchabouis https://github.com/fchabouis , hi @Tristramg https://github.com/Tristramg , Thank you so much for your help. Using the --output-format yaml switch really makes the output more human friendly to read.

Cheers!

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/etalab/transport-validator/issues/109#issuecomment-839775069, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAC7S2ORT6MIU45K4A4473TNJ7NRANCNFSM44TX5GLQ .

dancesWithCycles commented 3 years ago

Hi @Tristramg , I am an engineer dedicated to and working as sole proprietor/freelancer for SOFTWARE FREEDOM.

I was made aware of the French National Access Point in the last German Open Transport Meetup (GitHub).

I am developer and maintainer of the Dede Realtime map (GitHub).

I started last year to learn the GTFS und GTFS Realtime specification and now analyze and validate schedule and realtime feeds from German transport authorities.

Does this answers your question? How about you?

Cheers!