NAME

GPS::Point::Filter - Algorithm to filter extraneous GPS points

SYNOPSIS

use GPS::Point::Filter;
my $gpf=GPS::Point::Filter->new;
$gpf->addCallback(sample=>\&GPS::Point::Filter::callback_sample);
my $status=$gpf->addPoint($point);

DESCRIPTION

GPS::Point::Filter uses a single pass linear algorithm to filter extraneous GPS points from a GPS feed. The filter uses three tests to determine whether to trigger a callback or not.

The most common use for this type of algorithm is to intelligently reduce the number of points before transmission over a limited bandwidth network. The filter properties will need to be tuned for particular networks and implementations.

USAGE

use GPS::Point::Filter;
my $gpf=GPS::Point::Filter->new;
$gpf->addCallback(sample=>\&GPS::Point::Filter::callback_sample);
my $point=GPS::Point->new(time    => time,
                          lat     => 39,
                          lon     => -77,
                          speed   => 25,
                          heading => 135);
my $status=$gpf->addPoint($point);
printf "%s\n", $status if $status;

CONSTRUCTOR

new

my $gpf=GPS::Point::Filter->new(
                                separation => 2000,  #meters
                                interlude  => 1200,  #seconds
                                deviation  => 500,   #meters
                               );

initialize

METHODS (Properties)

interlude

Sets or returns the filter interlude property. The interlude is defined as the period of time in seconds for which the previous filter point is still valid or not stale. The filter will trigger a callback if the GPS sample point does not move when the interlude is exceeded.

$gpf->interlude(1200); #default is 1200 seconds

separation

Sets or returns the filter separation property. The separation is defined as the distance in meters between the previous filter point and the sample point. The filter will trigger a callback when then separation is exceeded.

$gpf->separation(2000); #default is 2000 meters

deviation

Sets or returns the filter deviation property. The deviation is defined as the distance in meters between the constant velocity predicted location of the previous filter point and the sample point. The filter will trigger a callback when then deviation is exceeded.

$gpf->deviation(500); #default is 500 meters

METHODS

addCallback

Add a sub reference to the callback hash and returns the $gpf object.

$gpf->addCallback(label=>sub{print shift->latlon."\n"});
$gpf->addCallback(label=>\&mysub);
sub mysub {
  my $point=shift;#GPS::Point (new point)
  my $gpf=shift;  #GPS::Point::Filter with state info and previous point
  printf "Lat: %s, Lon: %s\n", $point->latlon;
}

deleteCallback

my $sub=$gpf->deleteCallback("label");

addPoint

Adds a point to the filter to be tested and returns a short staus string. If the point is "extraneous", then the filter will not trigger a callback.

my $point=GPS::Point->new(
                          lat     =>  39.000, #decimal degrees
                          lon     => -77.000, #decimal degrees
                          speed   =>  50.0,   #meters/second
                          heading =>  45.0,   #degrees clockwise from North
                          );
my $status=$gpf->addPoint($point);
if ($status) {print "added"} else {print "filtered"}

point

Sets or returns the GPS point stored in the GPS::Point::Filter object.

my $point=$gpf->point;

This point is set to the previous filter point when the callback is triggered. But, is updated just after the execute is complete.

count

Sets or returns the count of number of points that have been filtered since the previous filter point;

$gpf->count;

status

Sets or returns the status of the previous filter point.

METHODS (Internal)

callback

Returns the callback hash of sub references.

my $callback=$gpf->callback; #{label=>sub{}}
my %callback=$gpf->callback; #(label=>sub{})

Note: Callbacks are executed sorted by key.

execute

Executes all sub references in the callback hash sorted by key.

The $point and the $gpf objects are passed to the sub routine as the first two arguments.

$gpf->execute;

Functions (Convenience)

callback_sample

A very simple callback example.

GPS::Point::Filter::callback_sample_string($point);

To register

$gpf->addCallback(sample=>\&GPS::Point::Filter::callback_sample);

callback_sample_string

Returns a formated string given a GPS::Point

my $string=GPS::Point::Filter::callback_sample_string($point);

TODO

I would like to implement a Kalman Filter in order to filter point data instead of the current interlude, separation, and deviation properties.

Add count of points filtered since previous point

Add status to gpf object

BUGS

Please report bugs to GEO-PERL list

SUPPORT

Please Try the GEO-PERL list

AUTHOR

Michael R. Davis
CPAN ID: MRDVT
domain=>michaelrdavis,tld=>com,account=>perl

COPYRIGHT

This program is free software licensed under the...

The BSD License

The full text of the license can be found in the LICENSE file included with this module.

SEE ALSO

GSP::Point, GPS::Point::Filter, Net::GSPD, Geo::Forward, Geo::Inverse