summaryrefslogtreecommitdiff
path: root/lib/Travel/Status
diff options
context:
space:
mode:
authorBirte Kristina Friesel <derf@finalrewind.org>2025-03-22 17:59:29 +0100
committerBirte Kristina Friesel <derf@finalrewind.org>2025-03-22 17:59:29 +0100
commit06cbcd71b1cb146f9542059bed0722b39845c718 (patch)
treefa6c2cd616c4b4da4f9a7e157497218313a6286a /lib/Travel/Status
parenta32580953447d42184f155cdefd2bdedb3ace9e6 (diff)
Journey: Add polyline accessor; provide name/eva if GIS::Distance is available
Diffstat (limited to 'lib/Travel/Status')
-rw-r--r--lib/Travel/Status/DE/DBRIS/Journey.pm57
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};