From e896cdbf310ae63f2a03ed9e6ec58e0fbb4bacd9 Mon Sep 17 00:00:00 2001
From: Birte Kristina Friesel <derf@finalrewind.org>
Date: Sat, 22 Mar 2025 21:23:16 +0100
Subject: Trip->polyline: augment (likely) stop coordinates with name and ID

Needs GIS::Distance; augmentation is skipped if it is not available
---
 lib/Travel/Status/DE/EFA/Trip.pm | 50 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 47 insertions(+), 3 deletions(-)

diff --git a/lib/Travel/Status/DE/EFA/Trip.pm b/lib/Travel/Status/DE/EFA/Trip.pm
index f3a58bf..31938ec 100644
--- a/lib/Travel/Status/DE/EFA/Trip.pm
+++ b/lib/Travel/Status/DE/EFA/Trip.pm
@@ -57,13 +57,57 @@ sub polyline {
 	if ( $opt{fallback} and not @{ $self->{polyline_raw} // [] } ) {
 
 		# TODO add $_->{id} as well?
-		return
-		  map { { lat => $_->{latlon}[0], lon => $_->{latlon}[1] } }
-		  $self->route;
+		return map {
+			{
+				lat     => $_->{latlon}[0],
+				lon     => $_->{latlon}[1],
+				name    => $_->name,
+				id_num  => $_->id_num,
+				id_code => $_->id_code
+			}
+		} $self->route;
 	}
 
 	$self->{polyline} = [ map { { lat => $_->[0], lon => $_->[1] } }
 		  @{ $self->{polyline_raw} } ];
+	my $distance;
+
+	eval {
+		require GIS::Distance;
+		$distance = GIS::Distance->new;
+	};
+
+	if ($distance) {
+		my %min_dist;
+		for my $stop ( $self->route ) {
+			for my $polyline_index ( 0 .. $#{ $self->{polyline} } ) {
+				my $pl   = $self->{polyline}[$polyline_index];
+				my $dist = $distance->distance_metal(
+					$stop->{latlon}[0],
+					$stop->{latlon}[1],
+					$pl->{lat}, $pl->{lon}
+				);
+				if ( not $min_dist{ $stop->{id_code} }
+					or $min_dist{ $stop->{id_code} }{dist} > $dist )
+				{
+					$min_dist{ $stop->{id_code} } = {
+						dist  => $dist,
+						index => $polyline_index,
+					};
+				}
+			}
+		}
+		for my $stop ( $self->route ) {
+			if ( $min_dist{ $stop->{id_code} } ) {
+				$self->{polyline}[ $min_dist{ $stop->{id_code} }{index} ]{name}
+				  = $stop->{name};
+				$self->{polyline}[ $min_dist{ $stop->{id_code} }{index} ]
+				  {id_num} = $stop->{id_num};
+				$self->{polyline}[ $min_dist{ $stop->{id_code} }{index} ]
+				  {id_code} = $stop->{id_code};
+			}
+		}
+	}
 
 	return @{ $self->{polyline} };
 }
-- 
cgit v1.2.3