diff options
author | Daniel Friesel <derf@finalrewind.org> | 2021-04-03 10:45:43 +0200 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2021-04-03 10:46:33 +0200 |
commit | 630cfe75900885856ad0a30e45c4c572a7dc54c1 (patch) | |
tree | 41bd02d0d1d0f036de7b168f496a89fcde35e4da /lib/DBInfoscreen/Controller | |
parent | 133c042886346c55e8a7a6b37ba3508807115234 (diff) |
map: improve position estimation for delayed trains3.12.1
HAFAS does not provide delays of past stops, so we estimate it ourselves
(assuming that the delay at the previous stop is identical to the delay at the
next stop)
Diffstat (limited to 'lib/DBInfoscreen/Controller')
-rw-r--r-- | lib/DBInfoscreen/Controller/Map.pm | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/lib/DBInfoscreen/Controller/Map.pm b/lib/DBInfoscreen/Controller/Map.pm index b4c9134..8912e5d 100644 --- a/lib/DBInfoscreen/Controller/Map.pm +++ b/lib/DBInfoscreen/Controller/Map.pm @@ -235,7 +235,7 @@ sub estimate_train_positions { # next_stop: {type, station} # positions: [current position [lat, lon], 2s from now, 4s from now, ...] sub estimate_train_positions2 { - my (%opt) = @_; + my ( $self, %opt ) = @_; my $now = $opt{now}; my @route = @{ $opt{route} // [] }; @@ -249,6 +249,9 @@ sub estimate_train_positions2 { and $now < ( $route[$i]{arr} // $route[$i]{dep} ) ) { + # HAFAS does not provide delays for past stops + $self->backpropagate_delay( $route[ $i - 1 ], $route[$i] ); + # (current position, future positons...) in 2 second steps @train_positions = estimate_train_positions( from => $route[ $i - 1 ], @@ -568,13 +571,13 @@ sub intersection { my @route2 = stopovers_to_route( @{ $pl2->{raw}{stopovers} // [] } ); - my $train1_pos = estimate_train_positions2( + my $train1_pos = $self->estimate_train_positions2( now => $now, route => \@route1, features => $pl1->{raw}{polyline}{features}, ); - my $train2_pos = estimate_train_positions2( + my $train2_pos = $self->estimate_train_positions2( now => $now, route => \@route2, features => $pl2->{raw}{polyline}{features}, @@ -662,6 +665,25 @@ sub intersection { )->wait; } +sub backpropagate_delay { + my ( $self, $prev_stop, $next_stop ) = @_; + + if ( ( $next_stop->{arr_delay} || $next_stop->{dep_delay} ) + and not( $prev_stop->{dep_delay} || $prev_stop->{arr_delay} ) ) + { + $self->log->debug("need to back-propagate delay"); + my $delay = $next_stop->{arr_delay} || $next_stop->{dep_delay}; + if ( $prev_stop->{arr} ) { + $prev_stop->{arr}->add( minutes => $delay ); + $prev_stop->{arr_delay} = $delay; + } + if ( $prev_stop->{dep} ) { + $prev_stop->{dep}->add( minutes => $delay ); + $prev_stop->{dep_delay} = $delay; + } + } +} + sub route { my ($self) = @_; my $trip_id = $self->stash('tripid'); @@ -689,6 +711,12 @@ sub route { my @route = stopovers_to_route( @{ $pl->{raw}{stopovers} // [] } ); + my $train_pos = $self->estimate_train_positions2( + now => $now, + route => \@route, + features => $pl->{raw}{polyline}{features}, + ); + # Prepare from/to markers and name/time/delay overlays for stations for my $stop (@route) { my @stop_lines = ( $stop->{name} ); @@ -738,12 +766,6 @@ sub route { [ [ $stop->{lat}, $stop->{lon} ], [@stop_lines], ] ); } - my $train_pos = estimate_train_positions2( - now => $now, - route => \@route, - features => $pl->{raw}{polyline}{features}, - ); - push( @markers, { @@ -822,7 +844,7 @@ sub ajax_route { my @route = stopovers_to_route( @{ $pl->{raw}{stopovers} // [] } ); - my $train_pos = estimate_train_positions2( + my $train_pos = $self->estimate_train_positions2( now => $now, route => \@route, features => $pl->{raw}{polyline}{features}, |