File Coverage

blib/lib/Geo/JSON/Utils.pm
Criterion Covered Total %
statement 30 30 100.0
branch 9 10 90.0
condition 9 18 50.0
subroutine 6 6 100.0
pod 2 2 100.0
total 56 66 84.8


line stmt bran cond sub pod time code
1             package Geo::JSON::Utils;
2              
3             our $VERSION = '0.006'; # VERSION
4              
5             # ABSTRACT: Util methods for Geo::JSON classes
6              
7 7     7   122410 use strict;
  7         16  
  7         282  
8 7     7   68 use warnings;
  7         16  
  7         207  
9 7     7   37 use Carp;
  7         13  
  7         517  
10              
11 7     7   40 use base 'Exporter';
  7         13  
  7         2627  
12              
13             our @EXPORT_OK = qw/ compare_positions compute_bbox /;
14              
15              
16             # TODO make better - need to ensure floating points are the same
17             sub compare_positions {
18 35     35 1 3117 my ( $pos1, $pos2 ) = @_;
19              
20             # Assume positions have same number of dimensions
21 35 100       126 my $dimensions = defined $pos1->[2] ? 2 : 1;
22              
23 35         96 foreach my $dim ( 0 .. $dimensions ) {
24              
25             # TODO fix stringification problems...?
26 72 100 33     824 return 0
      33        
      33        
      66        
27             if ( defined $pos1->[$dim] && !defined $pos2->[$dim] )
28             || ( !defined $pos1->[$dim] && defined $pos2->[$dim] )
29             || ( $pos1->[$dim] != $pos2->[$dim] );
30             }
31              
32 33         164 return 1;
33             }
34              
35              
36             sub compute_bbox {
37 15     15 1 6462 my $positions = shift; # arrayref of positions
38              
39 14         62 croak "Need an array of at least 2 positions"
40             unless ref $positions
41             && ref $positions eq 'ARRAY'
42 15 50 66     220 && @{$positions} > 1;
      66        
43              
44             # Assumes all have same number of dimensions
45              
46 14         21 my $dimensions = scalar @{ $positions->[0] } - 1;
  14         47  
47              
48 13         23 my @min = my @max = @{ $positions->[0] };
  13         53  
49              
50 13         22 foreach my $position ( @{$positions} ) {
  13         35  
51 71         117 foreach my $d ( 0 .. $dimensions ) {
52 167 100       343 $min[$d] = $position->[$d] if $position->[$d] < $min[$d];
53 167 100       471 $max[$d] = $position->[$d] if $position->[$d] > $max[$d];
54             }
55             }
56              
57 13         84 return [ @min, @max ];
58             }
59              
60              
61             1;
62              
63             __END__