Commit 78b2d995 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

Ignore stations without coordinates in distance calculation

Reported by @marudor
parent 24d0943c
Loading
Loading
Loading
Loading
+32 −6
Original line number Diff line number Diff line
@@ -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) ) {
					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 );
		}
	);

+14 −0
Original line number Diff line number Diff line
@@ -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 {
+21 −5
Original line number Diff line number Diff line
@@ -89,20 +89,36 @@
				<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 {
							?
						% }
					</td>
				</tr>
				<tr>
					<th scope="row">Geschwindigkeit</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 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>
				<tr>