Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 41 |
|
0.00% |
0 / 6 |
CRAP | |
0.00% |
0 / 1 |
MapUtils | |
0.00% |
0 / 41 |
|
0.00% |
0 / 6 |
42 | |
0.00% |
0 / 1 |
WGStoCHy | |
0.00% |
0 / 9 |
|
0.00% |
0 / 1 |
2 | |||
WGStoCHx | |
0.00% |
0 / 10 |
|
0.00% |
0 / 1 |
2 | |||
CHtoWGSlat | |
0.00% |
0 / 9 |
|
0.00% |
0 / 1 |
2 | |||
CHtoWGSlng | |
0.00% |
0 / 8 |
|
0.00% |
0 / 1 |
2 | |||
DECtoSEX | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
2 | |||
fromEnv | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 |
1 | <?php |
2 | |
3 | namespace Olz\Utils; |
4 | |
5 | // Source: http://www.swisstopo.admin.ch/internet/swisstopo/en/home/topics/survey/sys/refsys/projections.html (see PDFs under "Documentation") |
6 | // Updated 9 dec 2014 |
7 | // Please validate your results with NAVREF on-line service: http://www.swisstopo.admin.ch/internet/swisstopo/en/home/apps/calc/navref.html (difference ~ 1-2m) |
8 | |
9 | class MapUtils { |
10 | use WithUtilsTrait; |
11 | |
12 | // Convert WGS lat/long (° dec) to CH y |
13 | public function WGStoCHy(int|float $lat, int|float $long): int|float { |
14 | // Converts decimal degrees sexagesimal seconds |
15 | $lat = $this->DECtoSEX($lat); |
16 | $long = $this->DECtoSEX($long); |
17 | |
18 | // Auxiliary values (% Bern) |
19 | $lat_aux = ($lat - 169028.66) / 10000; |
20 | $long_aux = ($long - 26782.5) / 10000; |
21 | |
22 | // Process Y |
23 | return 600072.37 |
24 | + 211455.93 * $long_aux |
25 | - 10938.51 * $long_aux * $lat_aux |
26 | - 0.36 * $long_aux * pow($lat_aux, 2) |
27 | - 44.54 * pow($long_aux, 3); |
28 | } |
29 | |
30 | // Convert WGS lat/long (° dec) to CH x |
31 | public function WGStoCHx(int|float $lat, int|float $long): int|float { |
32 | // Converts decimal degrees sexagesimal seconds |
33 | $lat = $this->DECtoSEX($lat); |
34 | $long = $this->DECtoSEX($long); |
35 | |
36 | // Auxiliary values (% Bern) |
37 | $lat_aux = ($lat - 169028.66) / 10000; |
38 | $long_aux = ($long - 26782.5) / 10000; |
39 | |
40 | // Process X |
41 | return 200147.07 |
42 | + 308807.95 * $lat_aux |
43 | + 3745.25 * pow($long_aux, 2) |
44 | + 76.63 * pow($lat_aux, 2) |
45 | - 194.56 * pow($long_aux, 2) * $lat_aux |
46 | + 119.79 * pow($lat_aux, 3); |
47 | } |
48 | |
49 | // Convert CH y/x to WGS lat |
50 | public function CHtoWGSlat(int|float $y, int|float $x): int|float { |
51 | // Converts military to civil and to unit = 1000km |
52 | // Auxiliary values (% Bern) |
53 | $y_aux = ($y - 600000) / 1000000; |
54 | $x_aux = ($x - 200000) / 1000000; |
55 | |
56 | // Process lat |
57 | $lat = 16.9023892 |
58 | + 3.238272 * $x_aux |
59 | - 0.270978 * pow($y_aux, 2) |
60 | - 0.002528 * pow($x_aux, 2) |
61 | - 0.0447 * pow($y_aux, 2) * $x_aux |
62 | - 0.0140 * pow($x_aux, 3); |
63 | |
64 | // Unit 10000" to 1 " and converts seconds to degrees (dec) |
65 | return $lat * 100 / 36; |
66 | } |
67 | |
68 | // Convert CH y/x to WGS long |
69 | public function CHtoWGSlng(int|float $y, int|float $x): int|float { |
70 | // Converts military to civil and to unit = 1000km |
71 | // Auxiliary values (% Bern) |
72 | $y_aux = ($y - 600000) / 1000000; |
73 | $x_aux = ($x - 200000) / 1000000; |
74 | |
75 | // Process long |
76 | $long = 2.6779094 |
77 | + 4.728982 * $y_aux |
78 | + 0.791484 * $y_aux * $x_aux |
79 | + 0.1306 * $y_aux * pow($x_aux, 2) |
80 | - 0.0436 * pow($y_aux, 3); |
81 | |
82 | // Unit 10000" to 1 " and converts seconds to degrees (dec) |
83 | return $long * 100 / 36; |
84 | } |
85 | |
86 | // Convert DEC angle to SEX DMS |
87 | protected function DECtoSEX(int|float $angle): int|float { |
88 | // Extract DMS |
89 | $deg = intval($angle); |
90 | $min = intval(($angle - $deg) * 60); |
91 | $sec = ((($angle - $deg) * 60) - $min) * 60; |
92 | |
93 | // Result in sexagesimal seconds |
94 | return $sec + $min * 60 + $deg * 3600; |
95 | } |
96 | |
97 | public static function fromEnv(): self { |
98 | return new self(); |
99 | } |
100 | } |