From 78b2d995ef32b60cfbde086953c5069e327e08a5 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sun, 21 Apr 2019 15:46:19 +0200 Subject: [PATCH] Ignore stations without coordinates in distance calculation Reported by @marudor --- lib/Travelynx.pm | 38 ++++++++++++++++++++++++++----- lib/Travelynx/Command/database.pm | 14 ++++++++++++ templates/journey.html.ep | 26 +++++++++++++++++---- 3 files changed, 67 insertions(+), 11 deletions(-) diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm index 6ab89fe..caa4cba 100755 --- a/lib/Travelynx.pm +++ b/lib/Travelynx.pm @@ -479,6 +479,22 @@ qq{select * from pending_mails where email = ? and num_tries > 1;} } ); + $self->helper( + 'numify_skipped_stations' => sub { + my ( $self, $count ) = @_; + + if ( $count == 0 ) { + return 'INTERNAL ERROR'; + } + if ( $count == 1 ) { + return +'Eine Station ohne Geokoordinaten wurde nicht berücksichtigt.'; + } + return +"${count} Stationen ohne Geookordinaten wurden nicht berücksichtigt."; + } + ); + $self->helper( 'get_departures' => sub { my ( $self, $station, $lookbehind ) = @_; @@ -1407,13 +1423,17 @@ qq{select * from pending_mails where email = ? and num_tries > 1;} ? $ref->{rt_arrival}->epoch - $ref->{rt_departure}->epoch : undef; - $ref->{km_route} + my ( $km, $skip ) = $self->get_travel_distance( $ref->{from_name}, $ref->{to_name}, $ref->{route} ); - $ref->{km_beeline} + $ref->{km_route} = $km; + $ref->{skip_route} = $skip; + ( $km, $skip ) = $self->get_travel_distance( $ref->{from_name}, $ref->{to_name}, [ $ref->{from_name}, $ref->{to_name} ] ); + $ref->{km_beeline} = $km; + $ref->{skip_beeline} = $skip; my $kmh_divisor = ( $ref->{rt_duration} // $ref->{sched_duration} // 999999 ) / 3600; @@ -1531,6 +1551,7 @@ qq{select * from pending_mails where email = ? and num_tries > 1;} my ( $self, $from, $to, $route_ref ) = @_; my $distance = 0; + my $skipped = 0; my $geo = Geo::Distance->new(); my @route = after_incl { $_ eq $from } @{$route_ref}; @route = before_incl { $_ eq $to } @route; @@ -1548,14 +1569,19 @@ qq{select * from pending_mails where email = ? and num_tries > 1;} for my $station_name (@route) { if ( my $station = get_station($station_name) ) { - $distance - += $geo->distance( 'kilometer', $prev_station->[3], - $prev_station->[4], $station->[3], $station->[4] ); + if ( $#{$prev_station} >= 4 and $#{$station} >= 4 ) { + $distance + += $geo->distance( 'kilometer', $prev_station->[3], + $prev_station->[4], $station->[3], $station->[4] ); + } + else { + $skipped++; + } $prev_station = $station; } } - return $distance; + return ( $distance, $skipped ); } ); diff --git a/lib/Travelynx/Command/database.pm b/lib/Travelynx/Command/database.pm index b8131eb..7a9aed3 100644 --- a/lib/Travelynx/Command/database.pm +++ b/lib/Travelynx/Command/database.pm @@ -123,6 +123,20 @@ my @migrations = ( } ); }, + + # v2 -> v3 + # A bug in the journey distance calculation caused excessive distances to be + # reported for routes covering stations without GPS coordinates. Ensure + # all caches are rebuilt. + sub { + my ($dbh) = @_; + return $dbh->do( + qq{ + delete from journey_stats; + update schema_version set version = 3; + } + ); + }, ); sub setup_db { diff --git a/templates/journey.html.ep b/templates/journey.html.ep index 07c53c1..47c85f0 100644 --- a/templates/journey.html.ep +++ b/templates/journey.html.ep @@ -89,19 +89,35 @@ Entfernung + % if ($journey->{skip_route}) { + gps_off + <%= numify_skipped_stations($journey->{skip_route}) %>
+ % } % if ($journey->{km_route} > 0.1) { ca. <%= sprintf('%.f', $journey->{km_route}) %> km + (Luftlinie: <%= sprintf('%.f', $journey->{km_beeline}) %> km) + % } + % else { + ? % } - (Luftlinie: <%= sprintf('%.f', $journey->{km_beeline}) %> km) Geschwindigkeit - ∅ <%= sprintf('%.f', $journey->{kmh_route}) %> km/h - (<%= sprintf('%.f', $journey->{kmh_beeline}) %> km/h) - % if ($journey->{edited} & 0x0303) { - ∗ + % if ($journey->{skip_route}) { + gps_off + <%= numify_skipped_stations($journey->{skip_route}) %>
+ % } + % if ($journey->{km_route} > 0.1 and $journey->{kmh_route} > 0.01) { + ∅ <%= sprintf('%.f', $journey->{kmh_route}) %> km/h + (<%= sprintf('%.f', $journey->{kmh_beeline}) %> km/h) + % if ($journey->{edited} & 0x0303) { + ∗ + % } + % } + % else { + ? % }