diff options
author | Birte Kristina Friesel <derf@finalrewind.org> | 2025-03-22 17:59:29 +0100 |
---|---|---|
committer | Birte Kristina Friesel <derf@finalrewind.org> | 2025-03-22 17:59:29 +0100 |
commit | 06cbcd71b1cb146f9542059bed0722b39845c718 (patch) | |
tree | fa6c2cd616c4b4da4f9a7e157497218313a6286a /lib/Travel/Status/DE | |
parent | a32580953447d42184f155cdefd2bdedb3ace9e6 (diff) |
Journey: Add polyline accessor; provide name/eva if GIS::Distance is available
Diffstat (limited to 'lib/Travel/Status/DE')
-rw-r--r-- | lib/Travel/Status/DE/DBRIS/Journey.pm | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/lib/Travel/Status/DE/DBRIS/Journey.pm b/lib/Travel/Status/DE/DBRIS/Journey.pm index 1549e8a..ba19337 100644 --- a/lib/Travel/Status/DE/DBRIS/Journey.pm +++ b/lib/Travel/Status/DE/DBRIS/Journey.pm @@ -24,6 +24,7 @@ sub new { train => $json->{zugName}, is_cancelled => $json->{cancelled}, raw_route => $json->{halte}, + raw_polyline => $json->{polylineGroup}{polylineDescriptions}, strptime_obj => $strptime, }; @@ -44,6 +45,59 @@ sub new { return $ref; } +sub polyline { + my ($self) = @_; + + if ( not $self->{raw_polyline} ) { + return; + } + + if ( $self->{polyline} ) { + return @{ $self->{polyline} }; + } + + my $distance; + my $polyline = [ map { { lon => $_->{lng}, lat => $_->{lat} } } + @{ $self->{raw_polyline}[0]{coordinates} } ]; + + eval { + require GIS::Distance; + $distance = GIS::Distance->new; + }; + + if ($distance) { + my %min_dist; + for my $stop ( $self->route ) { + for my $polyline_index ( 0 .. $#{$polyline} ) { + my $pl = $polyline->[$polyline_index]; + my $dist + = $distance->distance_metal( $stop->{lat}, $stop->{lon}, + $pl->{lat}, $pl->{lon} ); + if ( not $min_dist{ $stop->{eva} } + or $min_dist{ $stop->{eva} }{dist} > $dist ) + { + $min_dist{ $stop->{eva} } = { + dist => $dist, + index => $polyline_index, + }; + } + } + } + for my $stop ( $self->route ) { + if ( $min_dist{ $stop->{eva} } ) { + $polyline->[ $min_dist{ $stop->{eva} }{index} ]{name} + = $stop->{name}; + $polyline->[ $min_dist{ $stop->{eva} }{index} ]{eva} + = $stop->{eva}; + } + } + } + + $self->{polyline} = $polyline; + + return @{ $self->{polyline} }; +} + sub route { my ($self) = @_; @@ -81,6 +135,9 @@ sub TO_JSON { # transform raw_route into route (lazy accessor) $self->route; + # transform raw_polyline into polyline (lazy accessor) + $self->polyline; + my $ret = { %{$self} }; delete $ret->{strptime_obj}; |