NAME
Geo::Spline - Calculate geographic locations between GPS fixes.
SYNOPSIS
use
Geo::Spline;
my
$p0
= {
time
=> 1160449100.67,
#seconds
lat
=> 39.197807,
#degrees
lon
=> -77.263510,
#degrees
speed
=> 31.124,
#m/s
heading
=> 144.8300,
#degrees clockwise from North
};
my
$p1
= {
time
=> 1160449225.66,
lat
=> 39.167718,
lon
=> -77.242278,
speed
=> 30.615,
heading
=>1 50.5300,
};
my
$spline
= Geo::Spline->new(
$p0
,
$p1
);
my
%point
=
$spline
->point(1160449150);
"Lat:"
,
$point
{
"lat"
},
", Lon:"
,
$point
{
"lon"
},
"\n\n"
;
my
@points
=
$spline
->pointlist();
foreach
(
@points
) {
"Lat:"
,
$_
->{
"lat"
},
", Lon:"
,
$_
->{
"lon"
},
"\n"
;
}
DESCRIPTION
This program was developed to be able to calculate the position between two GPS fixes using a 2-dimensional 3rd order polynomial spline.
f(t) = A + B(t-t0) + C(t-t0)^2 + D(t-t0)^3
#position in X and Y
f'(t) = B + 2C(t-t0) + 3D(t-t0)^2
#velocity in X and Y
Formulas to calculate the unknowns from our knowns.
A = x0
# when (t-t0)=0 in f(t)
B = v0
# when (t-t0)=0 in f'(t)
C = (x1-A-B(t1-t0)-D(t1-t0)^3)/(t1-t0)^2
# solve for C from f(t)
C = (v1-B-3D(t1-t0)^2)/2(t1-t0)
# solve for C from f'(t)
D = (v1(t1-t0)+B(t1-t0)-2x1+2A)/(t1-t0)^3
# equate C=C then solve for D
CONSTRUCTOR
new
my
$spline
= Geo::Spline->new(
$p0
,
$p1
);
initialize
METHODS
ellipsoid
Method to set or retrieve the current ellipsoid object. The ellipsoid is a Geo::Ellipsoids object.
my
$ellipsoid
=
$obj
->ellipsoid;
#Default is WGS84
$obj
->ellipsoid(
'Clarke 1866'
);
#Built in ellipsoids from Geo::Ellipsoids
$obj
->ellipsoid({
a
=>1});
#Custom Sphere 1 unit radius
ABCD
point
Method returns a single point from a single time.
my
$point
=
$spline
->point(
$t1
);
my
%point
=
$spline
->point(
$t1
);
pointlist
Method returns a list of points from a list of times.
my
$list
=
$spline
->pointlist(
$t1
,
$t2
,
$t3
);
my
@list
=
$spline
->pointlist(
$t1
,
$t2
,
$t3
);
timelist
Method returns a list of times (n+1). The default will return a list with an integer number of seconds between spline end points.
my
$list
=
$spline
->timelist(
$samples
);
my
@list
=
$spline
->timelist();
LIMITATIONS
The conversion from degrees to meters and then back is accurate for short distances.
AUTHOR
Michael R. Davis
LICENSE
Copyright (c) 2006-2025 Michael R. Davis
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
SEE ALSO
http://search.cpan.org/src/MRDVT/Geo-Spline-0.16/doc/spline.xls http://search.cpan.org/src/MRDVT/Geo-Spline-0.16/doc/spline.png