Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
29 / 29
86.67% covered (warning)
86.67%
39 / 45
66.67% covered (warning)
66.67%
22 / 33
54.55% covered (warning)
54.55%
6 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 1
LatLonRange
100.00% covered (success)
100.00%
29 / 29
86.67% covered (warning)
86.67%
39 / 45
66.67% covered (warning)
66.67%
22 / 33
100.00% covered (success)
100.00%
11 / 11
57.04
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 __destruct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 __toString
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 min
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 max
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 distance
100.00% covered (success)
100.00%
7 / 7
60.00% covered (warning)
60.00%
3 / 5
25.00% covered (danger)
25.00%
1 / 4
100.00% covered (success)
100.00%
1 / 1
6.80
 isPointContained
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
7 / 7
50.00% covered (danger)
50.00%
4 / 8
100.00% covered (success)
100.00%
1 / 1
6.00
 position
100.00% covered (success)
100.00%
3 / 3
85.71% covered (warning)
85.71%
6 / 7
75.00% covered (warning)
75.00%
3 / 4
100.00% covered (success)
100.00%
1 / 1
4.25
 getNorthPosition
100.00% covered (success)
100.00%
3 / 3
85.71% covered (warning)
85.71%
6 / 7
75.00% covered (warning)
75.00%
3 / 4
100.00% covered (success)
100.00%
1 / 1
4.25
 getCenterPosition
100.00% covered (success)
100.00%
3 / 3
85.71% covered (warning)
85.71%
6 / 7
75.00% covered (warning)
75.00%
3 / 4
100.00% covered (success)
100.00%
1 / 1
4.25
 getSouthPosition
100.00% covered (success)
100.00%
3 / 3
85.71% covered (warning)
85.71%
6 / 7
75.00% covered (warning)
75.00%
3 / 4
100.00% covered (success)
100.00%
1 / 1
4.25
1<?php
2namespace Fdsn\Webservices\Event\Range;
3
4use Fdsn\Webservices\Event\Data\LatLon;
5
6/**
7 * Data structure to handle Latitude,Longitude bounding box
8 *
9 * @param LatLon $min    Min Latitude,Longitude 
10 * @param LatLon $max    Max Latitude,Longitude 
11 */
12class LatLonRange {
13    private const earthRadius = 6372.795;
14    private LatLon $min;
15    private LatLon $max;
16
17    private $validLatitude = array('min' => -180, 'max' => 180);
18    private $validLongitude = array('min' => -180, 'max' => 180);
19
20    function __construct( LatLon $min, LatLon $max) {
21        $this->min = $min;
22        $this->max = $max;
23    }
24
25    function __destruct(){ }
26
27    /**
28     * Returns bounding box coordinates 
29     *
30     * @return string Bounding box in [%.5f,%.5f],[%.5f,%.5f] [min lat,lon],[max lat,lon] format
31     */
32    function __toString(){ 
33        return sprintf("[%.5f,%.5f],[%.5f,%.5f]", 
34            $this->min->lat(), $this->min->lon(),
35            $this->max->lat(), $this->max->lon()); 
36    }
37
38    /**
39     * Get min bouding box coordinates
40     *
41     * @return LatLon  Min bouding box coordinates
42     */
43    public function min():LatLon { return $this->min; }
44
45    /**
46     * Get max bouding box coordinates
47     *
48     * @return LatLon  Max bouding box coordinates
49     */
50    public function max():LatLon { return $this->max; }
51
52    /**
53     * Get distance (in km) between the 2 points
54     *
55     * @return float distance in km
56     */
57    public function distance():float{
58        $colat1 = ( 90 - $this->min->lat()) * pi() / 180;
59        $colat2 = ( 90 - $this->max->lat()) * pi() / 180;
60
61        $phi = ($this->max->lon() - $this->min->lon()) * pi() / 180;
62        $arg = cos($colat1) * cos($colat2) + sin($colat1) * sin($colat2) * cos($phi);
63
64        if( $arg > 1 ) $arg = 1;
65        if( $arg < -1 ) $arg = -1;
66
67        return  abs(self::earthRadius * acos($arg));
68    }
69
70    /**
71     * Check if a point (LatLon obj) is contained by the bounding box (this LatLonRange)
72     *
73     * @param LatLon $point point to check if is contained by the bounding box
74     *
75     * @return bool    true if is contained by the bounding box, false otherwise
76     */
77    public function isPointContained(LatLon $point):bool{
78        return ( $this->min->lat() <= $point->lat() && $point->lat() <= $this->max->lat() 
79            && $this->min->lon() <= $point->lon() && $point->lon() <= $this->max->lon() );
80    }
81
82    /**
83     * Get spatial position first point respect to second point
84     * possible values are:
85     * NO N NE
86     * O  C  E
87     * SO S SE
88     * @return string position of first point respect to second point (see __construct())
89     */
90    public function position():string{
91        //North
92        if( $this->min->lat() > $this->max->lat() ) return $this->getNorthPosition();
93
94        //Center
95        if( $this->min->lat() == $this->max->lat() ) return $this->getCenterPosition();
96
97        //South
98        if( $this->min->lat() < $this->max->lat() ) return $this->getSouthPosition();
99    }
100
101    /**
102     * Get north position
103     * possible values are:
104     * NO N NE
105     * @return string position of first point respect to second point (see __construct())
106     */
107    private function getNorthPosition():string{
108        if($this->min->lon() <  $this->max->lon()) return 'NO';
109        if($this->min->lon() == $this->max->lon()) return 'N';
110        if($this->min->lon() >  $this->max->lon()) return 'NE';
111    }
112    
113    /**
114     * Get center position
115     * possible values are:
116     * O  C  E
117     * @return string position of first point respect to second point (see __construct())
118     */
119    private function getCenterPosition():string{
120        if($this->min->lon() <  $this->max->lon()) return 'O';
121        if($this->min->lon() == $this->max->lon()) return 'C';
122        if($this->min->lon() >  $this->max->lon()) return 'E';
123    }
124
125    /**
126     * Get south position
127     * possible values are:
128     * SO S SE
129     * @return string position of first point respect to second point (see __construct())
130     */
131    private function getSouthPosition():string{
132        if($this->min->lon() >  $this->max->lon()) return 'SO';
133        if($this->min->lon() == $this->max->lon()) return 'S';
134        if($this->min->lon() <  $this->max->lon()) return 'SE';
135    }
136
137} 

Branches

Below are the source code lines that represent each code branch as identified by Xdebug. Please note a branch is not necessarily coterminous with a line, a line may contain multiple branches and therefore show up more than once. Please also be aware that some branches may be implicit rather than explicit, e.g. an if statement always has an else as part of its logical flow even if you didn't write one.

LatLonRange->__construct
20    function __construct( LatLon $min, LatLon $max) {
21        $this->min = $min;
22        $this->max = $max;
23    }
LatLonRange->__destruct
25    function __destruct(){ }
LatLonRange->__toString
33        return sprintf("[%.5f,%.5f],[%.5f,%.5f]", 
34            $this->min->lat(), $this->min->lon(),
35            $this->max->lat(), $this->max->lon()); 
36    }
LatLonRange->distance
58        $colat1 = ( 90 - $this->min->lat()) * pi() / 180;
59        $colat2 = ( 90 - $this->max->lat()) * pi() / 180;
60
61        $phi = ($this->max->lon() - $this->min->lon()) * pi() / 180;
62        $arg = cos($colat1) * cos($colat2) + sin($colat1) * sin($colat2) * cos($phi);
63
64        if( $arg > 1 ) $arg = 1;
64        if( $arg > 1 ) $arg = 1;
65        if( $arg < -1 ) $arg = -1;
65        if( $arg < -1 ) $arg = -1;
65        if( $arg < -1 ) $arg = -1;
66
67        return  abs(self::earthRadius * acos($arg));
67        return  abs(self::earthRadius * acos($arg));
68    }
LatLonRange->getCenterPosition
120        if($this->min->lon() <  $this->max->lon()) return 'O';
120        if($this->min->lon() <  $this->max->lon()) return 'O';
121        if($this->min->lon() == $this->max->lon()) return 'C';
121        if($this->min->lon() == $this->max->lon()) return 'C';
122        if($this->min->lon() >  $this->max->lon()) return 'E';
122        if($this->min->lon() >  $this->max->lon()) return 'E';
123    }
LatLonRange->getNorthPosition
108        if($this->min->lon() <  $this->max->lon()) return 'NO';
108        if($this->min->lon() <  $this->max->lon()) return 'NO';
109        if($this->min->lon() == $this->max->lon()) return 'N';
109        if($this->min->lon() == $this->max->lon()) return 'N';
110        if($this->min->lon() >  $this->max->lon()) return 'NE';
110        if($this->min->lon() >  $this->max->lon()) return 'NE';
111    }
LatLonRange->getSouthPosition
132        if($this->min->lon() >  $this->max->lon()) return 'SO';
132        if($this->min->lon() >  $this->max->lon()) return 'SO';
133        if($this->min->lon() == $this->max->lon()) return 'S';
133        if($this->min->lon() == $this->max->lon()) return 'S';
134        if($this->min->lon() <  $this->max->lon()) return 'SE';
134        if($this->min->lon() <  $this->max->lon()) return 'SE';
135    }
LatLonRange->isPointContained
77    public function isPointContained(LatLon $point):bool{
78        return ( $this->min->lat() <= $point->lat() && $point->lat() <= $this->max->lat() 
78        return ( $this->min->lat() <= $point->lat() && $point->lat() <= $this->max->lat() 
78        return ( $this->min->lat() <= $point->lat() && $point->lat() <= $this->max->lat() 
79            && $this->min->lon() <= $point->lon() && $point->lon() <= $this->max->lon() );
79            && $this->min->lon() <= $point->lon() && $point->lon() <= $this->max->lon() );
79            && $this->min->lon() <= $point->lon() && $point->lon() <= $this->max->lon() );
79            && $this->min->lon() <= $point->lon() && $point->lon() <= $this->max->lon() );
80    }
LatLonRange->max
50    public function max():LatLon { return $this->max; }
LatLonRange->min
43    public function min():LatLon { return $this->min; }
LatLonRange->position
92        if( $this->min->lat() > $this->max->lat() ) return $this->getNorthPosition();
92        if( $this->min->lat() > $this->max->lat() ) return $this->getNorthPosition();
95        if( $this->min->lat() == $this->max->lat() ) return $this->getCenterPosition();
95        if( $this->min->lat() == $this->max->lat() ) return $this->getCenterPosition();
98        if( $this->min->lat() < $this->max->lat() ) return $this->getSouthPosition();
98        if( $this->min->lat() < $this->max->lat() ) return $this->getSouthPosition();
99    }