diff options
Diffstat (limited to 'lib/DBInfoscreen')
-rw-r--r-- | lib/DBInfoscreen/Controller/Map.pm | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/lib/DBInfoscreen/Controller/Map.pm b/lib/DBInfoscreen/Controller/Map.pm index 8912e5d..cea5155 100644 --- a/lib/DBInfoscreen/Controller/Map.pm +++ b/lib/DBInfoscreen/Controller/Map.pm @@ -224,7 +224,7 @@ sub estimate_train_positions { # Input: # now: DateTime -# route: hash +# route: arrayref of hashrefs # lat: float # lon: float # name: str @@ -241,9 +241,13 @@ sub estimate_train_positions2 { my @train_positions; my $next_stop; + my $geo = Geo::Distance->new; + my $stop_distance_sum = 0; + my $avg_inter_stop_beeline = 0; for my $i ( 1 .. $#route ) { - if ( ( $route[$i]{arr} // $route[$i]{dep} ) + if ( not $next_stop + and ( $route[$i]{arr} // $route[$i]{dep} ) and ( $route[ $i - 1 ]{dep} // $route[ $i - 1 ]{arr} ) and $now > ( $route[ $i - 1 ]{dep} // $route[ $i - 1 ]{arr} ) and $now < ( $route[$i]{arr} // $route[$i]{dep} ) ) @@ -264,9 +268,9 @@ sub estimate_train_positions2 { type => 'next', station => $route[$i], }; - last; } - if ( ( $route[ $i - 1 ]{dep} // $route[ $i - 1 ]{arr} ) + if ( not $next_stop + and ( $route[ $i - 1 ]{dep} // $route[ $i - 1 ]{arr} ) and $now <= ( $route[ $i - 1 ]{dep} // $route[ $i - 1 ]{arr} ) ) { @train_positions @@ -275,8 +279,17 @@ sub estimate_train_positions2 { type => 'present', station => $route[ $i - 1 ], }; - last; } + $stop_distance_sum += $geo->distance( + 'meter', + $route[ $i - 1 ]{lon}, + $route[ $i - 1 ]{lat}, + $route[$i]{lon}, $route[$i]{lat} + ); + } + + if ($#route) { + $avg_inter_stop_beeline = $stop_distance_sum / $#route; } if ( @route and not $next_stop ) { @@ -290,9 +303,10 @@ sub estimate_train_positions2 { my $position_now = shift @train_positions; return { - next_stop => $next_stop, - position_now => $position_now, - positions => \@train_positions, + next_stop => $next_stop, + avg_inter_stop_beeline => $avg_inter_stop_beeline, + position_now => $position_now, + positions => \@train_positions, }; } @@ -809,7 +823,9 @@ sub route { } ], station_coordinates => [@station_coordinates], - markers => [@markers], + station_radius => + ( $train_pos->{avg_inter_stop_beeline} > 500 ? 250 : 100 ), + markers => [@markers], ); } )->catch( |