summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2019-04-21 15:46:19 +0200
committerDaniel Friesel <derf@finalrewind.org>2019-04-21 15:46:19 +0200
commit78b2d995ef32b60cfbde086953c5069e327e08a5 (patch)
tree35aec7e711a9876642652bc820a3c4883700482e
parent24d0943cdc3f50ac1063b6fb8308ce21d940c67d (diff)
Ignore stations without coordinates in distance calculation
Reported by @marudor
-rwxr-xr-xlib/Travelynx.pm38
-rw-r--r--lib/Travelynx/Command/database.pm14
-rw-r--r--templates/journey.html.ep26
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
@@ -480,6 +480,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 @@
<tr>
<th scope="row">Entfernung</th>
<td>
+ % if ($journey->{skip_route}) {
+ <i class="material-icons right">gps_off</i>
+ <%= numify_skipped_stations($journey->{skip_route}) %><br/>
+ % }
% 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)
</td>
</tr>
<tr>
<th scope="row">Geschwindigkeit</th>
<td>
- ∅ <%= sprintf('%.f', $journey->{kmh_route}) %> km/h
- (<%= sprintf('%.f', $journey->{kmh_beeline}) %> km/h)
- % if ($journey->{edited} & 0x0303) {
- ∗
+ % if ($journey->{skip_route}) {
+ <i class="material-icons right">gps_off</i>
+ <%= numify_skipped_stations($journey->{skip_route}) %><br/>
+ % }
+ % 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 {
+ ?
% }
</td>
</tr>