Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update geo dependencies #743

Merged
merged 6 commits into from
Jun 21, 2021
Merged

Conversation

michaelkirk
Copy link
Contributor

I work on some of the libraries you use and wanted to see how some recent changes affect our users.

Thought I might as well share the changes in case you'd like to update.

src/utils.rs Outdated
wkt.items
.pop()
.unwrap()
.try_into()
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We now utilize idiomatic Rust's TryInto trait, rather than having our own function only for wkt.

Copy link
Contributor

@woshilapin woshilapin Feb 11, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should be able to replace it with this

let wkt = wkt::Wkt::from_str(&s).map_err(serde::de::Error::custom)?;
use std::convert::TryInto;
wkt.try_into().map_err(serde::de::Error::custom)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

indeed! Fixed.

Do you think the WKT crate should add methods like these for optional serde integration? It seems likely to be useful to other people.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It actually might be helpful indeed, so I took the opportunity to contribute back. See georust/wkt#59.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wonderful! I'll take a look.

@michaelkirk
Copy link
Contributor Author

I should add, three tests failed locally for me, but I did not investigate, since the same ones failed in the same way before these changes.

failures:
    test_write_netex_france_from_gtfs
    test_write_netex_france_from_ntfs
    validate_xml_schemas
full output
running 205 tests
test add_prefix::tests::collection_referential ... ok
test add_prefix::tests::collection_referential_and_schedule ... ok
test add_prefix::tests::collection_deprecated ... ok
test add_prefix::tests::collection_no_prefix ... ok
test add_prefix::tests::collection_schedule ... ok
test add_prefix::tests::collection_with_id_no_prefix ... ok
test add_prefix::tests::collection_with_id_referential ... ok
test add_prefix::tests::collection_with_id_schedule ... ok
test add_prefix::tests::collection_with_id_referential_and_schedule ... ok
test add_prefix::tests::collection_with_id_deprecated ... ok
test enhancers::fill_co2::test::preserve_existing ... ok
test enhancers::fill_co2::test::enhance_with_default ... ok
test enhancers::fill_co2::test::add_fallback_modes ... ok
test gtfs::read::tests::filter_pathway ... ok
test gtfs::read::tests::gtfs_routes_with_no_trips ... ok
test gtfs::read::tests::deduplicate_funicular_physical_mode ... ok
test gtfs::read::tests::gtfs_routes_as_route_same_name_different_agency ... ok
test gtfs::read::tests::gtfs_routes_as_route_with_backward_trips ... ok
test gtfs::read::tests::gtfs_routes_as_line ... ok
test gtfs::read::tests::gtfs_routes_as_route ... ok
test gtfs::read::tests::gtfs_invalid_undefined_stop_times ... ok
test gtfs::read::tests::gtfs_routes_without_agency_id_as_line_and_0_agencies ... ok
test gtfs::read::tests::gtfs_routes_with_wrong_colors ... ok
test gtfs::read::tests::gtfs_routes_without_agency_id_as_line_and_2_agencies ... ok
test gtfs::read::tests::gtfs_routes_without_agency_id_as_line ... ok
test gtfs::read::tests::gtfs_trips ... ok
test gtfs::read::tests::gtfs_stop_times ... ok
test gtfs::read::tests::gtfs_stop_times_estimated ... ok
test gtfs::read::tests::gtfs_stop_times_precision ... ok
test gtfs::read::tests::gtfs_trips_with_no_accessibility_information ... ok
test gtfs::read::tests::gtfs_trips_no_direction_id ... ok
test gtfs::read::tests::gtfs_without_calendar_dates_or_calendar ... ok
test gtfs::read::tests::gtfs_with_calendars_dates_and_no_calendar ... ok
test gtfs::read::tests::gtfs_with_calendars_and_no_calendar_dates ... ok
test gtfs::read::tests::gtfs_with_calendars_and_calendar_dates ... ok
test gtfs::read::tests::gtfs_trips_with_routes_without_agency_id ... ok
test gtfs::read::tests::load_2_agencies_with_different_timezone ... ok
test gtfs::read::tests::load_2_agencies_with_no_id ... ok
test gtfs::read::tests::load_minimal_agency ... ok
test gtfs::read::tests::load_complete_agency ... ok
test gtfs::read::tests::load_one_stop_point ... ok
test gtfs::read::tests::push_on_collection ... ok
test gtfs::read::tests::load_standard_agency ... ok
test gtfs::read::tests::location_type_default_value ... ok
test gtfs::read::tests::gtfs_undefined_stop_times ... ok
test gtfs::read::tests::location_with_space_proof ... ok
test gtfs::read::tests::no_stop_code_on_autogenerated_stoparea ... ok
test gtfs::read::tests::load_without_slashes ... ok
test gtfs::read::tests::read_levels ... ok
test gtfs::read::tests::read_shapes_with_no_shapes_file ... ok
test gtfs::read::tests::read_shapes ... ok
test gtfs::read::tests::stop_location_on_stops ... ok
test gtfs::read::tests::read_tranfers ... ok
test gtfs::write::tests::ntfs_geometry_not_linestring_not_exported ... ok
test gtfs::write::tests::ntfs_geometry_linestring_exported ... ok
test gtfs::read::tests::stop_code_on_stops ... ok
test gtfs::read::tests::stops_do_not_generate_duplicate_equipments ... ok
test gtfs::write::tests::ntfs_line_with_unknown_mode_to_gtfs_route ... ok
test gtfs::write::tests::ntfs_minial_line_to_gtfs_route ... ok
test gtfs::read::tests::read_gtfs_routes::read_gtfs_routes_as_line ... ok
test gtfs::write::tests::ntfs_physical_mode_to_gtfs_route_type ... ok
test gtfs::read::tests::read_gtfs_routes::read_gtfs_routes_as_route ... ok
test gtfs::write::tests::ntfs_transfers_to_gtfs_transfers ... ok
test gtfs::write::tests::test_ntfs_minimal_stop_point_to_gtfs_stop ... ok
test gtfs::write::tests::ntfs_object_code_to_stop_extensions_nothing_generated ... ok
test gtfs::write::tests::test_ntfs_stop_area_to_gtfs_stop ... ok
test gtfs::write::tests::test_ntfs_stop_point_to_gtfs_stop ... ok
test gtfs::write::tests::write_agency ... ok
test gtfs::write::tests::write_agency_with_default_values ... ok
test gtfs::write::tests::ntfs_tranfers_at_same_stop_point ... ok
test gtfs::write::tests::ntfs_object_code_to_stop_extensions ... ok
test gtfs::write::tests::ntfs_vehicle_journeys_to_stop_times ... ok
test gtfs::read::tests::stops_generates_equipments ... ok
test model::tests::calendar_deduplication::enhance ... ok
test model::tests::check_geometries_coherence::preserve_valid_reference ... ok
test model::tests::check_geometries_coherence::remove_dead_reference ... ok
test model::tests::clean_comments::remove_empty_comment ... ok
test gtfs::write::tests::write_calendar_file_from_calendar ... ok
test gtfs::write::tests::write_trip ... ok
test model::tests::enhance_pickup_dropoff::no_stay_in ... ok
test model::tests::enhance_pickup_dropoff::stay_in_different_stop ... ok
test model::tests::enhance_pickup_dropoff::stay_in_different_stop_overlapping_time ... ok
test model::tests::enhance_pickup_dropoff::stay_in_same_stop ... ok
test model::tests::enhance_pickup_dropoff::block_id_on_overlapping_calendar_forbidden_pickup ... ok
test model::tests::enhance_pickup_dropoff::block_id_on_non_overlaping_calendar_with_overlaping_stops ... ok
test model::tests::enhance_pickup_dropoff::block_id_on_non_overlaping_calendar_ko ... ok
test model::tests::enhance_pickup_dropoff::block_id_on_overlapping_calendar_ok ... ok
test model::tests::enhance_pickup_dropoff::forbidden_drop_off_should_be_kept ... ok
test model::tests::enhance_route_directions::generate_route_direction ... ok
test model::tests::enhance_route_names::do_not_generate_route_name_when_stops_names_are_empty ... ok
test model::tests::enhance_trip_headsign::enhance ... ok
test model::tests::enhance_route_names::generate_destination_id ... ok
test model::tests::enhance_route_names::generate_route_name ... ok
test model::tests::enhance_route_names::most_frequent_origin_destination ... ok
test model::tests::enhance_route_names::same_frequency_same_size_stop_area_then_first_aphabetical_order ... ok
test model::tests::enhance_route_names::same_frequency_then_biggest_stop_area ... ok
test model::tests::enhance_trip_headsign::enhance_when_string_empty ... ok
test gtfs::read::tests::prefix_on_all_pt_object_id ... ok
test model::tests::update_stop_area_coords::update_coords ... ok
test netex_france::calendars::tests::valid_day_bits::empty_validity_pattern ... ok
test model::tests::update_stop_area_coords::update_coords_on_not_referenced_stop_area ... ok
test netex_france::calendars::tests::valid_day_bits::not_successive_dates ... ok
test netex_france::calendars::tests::valid_day_bits::only_one_date ... ok
test netex_france::calendars::tests::valid_day_bits::successive_dates ... ok
test netex_france::route_points::tests::build_route_points::circular_vehicle_journey ... ok
test netex_france::route_points::tests::build_route_points::extended_vehicle_journey ... ok
test netex_france::route_points::tests::build_route_points::forked_journey_pattern ... ok
test netex_france::route_points::tests::build_route_points::intertwined_stops ... ok
test netex_france::route_points::tests::build_route_points::in_between_stop ... ok
test netex_france::route_points::tests::build_route_points::same_journey_pattern ... ok
test netex_utils::tests::frame_type::parse_frame_type ... ok
test netex_utils::tests::frame_type::parse_invalid_frame_type ... ok
test netex_utils::tests::get_only_frame::multiple_frames ... ok
test netex_utils::tests::get_only_frame::no_frame ... ok
test netex_utils::tests::get_only_frame::one_frame ... ok
test netex_utils::tests::parse_frames_by_type::some_frame ... ok
test netex_utils::tests::parse_frames_by_type::unknown_frame ... ok
test netex_utils::tests::value_in_keylist::has_value ... ok
test netex_utils::tests::value_in_keylist::no_key_found ... ok
test netex_utils::tests::value_in_keylist::no_keylist_found ... ok
test netex_utils::tests::value_in_keylist::no_value_found ... ok
test ntfs::read::tests::company_object_codes ... ok
test ntfs::read::tests::ntfs_stop_times_precision ... ok
test netex_france::stops::tests::valid_impaired_access::test_impaired_access_unknown ... ok
test ntfs::read::tests::read_stop_points_with_no_parent ... ok
test ntfs::tests::admin_stations_serialization_deserialization ... ok
test netex_france::offer::tests::journey_patterns_with_different_number_stop_times ... ok
test ntfs::tests::calendar_serialization_deserialization ... ok
test netex_france::offer::tests::same_journey_pattern ... ok
test ntfs::tests::commercial_modes_serialization_deserialization ... ok
test ntfs::tests::companies_serialization_deserialization ... ok
test ntfs::tests::contributors_serialization_deserialization ... ok
test netex_france::stops::tests::valid_impaired_access::test_impaired_access_true ... ok
test netex_france::offer::tests::journey_patterns_with_different_stop_time_properties ... ok
test ntfs::tests::fares_v1_serialization_deserialization ... ok
test ntfs::tests::datasets_serialization_deserialization ... ok
test ntfs::tests::equipments_serialization_deserialization ... ok
test ntfs::tests::feed_infos_serialization_deserialization ... ok
test ntfs::tests::geometries_serialization_deserialization ... ok
test ntfs::tests::networks_serialization_deserialization ... ok
test ntfs::tests::od_fares_v1_serialization_deserialization ... ok
test ntfs::tests::lines_serialization_deserialization ... ok
test ntfs::tests::physical_modes_serialization_deserialization ... ok
test ntfs::tests::prices_v1_serialization_deserialization ... ok
test netex_france::stops::tests::valid_impaired_access::test_impaired_access_false ... ok
test ntfs::tests::routes_serialization_deserialization ... ok
test ntfs::tests::ticket_prices_serialization_deserialization ... ok
test ntfs::tests::stops_serialization_deserialization ... ok
test ntfs::tests::ticket_use_perimeters_serialization_deserialization ... ok
test ntfs::tests::ticket_use_restrictions_serialization_deserialization ... ok
test netex_france::stops::tests::valid_impaired_access::test_impaired_access_partial ... ok
test ntfs::tests::ticket_uses_serialization_deserialization ... ok
test ntfs::tests::tickets_serialization_deserialization ... ok
test objects::tests::approx_distance ... ok
test objects::tests::orthodromic_distance ... ok
test objects::tests::rgb_deserialization_with_bad_number_of_digits ... ok
test objects::tests::rgb_deserialization_with_too_big_color_hex ... ok
test objects::tests::rgb_serialization ... ok
test objects::tests::rgb_good_deserialization ... ok
test objects::tests::time_serialization ... ok
test objects::tests::time_deserialization ... ok
test ntfs::tests::trip_properties_serialization_deserialization ... ok
test ntfs::tests::transfers_serialization_deserialization ... ok
test read_utils::tests::path_file_handler ... ok
test utils::tests::deserialize_decimal::negative_decimal ... ok
test utils::tests::deserialize_decimal::not_a_number ... ok
test utils::tests::deserialize_decimal::positive_decimal ... ok
test utils::tests::serde_currency::test_de_invalid_currency_code ... ok
test utils::tests::serde_currency::test_ser_invalid_currency_code ... ok
test utils::tests::serde_option_string::with_empty_string ... ok
test utils::tests::serde_option_string::with_string ... ok
test utils::tests::serde_currency::test_serde_valid_currency_code ... ok
test utils::tests::serde_option_string::without_field ... ok
test validity_period::tests::set_validity_period::no_existing_validity_period ... ok
test read_utils::tests::zip_file_handler ... ok
test validity_period::tests::set_validity_period::with_extended_validity_period ... ok
test validity_period::tests::set_validity_period::with_included_validity_period ... ok
test vptranslator::tests::bound_cut ... ok
test vptranslator::tests::bound_compression ... ok
test vptranslator::tests::empty_vp ... ok
test vptranslator::tests::bound_cut_one_day ... ok
test vptranslator::tests::one_week ... ok
test vptranslator::tests::mwtfss_mttfss_mtwfss ... ok
test vptranslator::tests::may2015 ... ok
test vptranslator::tests::one_week_partial ... ok
test vptranslator::tests::only_first_day ... ok
test vptranslator::tests::only_one_monday ... ok
test vptranslator::tests::only_one_sunday ... ok
test vptranslator::tests::only_one_tfss ... ok
test ntfs::tests::vehicle_journeys_and_stop_times_serialization_deserialization ... ok
test vptranslator::tests::only_one_thursday ... ok
test vptranslator::tests::partial_one_week ... ok
test vptranslator::tests::partial_one_week_partial_with_nb_partial_6 ... ok
test vptranslator::tests::partial_one_week_partial_with_nb_partial_7 ... ok
test vptranslator::tests::partial_one_week_partial_with_nb_partial_8 ... ok
test vptranslator::tests::prev_monday_from_monday ... ok
test vptranslator::tests::prev_monday_from_sunday ... ok
test vptranslator::tests::prev_monday_from_thursday ... ok
test validity_period::tests::compute_dataset_validity_period::test_compute_dataset_validity_period_with_only_one_date ... ok
test vptranslator::tests::t_w_t ... ok
test vptranslator::tests::three_complete_weeks ... ok
test vptranslator::tests::three_mtwss_excluding_one_day ... ok
test vptranslator::tests::three_mtwss_including_one_day ... ok
test validity_period::tests::compute_dataset_validity_period::test_compute_dataset_validity_period ... ok
test ntfs::tests::comments_codes_object_properties_serialization_deserialization ... ok

test result: ok. 205 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

running 11 tests
test test_minimal_gtfs_with_odt_comment ... ok
test test_minimal_gtfs_with_routes_comments ... ok
test test_minimal_gtfs ... ok
test test_minimal_gtfs_with_routes_as_lines_comments ... ok
test test_gtfs_remove_vjs_with_no_traffic ... ok
test test_gtfs_physical_modes ... ok
test test_gtfs ... ok
test test_minimal_gtfs_frequencies_with_odt_comment ... ok
test test_minimal_ziped_gtfs ... ok
test test_minimal_ziped_sub_dir_gtfs ... ok
test test_minimal_ziped_sub_dir_gtfs_with_hidden_files ... ok

test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

running 14 tests
test ntfs_stop_zones ... ok
test sanitize_frequencies ... ok
test minimal ... ok
test sanitize_grid ... ok
test sanitize_grid_with_line_external_code ... ok
test ntfs_stops_output ... ok
test optional_empty_collections_not_created ... ok
test ntfs ... ok
test enhance_lines_opening_time ... ok
test preserve_grid ... ok
test test_minimal_fares_stay_same ... ok
test preserve_frequencies ... ok
test test_minimal_fares_stay_same_with_empty_of_fares ... ok
test test_minimal_platforms_stay_same ... ok

test result: ok. 14 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

running 2 tests
test test_restrict_no_panic ... ok
test test_restrict_global ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

running 3 tests
test test_generates_transfers ... ok
test test_generates_all_multi_contributors_transfers ... ok
test test_generates_transfers_with_closure_inter_contributors ... ok

test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

running 3 tests
test validate_xml_schemas ... FAILED
test test_write_netex_france_from_ntfs ... FAILED
test test_write_netex_france_from_gtfs ... FAILED

failures:

---- validate_xml_schemas stdout ----
thread 'validate_xml_schemas' panicked at 'assertion failed: status.success()', tests/write_netex_france.rs:89:13
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace

---- test_write_netex_france_from_ntfs stdout ----
thread 'test_write_netex_france_from_ntfs' panicked at 'assertion failed: (left == right)

�[1mDiff�[0m �[31m< left�[0m / �[32mright >�[0m :
[
"",
"<PublicationDelivery version="1.09:FR-NETEX_ARRET-2.1-1.0" xmlns="http://www.netex.org.uk/netex" xmlns:core="http://www.govtalk.gov.uk/core" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:ifopt="http://www.ifopt.org.uk/ifopt" xmlns:siri="http://www.siri.org.uk/siri" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.netex.org.uk/netex">",
"\t2019-04-03T17:19:00+00:00",
"\tParticipant",
"\t",
"\t\t<GeneralFrame id="FR:GeneralFrame:NETEX_ARRET:" version="any">",
"\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:GDLR:" version="any">",
"\t\t\t\t\tGare de Lyon (RER)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<AccessibilityAssessment id="FR:AccessibilityAssessment:GDLR_0:" version="any">",
"\t\t\t\t\t\tpartial",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:GDLM:" version="any">",
"\t\t\t\t\tGare de Lyon (Metro)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<AccessibilityAssessment id="FR:AccessibilityAssessment:GDLM_1:" version="any">",
"\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\tfalse",
"\t\t\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:GDLB:" version="any">",
"\t\t\t\t\tGare de Lyon (Bus)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:NATR:" version="any">",
"\t\t\t\t\tNation (RER)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;52;31m4�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;22;32m5�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<AccessibilityAssessment id="FR:AccessibilityAssessment:NATR_0:" version="any">",
"\t\t\t\t\t\tpartial",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:NATM:" version="any">",
"\t\t\t\t\tNation (Metro)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;52;31m4�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;22;32m5�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:CDGR:" version="any">",
"\t\t\t\t\tCharles de Gaulle (RER)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648315.4028777299 6864001.8185047405</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneOffParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:CDGM:" version="any">",
"\t\t\t\t\tCharles de Gaulle (Metro)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648315.4028777299 6864001.8185047405</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneOffParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:DEFR:" version="any">",
"\t\t\t\t\tLa Défense (RER)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;52;31m7�[0m�[31m 6866016.318148232</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;22;32m6�[0m�[32m 6866016.318148232</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneOffParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:CHAM:" version="any">",
"\t\t\t\t\tChâtelet (Metro)",
"\t\t\t\t\tmetro",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tThe Big One",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:MTPB:" version="any">",
"\t\t\t\t\tMontparnasse (Bus)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">650223.8079440364 6860484.10406642�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">650223.8079440364 6860484.10406642�[0m�[1;48;5;22;32m1�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:GDL_rail:" version="any">",
"\t\t\t\t\tGare de Lyon",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:GDL:">",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:GDLR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:GDL_metro:" version="any">",
"\t\t\t\t\tGare de Lyon",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:GDL:">",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\tmetroStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:GDLM:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:GDL_bus:" version="any">",
"\t\t\t\t\tGare de Lyon",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:GDL:">",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\tbusStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:GDLB:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:GDLR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:GDL:" version="any">",
"\t\t\t\t\tGare de Lyon",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t\t<StopPlaceEntrance id="FR:StopPlaceEntrance:GDL-G1:" version="any">",
"\t\t\t\t\t\t\tGate 1",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">654143.0840251445 6860726.2002731�[0m�[1;48;5;52;31m79�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">654143.0840251445 6860726.2002731�[0m�[1;48;5;22;32m8�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t<StopPlaceEntrance id="FR:StopPlaceEntrance:GDL-G2:" version="any">",
"\t\t\t\t\t\t\tGate 2",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">654109.4203976962 6860534.540309813</gml:pos>",
"\t\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:NAT_rail:" version="any">",
"\t\t\t\t\tNation",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;52;31m4�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;22;32m5�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:NAT:">",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:NATR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:NAT_metro:" version="any">",
"\t\t\t\t\tNation",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;52;31m4�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;22;32m5�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:NAT:">",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\tmetroStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:NATM:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:NAT_bus:" version="any">",
"\t\t\t\t\tNation",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;52;31m4�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;22;32m5�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:NAT:">",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\tbusStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:NATR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:NAT:" version="any">",
"\t\t\t\t\tNation",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;52;31m4�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;22;32m5�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:CDG_rail:" version="any">",
"\t\t\t\t\tCharles de Gaulle",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648315.4028777299 6864001.8185047405</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:CDG:">",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:CDGR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:CDG_metro:" version="any">",
"\t\t\t\t\tCharles de Gaulle",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648315.4028777299 6864001.8185047405</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:CDG:">",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\tmetroStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:CDGM:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:CDG_bus:" version="any">",
"\t\t\t\t\tCharles de Gaulle",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648315.4028777299 6864001.8185047405</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:CDG:">",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\tbusStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:CDGR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:CDG:" version="any">",
"\t\t\t\t\tCharles de Gaulle",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648315.4028777299 6864001.8185047405</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t\t<StopPlaceEntrance id="FR:StopPlaceEntrance:CDG-GA:" version="any">",
"\t\t\t\t\t\t\tGate A",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648335.54597493�[0m�[1;48;5;52;31m1�[0m�[31m 6863941.03415259�[0m�[1;48;5;52;31m1�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648335.54597493�[0m�[1;48;5;22;32m09�[0m�[32m 6863941.03415259�[0m�[1;48;5;22;32m2�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:DEF_rail:" version="any">",
"\t\t\t\t\tLa Défense",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;52;31m7�[0m�[31m 6866016.318148232</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;22;32m6�[0m�[32m 6866016.318148232</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:DEF:">",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:DEFR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:DEF_bus:" version="any">",
"\t\t\t\t\tLa Défense",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;52;31m7�[0m�[31m 6866016.318148232</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;22;32m6�[0m�[32m 6866016.318148232</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:DEF:">",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\tbusStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:DEFR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:DEF:" version="any">",
"\t\t\t\t\tLa Défense",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;52;31m7�[0m�[31m 6866016.318148232</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;22;32m6�[0m�[32m 6866016.318148232</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:CHA_metro:" version="any">",
"\t\t\t\t\tChâtelet",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">652172.9131210521 6862208.608972682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:CHA:">",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\tmetroStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:CHAM:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:CHA:" version="any">",
"\t\t\t\t\tChâtelet",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">652172.9131210521 6862208.608972682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\tmetroStation",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:MTP_bus:" version="any">",
"\t\t\t\t\tMontparnasse",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">650223.8079440364 6860484.10406642�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">650223.8079440364 6860484.10406642�[0m�[1;48;5;22;32m1�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:MTP:">",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\tbusStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:MTPB:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:MTP:" version="any">",
"\t\t\t\t\tMontparnasse",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">650223.8079440364 6860484.10406642�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">650223.8079440364 6860484.10406642�[0m�[1;48;5;22;32m1�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\tbusStation",
"\t\t\t\t",
"\t\t\t",
"\t\t",
"\t",
"",
]

', /Users/mkirk/src/georust/transit_model/src/test_utils.rs:123:9

---- test_write_netex_france_from_gtfs stdout ----
thread 'test_write_netex_france_from_gtfs' panicked at 'assertion failed: (left == right)

�[1mDiff�[0m �[31m< left�[0m / �[32mright >�[0m :
[
"",
"<PublicationDelivery version="1.09:FR-NETEX_ARRET-2.1-1.0" xmlns="http://www.netex.org.uk/netex" xmlns:core="http://www.govtalk.gov.uk/core" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:ifopt="http://www.ifopt.org.uk/ifopt" xmlns:siri="http://www.siri.org.uk/siri" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.netex.org.uk/netex">",
"\t2019-04-03T17:19:00+00:00",
"\tParticipant",
"\t",
"\t\t<GeneralFrame id="FR:GeneralFrame:NETEX_ARRET:" version="any">",
"\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:GDLR:" version="any">",
"\t\t\t\t\tGare de Lyon (RER)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<AccessibilityAssessment id="FR:AccessibilityAssessment:GDLR_0:" version="any">",
"\t\t\t\t\t\tpartial",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:GDLM:" version="any">",
"\t\t\t\t\tGare de Lyon (Metro)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<AccessibilityAssessment id="FR:AccessibilityAssessment:GDLM_1:" version="any">",
"\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\tfalse",
"\t\t\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:GDLB:" version="any">",
"\t\t\t\t\tGare de Lyon (Bus)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:NATR:" version="any">",
"\t\t\t\t\tNation (RER)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;52;31m4�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;22;32m5�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<AccessibilityAssessment id="FR:AccessibilityAssessment:NATR_0:" version="any">",
"\t\t\t\t\t\tpartial",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t\t\tunknown",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:NATM:" version="any">",
"\t\t\t\t\tNation (Metro)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;52;31m4�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;22;32m5�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:CDGR:" version="any">",
"\t\t\t\t\tCharles de Gaulle (RER)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648315.4028777299 6864001.8185047405</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneOffParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:CDGM:" version="any">",
"\t\t\t\t\tCharles de Gaulle (Metro)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648315.4028777299 6864001.8185047405</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneOffParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:DEFR:" version="any">",
"\t\t\t\t\tLa Défense (RER)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;52;31m7�[0m�[31m 6866016.318148232</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;22;32m6�[0m�[32m 6866016.318148232</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneOffParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:CHAM:" version="any">",
"\t\t\t\t\tChâtelet (Metro)",
"\t\t\t\t\tmetro",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tThe Big One",
"\t\t\t\t",
"\t\t\t\t<Quay id="FR:Quay:MTPB:" version="any">",
"\t\t\t\t\tMontparnasse (Bus)",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">650223.8079440364 6860484.10406642�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">650223.8079440364 6860484.10406642�[0m�[1;48;5;22;32m1�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\t",
"\t\t\t\t\t\t<TariffZoneRef ref="Participant:ZoneParis">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:GDL_rail:" version="any">",
"\t\t\t\t\tGare de Lyon",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:GDL:">",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:GDLR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:GDL_metro:" version="any">",
"\t\t\t\t\tGare de Lyon",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:GDL:">",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\tmetroStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:GDLM:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:GDL_bus:" version="any">",
"\t\t\t\t\tGare de Lyon",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:GDL:">",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\tbusStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:GDLB:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:GDLR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:GDL:" version="any">",
"\t\t\t\t\tGare de Lyon",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">653983.726554971 6860704.890453682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t\t<StopPlaceEntrance id="FR:StopPlaceEntrance:GDL-G1:" version="any">",
"\t\t\t\t\t\t\tGate 1",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">654143.0840251445 6860726.2002731�[0m�[1;48;5;52;31m79�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">654143.0840251445 6860726.2002731�[0m�[1;48;5;22;32m8�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t<StopPlaceEntrance id="FR:StopPlaceEntrance:GDL-G2:" version="any">",
"\t\t\t\t\t\t\tGate 2",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">654109.4203976962 6860534.540309813</gml:pos>",
"\t\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:NAT_rail:" version="any">",
"\t\t\t\t\tNation",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;52;31m4�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;22;32m5�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:NAT:">",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:NATR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:NAT_metro:" version="any">",
"\t\t\t\t\tNation",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;52;31m4�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;22;32m5�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:NAT:">",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\tmetroStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:NATM:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:NAT_bus:" version="any">",
"\t\t\t\t\tNation",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;52;31m4�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;22;32m5�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:NAT:">",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\tbusStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:NATR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:NAT:" version="any">",
"\t\t\t\t\tNation",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;52;31m4�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">655712.2650990451 6861107.74482112�[0m�[1;48;5;22;32m5�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:CDG_rail:" version="any">",
"\t\t\t\t\tCharles de Gaulle",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648315.4028777299 6864001.8185047405</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:CDG:">",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:CDGR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:CDG_metro:" version="any">",
"\t\t\t\t\tCharles de Gaulle",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648315.4028777299 6864001.8185047405</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:CDG:">",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\tmetroStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:CDGM:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:CDG_bus:" version="any">",
"\t\t\t\t\tCharles de Gaulle",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648315.4028777299 6864001.8185047405</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:CDG:">",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\tbusStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:CDGR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:CDG:" version="any">",
"\t\t\t\t\tCharles de Gaulle",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648315.4028777299 6864001.8185047405</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t\t<StopPlaceEntrance id="FR:StopPlaceEntrance:CDG-GA:" version="any">",
"\t\t\t\t\t\t\tGate A",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648335.54597493�[0m�[1;48;5;52;31m1�[0m�[31m 6863941.03415259�[0m�[1;48;5;52;31m1�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">648335.54597493�[0m�[1;48;5;22;32m09�[0m�[32m 6863941.03415259�[0m�[1;48;5;22;32m2�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t\ttrue",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:DEF_rail:" version="any">",
"\t\t\t\t\tLa Défense",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;52;31m7�[0m�[31m 6866016.318148232</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;22;32m6�[0m�[32m 6866016.318148232</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:DEF:">",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:DEFR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:DEF_bus:" version="any">",
"\t\t\t\t\tLa Défense",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;52;31m7�[0m�[31m 6866016.318148232</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;22;32m6�[0m�[32m 6866016.318148232</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:DEF:">",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\tbusStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:DEFR:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:DEF:" version="any">",
"\t\t\t\t\tLa Défense",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;52;31m7�[0m�[31m 6866016.318148232</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">644198.460950133�[0m�[1;48;5;22;32m6�[0m�[32m 6866016.318148232</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\trail",
"\t\t\t\t\trailStation",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:CHA_metro:" version="any">",
"\t\t\t\t\tChâtelet",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">652172.9131210521 6862208.608972682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:CHA:">",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\tmetroStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:CHAM:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:CHA:" version="any">",
"\t\t\t\t\tChâtelet",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
"\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">652172.9131210521 6862208.608972682</gml:pos>",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tmetro",
"\t\t\t\t\tmetroStation",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:MTP_bus:" version="any">",
"\t\t\t\t\tMontparnasse",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">650223.8079440364 6860484.10406642�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">650223.8079440364 6860484.10406642�[0m�[1;48;5;22;32m1�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\t<ParentSiteRef ref="FR:StopPlace:MTP:">",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\tbusStation",
"\t\t\t\t\t",
"\t\t\t\t\t\t<QuayRef ref="FR:Quay:MTPB:">",
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t",
"\t\t\t\t<StopPlace id="FR:StopPlace:MTP:" version="any">",
"\t\t\t\t\tMontparnasse",
"\t\t\t\t\t",
"\t\t\t\t\t\t",
�[31m<�[0m�[31m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">650223.8079440364 6860484.10406642�[0m�[31m</gml:pos>",�[0m
�[32m>�[0m�[32m "\t\t\t\t\t\t\t<gml:pos srsName="EPSG:2154">650223.8079440364 6860484.10406642�[0m�[1;48;5;22;32m1�[0m�[32m</gml:pos>",�[0m
"\t\t\t\t\t\t",
"\t\t\t\t\t",
"\t\t\t\t\tbus",
"\t\t\t\t\tbusStation",
"\t\t\t\t",
"\t\t\t",
"\t\t",
"\t",
"",
]

', /Users/mkirk/src/georust/transit_model/src/test_utils.rs:123:9

failures:
test_write_netex_france_from_gtfs
test_write_netex_france_from_ntfs
validate_xml_schemas

test result: FAILED. 0 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out

@woshilapin woshilapin self-requested a review February 11, 2021 07:25
Copy link
Contributor

@woshilapin woshilapin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you very much, very nice to see people contributing to this project. I've noticed 2 tiny things that could be improved (see comments).

And for the tests, do not care too much about it, you're probably missing some local setup for the feature xmllint (see the CONTRIBUTING.md). In your case, you'll probably be fine to only run feature proj (cargo test --features proj) instead of all features (cargo test --all-features). Note that the CI is happy anyway so you indeed didn't break anything 😉

src/utils.rs Outdated
wkt.items
.pop()
.unwrap()
.try_into()
Copy link
Contributor

@woshilapin woshilapin Feb 11, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should be able to replace it with this

let wkt = wkt::Wkt::from_str(&s).map_err(serde::de::Error::custom)?;
use std::convert::TryInto;
wkt.try_into().map_err(serde::de::Error::custom)

README.md Outdated
@@ -53,7 +53,7 @@ So it must be installed on the system to compile and use those crates.
### [PROJ] for binaries

Using the [`proj` crate] requires some system-dependencies installation.\
The version `7.1.0` of [PROJ] is needed (used and tested by maintainers).
The version `7.2.1` of [PROJ] is needed (used and tested by maintainers).
Copy link
Contributor

@pbougue pbougue Feb 11, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is more a self-reminder: We have to be consistent about the version all over the codebase (dockerfile, makefile, CI). So there is a bit more work to be done on our side, or we may stay on 7.1.0 everywhere (let us know if you noticed some things required from 7.2).

Maybe we can improve doc on that too.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm unsure if there are any relevant behavioral changes.

I updated this naively, just to conform to the version of proj that the crate expects: https://github.com/georust/proj/blob/0.22.0/proj-sys/build.rs#L11

@michaelkirk
Copy link
Contributor Author

Actually - there's one more bit of proj related documentation I'd like to update...

@michaelkirk michaelkirk reopened this Feb 11, 2021
@michaelkirk
Copy link
Contributor Author

re: ec20c88

Proj now builds from source automatically if a recent enough installation wasn't found.

I updated the docs and the make task accordingly.

🚨 However, I haven't tested it, as I'm not running linux.

I would appreciate if someone on that system could give it a go:

@michaelkirk
Copy link
Contributor Author

Ok, I think this is ready for re-review.

CI is failing w/ clippy. But reviewing the suggested changes, they all appear to be unrelated to changes in this PR.

@woshilapin
Copy link
Contributor

woshilapin commented Feb 11, 2021

re: ec20c88

Proj now builds from source automatically if a recent enough installation wasn't found.

I updated the docs and the make task accordingly.

rotating_light However, I haven't tested it, as I'm not running linux.

I would appreciate if someone on that system could give it a go:

Yes, we saw this auto-build feature in proj' crate which is great, but we intentionally decided not to use it because compiling proj takes a long time, and it would slow down considerably each build on the CI (because Proj would be build each time). But yet, the way we do today is not yet satisfactory either. We chose the fast build over the auto-build option, but not yet sure we took the right decision 😛 Thanks for the information though!

@woshilapin
Copy link
Contributor

woshilapin commented Feb 11, 2021

Ok, I think this is ready for re-review.

CI is failing w/ clippy. But reviewing the suggested changes, they all appear to be unrelated to changes in this PR.

As for clippy, Rust v1.50.0 has been released in the meantime so new clippy warnings appeared. We'll fix that (we're a bit harsh on that since we fail the build on warnings). The PR #744 should fix it.

@woshilapin
Copy link
Contributor

#744 has been merged. You might need to rebase and clippy errors should be gone.

@michaelkirk michaelkirk force-pushed the mkirk/update-geo-deps branch from ec20c88 to d97b9e1 Compare February 12, 2021 14:18
@woshilapin
Copy link
Contributor

woshilapin commented Feb 12, 2021

Your PR is good now, thank you very much. However, we'll wait for merging it because we still have some actions to take on our side before this is merged:

  • upgrade the Docker CI image to compile proj instead of using a custom .deb
  • check all tests are still fine with the new version of libproj
  • update the custom CI Docker image we use to Rust 1.50.0
  • update osm_boundaries_utils, osm_transit_extractor, check external libs that are also used by internal libs for cross-compat (maybe poke cosmogony and mimirsbrunn)... but should be OK.
  • update this PR if needed and merge it
  • check our only internal library for compatibility 😉

I'm approving the PR, but I'll put a do_not_merge tag on it until the other actions have been taken.

Thanks again 😍

woshilapin
woshilapin previously approved these changes Feb 12, 2021
@michaelkirk
Copy link
Contributor Author

Sounds good.

upgrade the Debian package for libproj we use in our CI

In case it's useful to you, we went the route of using our own CI container to speed up our builds:

this container builds, but doesn't install libproj. This container is used by multiple other containers:
https://github.com/georust/docker-images/blob/master/libproj-builder.Dockerfile

an example of a ci container which uses it:
https://github.com/georust/docker-images/blob/master/geo-ci.Dockerfile#L29

@woshilapin
Copy link
Contributor

woshilapin commented Feb 12, 2021

In case it's useful to you, we went the route of using our own CI container to speed up our builds:

Yes, that's pretty much what we're doing, just using a custom .deb instead of recompiling... and now that I'm saying it, I realize how dumb it is to have a .deb (probably historic reasons why we ended up here). We're actually going to converge to something similar to what you have (or maybe even use your image if it's enough). I actually amended my list of todos above.

Thanks for the feedback.

@michaelkirk
Copy link
Contributor Author

We're actually going to converge to something similar to what you have (or maybe even use your image if it's enough)

The containers are public, so you are of course welcome to use it directly or as a reference for your own Dockerfile, but be advised that they are not intended to be "supported" and come with no warranties. =)

@pbougue
Copy link
Contributor

pbougue commented Apr 29, 2021

For information (and to have it more accessible): please note that we are still planning on merging it.
We've been a bit too busy on other subjects, but still we managed to handle some of the blockers we had to merge this.

And we keep on tracking what's left to do inside this comment: #743 (comment)

@antoine-de
Copy link
Contributor

antoine-de commented May 20, 2021

I opened for PR to update the dependencies:
Qwant/osm_boundaries_utils_rs#18 ✔️
https://github.com/CanalTP/osm-transit-extractor/pull/56 ✔️

@pbougue
Copy link
Contributor

pbougue commented May 31, 2021

Hello @michaelkirk
We are getting closer to merge this and discussing some options, and we wonder if it's an option to freeze libproj's version on CI.

We would like the libproj bump to be a manual conscious step (not silent during a proj crate bump) because:

  • libproj auto-build is convenient to start coding easily, but it's heavy on each run of CI
  • for our use the results are not stable depending on libproj or rust version, so for reproducibility it's a nice thing to force libproj version too... Side-note: probably uninitalized value somewhere in C or in binding (hard to create minimal example, but on private repo without unsafe code, we have the case of a log add that changes result 😿 ).
  1. Do you know any way to do that ? Feature "proj-sys/nobuild" on the "proj" dependency doesn't seem to do the trick (and anyway using features would be difficult to have a custom behavior on CI but use the great auto build otherwise 🤔 )
  2. Also, if possible in those cases of libproj not being rebuilt, can we remove the need for pkg-config and clang3.9 ? Or are these necessary even for a pinned libproj version ("nobuild" case)?

EDIT:
clang was necessary alreay, it's just that now it's >= 3.9:

  found acceptable libproj already installed at: "/usr/lib"
  thread 'main' panicked at '`libclang` function not loaded: `clang_Cursor_Evaluate`. This crate requires that `libclang` 3.9 or later be installed on your system.

@michaelkirk
Copy link
Contributor Author

We would like the libproj bump to be a manual conscious step (not silent during a proj crate bump) because:

libproj auto-build is convenient to start coding easily, but it's heavy on each run of CI
for our use the results are not stable depending on libproj or rust version, so for reproducibility it's a nice thing to force libproj version too...

I understand why it could be helpful to have a single version of the crate be compatible with multiple versions of libproj, but currently this is not possible - the proj crate only supports only one version of proj, so there is no way to "pin" it to an older version other than to pin your crate.

It's possible we could support this one day - e.g. like the gdal crate does.

Side-note: probably uninitalized value somewhere in C or in binding (hard to create minimal example, but on private repo without unsafe code, we have the case of a log add that changes result 😿 ).
Do you know any way to do that ?

Yikes! Can you open an issue on the proj repo with any details?

Feature "proj-sys/nobuild" on the "proj" dependency doesn't seem to do the trick (and anyway using features would be difficult to have a custom behavior on CI but use the great auto build otherwise 🤔 )

Despite the name, the nobuild feature is probably not what you're looking for. nobuild is just a feature we only use for docsrs - I don't think the product is even functional other than for generating docs.

Also, if possible in those cases of libproj not being rebuilt, can we remove the need for pkg-config and clang3.9 ? Or are these necessary even for a pinned libproj version ("nobuild" case)?

re: pkg-config

I'm not 100%, but I suspect pkg-config will still be needed to be sure the version that exists is compatible with the crate. Even if we support a window of libproj versions, it's vanishingly unlikely that we'll support all versions of proj ever released. We need to have some way of checking version constraints and pkg-config does that for us. Can you elaborate on your concern?

re: clang

I don't think we have any hard dep on clang. Can you point out where it is if I'm mistaken?

@pbougue
Copy link
Contributor

pbougue commented Jun 11, 2021

First, thank you very much for your replies, helped a lot to move on here 🙏, very clear (will reply only on pending issues).
As you can see what's proposed in michaelkirk#1:

  • we will just stick to the libproj version that the crate uses and comment on that
  • we want to document a bit system-wide libproj install, as it's more comfortable when working long-term on this repo (and related ones)

As for the clang dependency we already had one (same as your docker images), the only change (which is totally OK for us) is that it seems to depend on clang >=3.9 now.
We obtained the following while building on debian stretch with clang defaulting to 3.6:

  found acceptable libproj already installed at: "/usr/lib"
  thread 'main' panicked at '`libclang` function not loaded: `clang_Cursor_Evaluate`. This crate requires that `libclang` 3.9 or later be installed on your system.

Did not dig much on that as it's easy and reasonable to provide clang-3.9.


Side-note: probably uninitalized value somewhere in C or in binding (hard to create minimal example, but on private repo without unsafe code, we have the case of a log add that changes result crying_cat_face ).
Do you know any way to do that ?

Yikes! Can you open an issue on the proj repo with any details?

I'm not sure it's worth opening an issue as far as we went on the subject, but I'll give the details here, let me know if you still think we should.

We were using libproj7.2.1 with all the deps of transit_model before your PR (proj 0.19, geo 0.14, wkt 0.8 and their matching deps).
In a private project depending on this one we mostly read coordinates in a file, converted them from https://epsg.io/27700 to https://epsg.io/4326 (not sure EPSG are relevant as we had issues on other kind of conversions before also, always small/acceptable changes).
Adding info!() just before convert() call would change the value by around 7m on one of our tests in UK.
From what we check (comparing to online converters results), this new value was the "good" one.
The "good" value was also what we had in rust 1.51 (and we obtained the "bad" value when switching to rust 1.52).
We tried to narrow it down with the same hardcoded values in a toy example, tried to use valgrind on the result : obtained the "good" result, and didn't dig much in the valgrind report but didn't see anything striking (the report is quite important on uninitialized values if I remember correctly).
And now that we checked how it goes in the private project with the crate bump from this current PR, we are back on the "good" value, with or without the log.
While bumping all this, we also noticed that our tests move a tiny bit in a code-place not using proj, but osmpbfreader and geo (for deps that should matter).

It's unlikely that we spend much more time on this if our tests do not suspiciously move again.
I would suspect using a libproj version not matching the one from the proj-crate is not a good idea, but not sure whether it explains all.
Another lead is that geo crate would have had some issues with precision?
Anyway, after this current PR, we get more chances of opening an issue with all up-to-date and matching on proj and geo, which should ease the search on your side if needed 😅

Once more, thanks!

@michaelkirk
Copy link
Contributor Author

As you can see what's proposed in michaelkirk#1:

Merged!

I'm not sure it's worth opening an issue as far as we went on the subject, but I'll give the details here, let me know if you still think we should.

Another lead is that geo crate would have had some issues with precision?

I'm not sure what part of geo you were using, but no broad changes related to precision come to mind. In terms of geo's proj integration, it just re-exports parts of the proj crate.

Since there isn't a way to produce a problem with the current releases, I don't think filing an issue would be a very good use of anyone's time. It is strange though.

@pbougue
Copy link
Contributor

pbougue commented Jun 11, 2021

Thanks for the merge, we will wait for https://github.com/CanalTP/ci-images/pull/28 to have CI working, but I don't see any blocker now 🎉

antoine-de
antoine-de previously approved these changes Jun 14, 2021
pbougue
pbougue previously approved these changes Jun 14, 2021
@pbougue pbougue merged commit 6f1b6a5 into hove-io:master Jun 21, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants