[scripts] AggSetCoord: -c option (fixed coords)
This commit is contained in:
parent
98a3e04c89
commit
37b8157bc6
|
@ -10,28 +10,44 @@ owlps-aggsetcoord - set the coordinates in an aggregation CSV file
|
||||||
B<owlps-aggsetcoord>
|
B<owlps-aggsetcoord>
|
||||||
[ B<-h> | B<-V> ]
|
[ B<-h> | B<-V> ]
|
||||||
[ B<-v> ]
|
[ B<-v> ]
|
||||||
|
[ B<-c> <I<coordinates>> ]
|
||||||
[ B<-m> <I<mac>> ]
|
[ B<-m> <I<mac>> ]
|
||||||
[ <I<aggregation_file>> ]
|
[ <I<aggregation_file>> ]
|
||||||
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
B<owlps-aggsetcoord> automatically filters an aggregation file and interpolates
|
B<owlps-aggsetcoord> is a tool to set the coordinates of mobile devices in a CSV
|
||||||
the blank coordinates according to the previous and next known coordinates and
|
aggregation file, in an automated way. It works only with lines containing
|
||||||
their timestamps, assuming the mobile moves at a constant speed between two
|
positioning requests; the lines containing other types of requests are left
|
||||||
|
untouched. Furthermore, only the default values of the coordinates will be
|
||||||
|
treated; a non-default coordinate will always be left untouched. Note that the
|
||||||
|
default coordinate in OwlPS is registered in aggregation files as "0.00",
|
||||||
|
therefore this program considers the string "0.00" as the default value
|
||||||
|
corresponding to an undefined coordinate. Zero coordinates are not prevented,
|
||||||
|
but you have to write them in another way in your input file, such as "0",
|
||||||
|
"00.00", "0.0", "0.000", etc.
|
||||||
|
|
||||||
|
By default, B<owlps-aggsetcoord> uses the coordinates already present in the
|
||||||
|
input file (manually set by the user, most of the time) to interpolate the
|
||||||
|
coordinates of lines containing default values. A given coordinate is
|
||||||
|
interpolated according to the previous and next known coordinates and their
|
||||||
|
timestamps, assuming the mobile moves at a constant speed between two
|
||||||
timestamps. The interpolation is done in 3 dimensions, each dimension being
|
timestamps. The interpolation is done in 3 dimensions, each dimension being
|
||||||
interpolated independently.
|
interpolated independently.
|
||||||
|
|
||||||
Note that the default coordinate in OwlPS is registered in aggregation files as
|
Alternatively, using the B<-c> option will disable interpolation but apply an
|
||||||
"0.00", therefore this program considers the string "0.00" as an undefined
|
arbitrary set of coordinates to the lines containing only default values.
|
||||||
coordinate. Zero coordinates are not prevented, but you have to write them in
|
|
||||||
another way in your input file, such as "0", "00.00", "0.0", "0.000", etc.
|
|
||||||
|
|
||||||
In theory, you can provide more than one I<aggregation_file> at once, but don't
|
In theory, you can provide more than one I<aggregation_file> at once, but don't
|
||||||
do that unless you really know what you're doing. The (list of) aggregation file
|
do that unless you really know what you're doing. The (list of) aggregation file
|
||||||
name(s) I<must> be placed after the options. If no file is provided, the
|
name(s) I<must> be placed after the options. If no file is provided, the
|
||||||
standard input is read.
|
standard input is read.
|
||||||
|
|
||||||
|
The results are written on the standard output. It is advised to use graphical
|
||||||
|
diff tools such as I<vimdiff> to visualise the differences between the input
|
||||||
|
file and the result and make sure it corresponds to what was expected.
|
||||||
|
|
||||||
|
|
||||||
=head1 LIMITATIONS
|
=head1 LIMITATIONS
|
||||||
|
|
||||||
|
@ -60,6 +76,12 @@ Print version message and exit.
|
||||||
|
|
||||||
Turn on verbose mode (displays a trace on the standard error).
|
Turn on verbose mode (displays a trace on the standard error).
|
||||||
|
|
||||||
|
=item B<-c> <I<coordinates>>
|
||||||
|
|
||||||
|
Apply I<coordinates> to every positioning request with default X, Y and Z. A
|
||||||
|
line in which at least one of the three coordinates is set to a non-default
|
||||||
|
value will be left untouched. I<coordinates> is a string "X;Y;Z".
|
||||||
|
|
||||||
=item B<-m> <I<mac>>
|
=item B<-m> <I<mac>>
|
||||||
|
|
||||||
Work only on positioning requests transmitted by MAC address I<mac>.
|
Work only on positioning requests transmitted by MAC address I<mac>.
|
||||||
|
@ -117,6 +139,11 @@ my $verbose;
|
||||||
# Selected transmitter's MAC address (will stay undefined if -m was not used)
|
# Selected transmitter's MAC address (will stay undefined if -m was not used)
|
||||||
my $selected_mac;
|
my $selected_mac;
|
||||||
|
|
||||||
|
# New coordinates to apply to the selected lines (will stay undefined if -c was
|
||||||
|
# not used)
|
||||||
|
my $new_coordinates;
|
||||||
|
my ($new_x, $new_y, $new_z);
|
||||||
|
|
||||||
# Current line
|
# Current line
|
||||||
my $cur_line;
|
my $cur_line;
|
||||||
|
|
||||||
|
@ -290,7 +317,7 @@ sub apply_interpolation($$$$$$) {
|
||||||
## Option parsing ##
|
## Option parsing ##
|
||||||
|
|
||||||
$Getopt::Std::STANDARD_HELP_VERSION = 1;
|
$Getopt::Std::STANDARD_HELP_VERSION = 1;
|
||||||
use constant OPTIONS => 'hm:vV';
|
use constant OPTIONS => 'c:hm:vV';
|
||||||
my %options;
|
my %options;
|
||||||
if (!getopts(OPTIONS, \%options)) {
|
if (!getopts(OPTIONS, \%options)) {
|
||||||
HELP_MESSAGE(*STDERR);
|
HELP_MESSAGE(*STDERR);
|
||||||
|
@ -311,6 +338,11 @@ if ($options{'V'}) {
|
||||||
$verbose = $options{'v'};
|
$verbose = $options{'v'};
|
||||||
$selected_mac = $options{'m'};
|
$selected_mac = $options{'m'};
|
||||||
|
|
||||||
|
$new_coordinates = $options{'c'};
|
||||||
|
if (defined($new_coordinates)) {
|
||||||
|
($new_x, $new_y, $new_z) = split_point_3d($new_coordinates);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
## Main loop: read lines ##
|
## Main loop: read lines ##
|
||||||
|
|
||||||
|
@ -373,6 +405,34 @@ while ($cur_line = <>) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# The user specified a coordinate to apply to every pertinent line (-c
|
||||||
|
# option): we print it immediately (we are sure not to have any previous
|
||||||
|
# lines in memory, since we don't do that in this mode)
|
||||||
|
if (defined($new_coordinates)) {
|
||||||
|
# If the current line is fully incomplete, we reconstitute it with the
|
||||||
|
# new coordinates
|
||||||
|
if (is_blank($x, $y, $z)) {
|
||||||
|
print($csv_format, ";",
|
||||||
|
$mac, ";",
|
||||||
|
$type, ";",
|
||||||
|
$nb_pkt, ";",
|
||||||
|
$timestamp, ";",
|
||||||
|
$new_x, ";",
|
||||||
|
$new_y, ";",
|
||||||
|
$new_z, ";",
|
||||||
|
$end_line
|
||||||
|
);
|
||||||
|
}
|
||||||
|
# If the current line has at least one of its coordinates to a
|
||||||
|
# non-default value, just print it
|
||||||
|
else {
|
||||||
|
print $cur_line;
|
||||||
|
}
|
||||||
|
# In either case, jump to the next line
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# No previous line in memory: we might have got a chance to get rid of the
|
# No previous line in memory: we might have got a chance to get rid of the
|
||||||
# current line right now
|
# current line right now
|
||||||
if (@prev_lines == 0) {
|
if (@prev_lines == 0) {
|
||||||
|
|
Loading…
Reference in New Issue