summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBirte Kristina Friesel <derf@finalrewind.org>2024-10-13 08:48:35 +0200
committerBirte Kristina Friesel <derf@finalrewind.org>2024-10-13 08:48:35 +0200
commitb8a15268fa0a14867c8056375843f54659d74aee (patch)
treeaa62049c4f5754011f4fdaac573c857fe3bb6d98
parent98296b5aa191d5ddbd9c511f688d66c5a77c6596 (diff)
Add coord request mode
-rwxr-xr-xbin/efa-m32
-rw-r--r--lib/Travel/Status/DE/EFA.pm80
-rw-r--r--lib/Travel/Status/DE/EFA/Stop.pm7
3 files changed, 113 insertions, 6 deletions
diff --git a/bin/efa-m b/bin/efa-m
index 360ea2d..2dfca8d 100755
--- a/bin/efa-m
+++ b/bin/efa-m
@@ -95,7 +95,7 @@ if ($use_cache) {
@grep_mots = split( qr{,}, join( q{,}, @grep_mots ) );
@grep_platforms = split( qr{,}, join( q{,}, @grep_platforms ) );
-my ( $place, $input, $stopseq );
+my ( $place, $input, $coord, $stopseq, $stopfinder );
if ( @ARGV == 1 ) {
if ( $ARGV[0] =~ m{ ^ ([^@]*) @ ([^@]*) [(] ([^)]*) [)] (.*) $ }x ) {
@@ -106,6 +106,17 @@ if ( @ARGV == 1 ) {
key => $4
};
}
+ elsif ( $ARGV[0] =~ m{ ^ [?] (?<name> .*) $ }x ) {
+ $stopfinder = {
+ name => $+{name},
+ };
+ }
+ elsif ( $ARGV[0] =~ m{ ^ (?<lat> [0-9.]+ ) : (?<lon> [0-9].+ ) $ }x ) {
+ $coord = {
+ lat => $+{lat},
+ lon => $+{lon},
+ };
+ }
else {
$input = $ARGV[0];
}
@@ -160,6 +171,8 @@ sub new_efa {
full_routes => $full_routes,
place => $place,
name => $input,
+ coord => $coord,
+ stopfinder => $stopfinder,
stopseq => $stopseq,
time => $time,
type => $input_type,
@@ -301,6 +314,17 @@ sub display_result {
return;
}
+sub show_coord {
+ my $max_len = max map { length( $_->full_name ) } $efa->results;
+ for my $stop ( $efa->results ) {
+ printf(
+ "%5.1f km %-${max_len}s %s\n",
+ $stop->distance_m * 1e-3,
+ $stop->full_name, $stop->id
+ );
+ }
+}
+
sub show_stopseq {
my $trip = $efa->result;
@@ -540,6 +564,12 @@ if ($json_output) {
say JSON->new->convert_blessed->encode( [ $efa->results ] );
}
}
+elsif ($coord) {
+ show_coord();
+}
+elsif ($stopfinder) {
+ show_stopfinder();
+}
elsif ($stopseq) {
show_stopseq();
}
diff --git a/lib/Travel/Status/DE/EFA.pm b/lib/Travel/Status/DE/EFA.pm
index ba17168..8b7b506 100644
--- a/lib/Travel/Status/DE/EFA.pm
+++ b/lib/Travel/Status/DE/EFA.pm
@@ -71,7 +71,14 @@ sub new {
delete $opt{timeout};
}
- if ( not( $opt{name} or $opt{stopseq} or $opt{from_json} ) ) {
+ if (
+ not( $opt{coord}
+ or $opt{name}
+ or $opt{stopfinder}
+ or $opt{stopseq}
+ or $opt{from_json} )
+ )
+ {
confess('You must specify a name');
}
if ( $opt{type}
@@ -85,7 +92,13 @@ sub new {
= Travel::Status::DE::EFA::Services::get_service( $opt{service} ) )
{
$opt{efa_url} = $service->{url};
- if ( $opt{stopseq} ) {
+ if ( $opt{coord} ) {
+ $opt{efa_url} .= '/XML_COORD_REQUEST';
+ }
+ elsif ( $opt{stopfinder} ) {
+ $opt{efa_url} .= '/XML_STOPFINDER_REQUEST';
+ }
+ elsif ( $opt{stopseq} ) {
$opt{efa_url} .= '/XML_STOPSEQCOORD_REQUEST';
}
else {
@@ -159,7 +172,33 @@ sub new {
json => JSON->new->utf8,
};
- if ( $opt{stopseq} ) {
+ if ( $opt{coord} ) {
+
+ # outputFormat => 'JSON' returns invalid JSON
+ $self->{post} = {
+ coord => sprintf( '%.7f:%.7f:%s',
+ $opt{coord}{lon}, $opt{coord}{lat}, 'WGS84[DD.ddddd]' ),
+ radius_1 => 1320,
+ type_1 => 'STOP',
+ coordListOutputFormat => 'list',
+ max => 30,
+ inclFilter => 1,
+ outputFormat => 'rapidJson',
+ };
+ }
+ elsif ( $opt{stopfinder} ) {
+
+ # filter: 2 (stop) | 4 (street) | 8 (address) | 16 (crossing) | 32 (poi) | 64 (postcod)
+ $self->{post} = {
+ locationServerActive => 1,
+ type_sf => 'any',
+ name => $opt{stopfinder}{name},
+ anyObjFilter_sf => 2,
+ coordOutputFormat => 'WGS84[DD.DDDDD]',
+ outputFormat => 'JSON',
+ };
+ }
+ elsif ( $opt{stopseq} ) {
# outputFormat => 'JSON' also works; leads to different output
$self->{post} = {
@@ -489,14 +528,47 @@ sub parse_line {
sub results {
my ($self) = @_;
- my @results;
if ( $self->{results} ) {
return @{ $self->{results} };
}
+ if ( $self->{post}{coord} ) {
+ return $self->results_coord;
+ }
+ else {
+ return $self->results_dm;
+ }
+}
+
+sub results_coord {
+ my ($self) = @_;
+ my $json = $self->{response};
+
+ my @results;
+ for my $stop ( @{ $json->{locations} // [] } ) {
+ push(
+ @results,
+ Travel::Status::DE::EFA::Stop->new(
+ place => $stop->{parent}{name},
+ full_name => $stop->{properties}{STOP_NAME_WITH_PLACE},
+ distance_m => $stop->{properties}{distance},
+ name => $stop->{name},
+ id => $stop->{id},
+ )
+ );
+ }
+
+ $self->{results} = \@results;
+
+ return @results;
+}
+
+sub results_dm {
+ my ($self) = @_;
my $json = $self->{response};
+ my @results;
for my $departure ( @{ $json->{departureList} // [] } ) {
push(
@results,
diff --git a/lib/Travel/Status/DE/EFA/Stop.pm b/lib/Travel/Status/DE/EFA/Stop.pm
index af55ee3..4ef8e12 100644
--- a/lib/Travel/Status/DE/EFA/Stop.pm
+++ b/lib/Travel/Status/DE/EFA/Stop.pm
@@ -11,7 +11,7 @@ our $VERSION = '3.01';
Travel::Status::DE::EFA::Stop->mk_ro_accessors(
qw(sched_arr rt_arr arr arr_delay
sched_dep rt_dep dep dep_delay
- occupancy delay
+ occupancy delay distance_m
place name full_name id stop_id latlon
platform niveau)
);
@@ -117,6 +117,11 @@ first scheduled stop.
DateTime(3pm) object holding departure date and time. undef if this is the
final scheduled stop.
+=item $stop->distance_m
+
+Distance from request coordinates in meters. undef if the object has not
+been obtained by means of a coord request.
+
=item $stop->id
Stop ID.