diff options
| author | Daniel Friesel <derf@finalrewind.org> | 2019-04-21 15:46:19 +0200 | 
|---|---|---|
| committer | Daniel Friesel <derf@finalrewind.org> | 2019-04-21 15:46:19 +0200 | 
| commit | 78b2d995ef32b60cfbde086953c5069e327e08a5 (patch) | |
| tree | 35aec7e711a9876642652bc820a3c4883700482e | |
| parent | 24d0943cdc3f50ac1063b6fb8308ce21d940c67d (diff) | |
Ignore stations without coordinates in distance calculation
Reported by @marudor
| -rwxr-xr-x | lib/Travelynx.pm | 38 | ||||
| -rw-r--r-- | lib/Travelynx/Command/database.pm | 14 | ||||
| -rw-r--r-- | 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 @@ -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> | 
