This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /** |
||
3 | * This class is part of FlightAirmap. It's used for all common functions |
||
4 | * |
||
5 | * Copyright (c) Ycarus (Yannick Chabanois) <[email protected]> |
||
6 | * Licensed under AGPL license. |
||
7 | * For more information see: https://www.flightairmap.com/ |
||
8 | */ |
||
9 | require_once(dirname(__FILE__).'/libs/simple_html_dom.php'); |
||
10 | require_once(dirname(__FILE__).'/libs/uagent/uagent.php'); |
||
11 | require_once(dirname(__FILE__).'/settings.php'); |
||
12 | |||
13 | class Common { |
||
14 | //protected $cookies = array(); |
||
15 | |||
16 | /** |
||
17 | * Get data from form result |
||
18 | * @param String $url form URL |
||
19 | * @param String $type type of submit form method (get or post) |
||
20 | * @param String|array $data values form post method |
||
21 | * @param array $headers header to submit with the form |
||
22 | * @return String the result |
||
23 | */ |
||
24 | public function getData($url, $type = 'get', $data = '', $headers = '',$cookie = '',$referer = '',$timeout = '',$useragent = '', $sizelimit = false, $async = false, $getheaders = false) { |
||
25 | global $globalProxy, $globalForceIPv4; |
||
26 | $ch = curl_init(); |
||
27 | curl_setopt($ch, CURLOPT_URL, $url); |
||
28 | if (isset($globalForceIPv4) && $globalForceIPv4) { |
||
29 | if (defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')){ |
||
30 | curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); |
||
31 | } |
||
32 | } |
||
33 | if (isset($globalProxy) && $globalProxy != '') { |
||
34 | curl_setopt($ch, CURLOPT_PROXY, $globalProxy); |
||
35 | } |
||
36 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
||
37 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); |
||
38 | curl_setopt($ch, CURLINFO_HEADER_OUT, true); |
||
39 | if ($getheaders) curl_setopt($ch, CURLOPT_HEADER, 1); |
||
40 | curl_setopt($ch,CURLOPT_ENCODING , "gzip"); |
||
41 | //curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5'); |
||
42 | // curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0'); |
||
43 | if ($useragent == '') { |
||
44 | curl_setopt($ch, CURLOPT_USERAGENT, UAgent::random()); |
||
45 | } else { |
||
46 | curl_setopt($ch, CURLOPT_USERAGENT, $useragent); |
||
47 | } |
||
48 | if ($timeout == '') curl_setopt($ch, CURLOPT_TIMEOUT, 10); |
||
49 | else curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); |
||
50 | //curl_setopt($ch, CURLOPT_HEADERFUNCTION, array('Common',"curlResponseHeaderCallback")); |
||
51 | if ($type == 'post') { |
||
52 | curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); |
||
53 | if (is_array($data)) { |
||
54 | curl_setopt($ch, CURLOPT_POST, count($data)); |
||
55 | $data_string = ''; |
||
56 | foreach($data as $key=>$value) { $data_string .= $key.'='.$value.'&'; } |
||
57 | rtrim($data_string, '&'); |
||
58 | curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); |
||
59 | } else { |
||
60 | curl_setopt($ch, CURLOPT_POSTFIELDS, $data); |
||
61 | } |
||
62 | } elseif ($type != 'get' && $type != '') curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $type); |
||
63 | if ($headers != '') { |
||
64 | curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); |
||
65 | } |
||
66 | if ($cookie != '') { |
||
67 | if (is_array($cookie)) { |
||
68 | curl_setopt($ch, CURLOPT_COOKIE, implode($cookie,';')); |
||
69 | } else { |
||
70 | curl_setopt($ch, CURLOPT_COOKIE, $cookie); |
||
71 | } |
||
72 | } |
||
73 | if ($referer != '') { |
||
74 | curl_setopt($ch, CURLOPT_REFERER, $referer); |
||
75 | } |
||
76 | if ($sizelimit === true) { |
||
77 | curl_setopt($ch, CURLOPT_BUFFERSIZE, 128); |
||
78 | curl_setopt($ch, CURLOPT_NOPROGRESS, false); |
||
79 | curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function($curlr,$downloadsize, $downloaded, $uploadsize, $uploaded){ |
||
0 ignored issues
–
show
|
|||
80 | return ($downloaded > (3*1024)) ? 1 : 0; |
||
81 | }); |
||
82 | } |
||
83 | if ($async) { |
||
84 | curl_setopt($ch, CURLOPT_NOSIGNAL, 1); //to timeout immediately if the value is < 1000 ms |
||
85 | curl_setopt($ch, CURLOPT_TIMEOUT_MS, 50); |
||
86 | } |
||
87 | $result = curl_exec($ch); |
||
88 | $info = curl_getinfo($ch); |
||
89 | //var_dump($info); |
||
90 | curl_close($ch); |
||
91 | if ($info['http_code'] == '503' && strstr($result,'DDoS protection by CloudFlare')) { |
||
92 | echo "Cloudflare Detected\n"; |
||
93 | require_once(dirname(__FILE__).'/libs/cloudflare-bypass/libraries/cloudflareClass.php'); |
||
94 | $useragent = UAgent::random(); |
||
95 | cloudflare::useUserAgent($useragent); |
||
96 | if ($clearanceCookie = cloudflare::bypass($url)) { |
||
97 | return $this->getData($url,'get',$data,$headers,$clearanceCookie,$referer,$timeout,$useragent); |
||
98 | } |
||
99 | } else { |
||
100 | return $result; |
||
101 | } |
||
102 | } |
||
103 | |||
104 | private function curlResponseHeaderCallback($ch, $headerLine) { |
||
0 ignored issues
–
show
|
|||
105 | global $curl_cookies; |
||
106 | $curl_cookies = array(); |
||
107 | if (preg_match('/^Set-Cookie:\s*([^;]*)/mi', $headerLine, $cookie) == 1) |
||
108 | $curl_cookies[] = $cookie; |
||
109 | return strlen($headerLine); // Needed by curl |
||
110 | } |
||
111 | |||
112 | |||
113 | public static function download($url, $file, $referer = '', $headers = '') { |
||
114 | global $globalDebug, $globalProxy, $globalForceIPv4; |
||
115 | $fp = fopen($file, 'w'); |
||
116 | $ch = curl_init(); |
||
117 | curl_setopt($ch, CURLOPT_URL, $url); |
||
118 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
||
119 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); |
||
120 | curl_setopt($ch, CURLOPT_COOKIEFILE, ''); |
||
121 | if ($referer != '') curl_setopt($ch, CURLOPT_REFERER, $referer); |
||
122 | if (isset($globalForceIPv4) && $globalForceIPv4) { |
||
123 | if (defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')){ |
||
124 | curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); |
||
125 | } |
||
126 | } |
||
127 | if ($headers != '') { |
||
128 | curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); |
||
129 | } |
||
130 | if (isset($globalProxy) && $globalProxy != '') { |
||
131 | curl_setopt($ch, CURLOPT_PROXY, $globalProxy); |
||
132 | } |
||
133 | curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5'); |
||
134 | curl_setopt($ch, CURLOPT_FILE, $fp); |
||
135 | curl_exec($ch); |
||
136 | if (curl_errno($ch) && $globalDebug) echo 'Download error: '.curl_error($ch); |
||
137 | curl_close($ch); |
||
138 | fclose($fp); |
||
139 | } |
||
140 | |||
141 | public static function gunzip($in_file,$out_file_name = '') { |
||
142 | //echo $in_file.' -> '.$out_file_name."\n"; |
||
143 | $buffer_size = 4096; // read 4kb at a time |
||
144 | if ($out_file_name == '') $out_file_name = str_replace('.gz', '', $in_file); |
||
145 | if ($in_file != '' && file_exists($in_file)) { |
||
146 | // PHP version of Ubuntu use gzopen64 instead of gzopen |
||
147 | if (function_exists('gzopen')) $file = gzopen($in_file,'rb'); |
||
148 | elseif (function_exists('gzopen64')) $file = gzopen64($in_file,'rb'); |
||
149 | else { |
||
150 | echo 'gzopen not available'; |
||
151 | die; |
||
152 | } |
||
153 | $out_file = fopen($out_file_name, 'wb'); |
||
154 | while(!gzeof($file)) { |
||
155 | fwrite($out_file, gzread($file, $buffer_size)); |
||
156 | } |
||
157 | fclose($out_file); |
||
158 | gzclose($file); |
||
159 | } |
||
160 | } |
||
161 | |||
162 | public static function bunzip2($in_file,$out_file_name = '') { |
||
163 | //echo $in_file.' -> '.$out_file_name."\n"; |
||
164 | $buffer_size = 4096; // read 4kb at a time |
||
165 | if ($out_file_name == '') $out_file_name = str_replace('.bz2', '', $in_file); |
||
166 | if ($in_file != '' && file_exists($in_file)) { |
||
167 | // PHP version of Ubuntu use gzopen64 instead of gzopen |
||
168 | if (function_exists('bzopen')) $file = bzopen($in_file,'rb'); |
||
169 | else { |
||
170 | echo 'bzopen not available'; |
||
171 | die; |
||
172 | } |
||
173 | $out_file = fopen($out_file_name, 'wb'); |
||
174 | while(!feof($file)) { |
||
175 | fwrite($out_file, bzread($file, $buffer_size)); |
||
176 | } |
||
177 | fclose($out_file); |
||
178 | bzclose($file); |
||
179 | } |
||
180 | } |
||
181 | |||
182 | /** |
||
183 | * Convert a HTML table to an array |
||
184 | * @param String $data HTML page |
||
185 | * @return array array of the tables in HTML page |
||
186 | */ |
||
187 | public function table2array($data) { |
||
188 | if (!is_string($data)) return array(); |
||
189 | if ($data == '') return array(); |
||
190 | $html = str_get_html($data); |
||
191 | if ($html === false) return array(); |
||
192 | $tabledata=array(); |
||
193 | foreach($html->find('tr') as $element) |
||
194 | { |
||
195 | $td = array(); |
||
196 | foreach( $element->find('th') as $row) |
||
197 | { |
||
198 | $td [] = trim($row->plaintext); |
||
199 | } |
||
200 | $td=array_filter($td); |
||
201 | $tabledata[] = $td; |
||
202 | |||
203 | $td = array(); |
||
204 | $tdi = array(); |
||
205 | foreach( $element->find('td') as $row) |
||
206 | { |
||
207 | $td [] = trim($row->plaintext); |
||
208 | $tdi [] = trim($row->innertext); |
||
209 | } |
||
210 | $td=array_filter($td); |
||
211 | $tdi=array_filter($tdi); |
||
212 | $tabledata[]=array_merge($td,$tdi); |
||
213 | } |
||
214 | $html->clear(); |
||
215 | unset($html); |
||
216 | return(array_filter($tabledata)); |
||
217 | } |
||
218 | |||
219 | /** |
||
220 | * Convert <p> part of a HTML page to an array |
||
221 | * @param String $data HTML page |
||
222 | * @return array array of the <p> in HTML page |
||
223 | */ |
||
224 | public function text2array($data) { |
||
225 | $html = str_get_html($data); |
||
226 | if ($html === false) return array(); |
||
227 | $tabledata=array(); |
||
228 | foreach($html->find('p') as $element) |
||
229 | { |
||
230 | $tabledata [] = trim($element->plaintext); |
||
231 | } |
||
232 | $html->clear(); |
||
233 | unset($html); |
||
234 | return(array_filter($tabledata)); |
||
235 | } |
||
236 | |||
237 | /** |
||
238 | * Give distance between 2 coordonnates |
||
239 | * @param Float $lat latitude of first point |
||
240 | * @param Float $lon longitude of first point |
||
241 | * @param Float $latc latitude of second point |
||
242 | * @param Float $lonc longitude of second point |
||
243 | * @param String $unit km else no unit used |
||
244 | * @return Float Distance in $unit |
||
245 | */ |
||
246 | public function distance($lat, $lon, $latc, $lonc, $unit = 'km') { |
||
247 | if ($lat == $latc && $lon == $lonc) return 0; |
||
248 | $dist = rad2deg(acos(sin(deg2rad(floatval($lat)))*sin(deg2rad(floatval($latc)))+ cos(deg2rad(floatval($lat)))*cos(deg2rad(floatval($latc)))*cos(deg2rad(floatval($lon)-floatval($lonc)))))*60*1.1515; |
||
249 | if ($unit == "km") { |
||
250 | return round($dist * 1.609344); |
||
251 | } elseif ($unit == "m") { |
||
252 | return round($dist * 1.609344 * 1000); |
||
253 | } elseif ($unit == "mile" || $unit == "mi") { |
||
254 | return round($dist); |
||
255 | } elseif ($unit == "nm") { |
||
256 | return round($dist*0.868976); |
||
257 | } else { |
||
258 | return round($dist); |
||
259 | } |
||
260 | } |
||
261 | |||
262 | /** |
||
263 | * Give plunge between 2 altitudes and distance |
||
264 | * @param Float $initial_altitude altitude of first point in m |
||
265 | * @param Float $final_altitude altitude of second point in m |
||
266 | * @param String $distance distance between two points in m |
||
267 | * @return Float plunge |
||
268 | */ |
||
269 | public function plunge($initial_altitude,$final_altitude,$distance) { |
||
270 | $plunge = rad2deg(asin(($final_altitude-$initial_altitude)/$distance)); |
||
271 | /* |
||
272 | $siter = 6378137.0 + $initial_altitude; |
||
273 | $planer = 6378137.0 + $final_altitude; |
||
274 | $airdist = sqrt($siter-$siter + $planer*$planer - 2*$siter*$planer*cos($distance/6378137.0)); |
||
275 | echo 'airdist:'.$airdist; |
||
276 | $plunge = rad2deg(asin(($planer*$planer - $siter*$siter - $airdist*$airdist)/(2*$siter+$distance))); |
||
277 | */ |
||
278 | return $plunge; |
||
279 | } |
||
280 | |||
281 | /** |
||
282 | * Give azimuth between 2 coordonnates |
||
283 | * @param Float $lat latitude of first point |
||
284 | * @param Float $lon longitude of first point |
||
285 | * @param Float $latc latitude of second point |
||
286 | * @param Float $lonc longitude of second point |
||
287 | * @return Float Azimuth |
||
288 | */ |
||
289 | public function azimuth($lat, $lon, $latc, $lonc) { |
||
290 | $dX = $latc - $lat; |
||
291 | $dY = $lonc - $lon; |
||
292 | $azimuth = rad2deg(atan2($dY,$dX)); |
||
293 | if ($azimuth < 0) return $azimuth+360; |
||
294 | return $azimuth; |
||
295 | } |
||
296 | |||
297 | |||
298 | /** |
||
299 | * Check is distance realistic |
||
300 | * @param int $timeDifference the time between the reception of both messages |
||
301 | * @param float $distance distance covered |
||
302 | * @return bool whether distance is realistic |
||
303 | */ |
||
304 | public function withinThreshold ($timeDifference, $distance) { |
||
305 | $x = abs($timeDifference); |
||
306 | $d = abs($distance); |
||
307 | if ($x == 0 || $d == 0) return true; |
||
308 | // may be due to Internet jitter; distance is realistic |
||
309 | if ($x < 0.7 && $d < 2000) return true; |
||
310 | else return $d/$x < 1500*0.27778; // 1500 km/h max |
||
311 | } |
||
312 | |||
313 | |||
314 | // Check if an array is assoc |
||
315 | public function isAssoc($array) |
||
316 | { |
||
317 | return ($array !== array_values($array)); |
||
318 | } |
||
319 | |||
320 | public function isInteger($input){ |
||
321 | //return(ctype_digit(strval($input))); |
||
322 | return preg_match('/^-?[0-9]+$/', (string)$input) ? true : false; |
||
323 | } |
||
324 | |||
325 | |||
326 | public function convertDec($dms,$latlong) { |
||
327 | if ($latlong == 'latitude') { |
||
328 | $deg = substr($dms, 0, 2); |
||
329 | $min = substr($dms, 2, 4); |
||
330 | } else { |
||
331 | $deg = substr($dms, 0, 3); |
||
332 | $min = substr($dms, 3, 5); |
||
333 | } |
||
334 | return $deg+(($min*60)/3600); |
||
335 | } |
||
336 | |||
337 | public function convertDecLatLong($coord) { |
||
338 | //N43°36.763' W5°46.845' |
||
339 | $coords = explode(' ',$coord); |
||
340 | $latitude = ''; |
||
341 | $longitude = ''; |
||
342 | foreach ($coords as $latlong) { |
||
343 | $type = substr($latlong,0,1); |
||
344 | $degmin = explode('°',substr($latlong,1,-1)); |
||
345 | $deg = $degmin[0]; |
||
346 | $min = $degmin[1]; |
||
347 | if ($type == 'N') { |
||
348 | $latitude = $deg+(($min*60)/3600); |
||
349 | } elseif ($type == 'S') { |
||
350 | $latitude = -($deg+(($min*60)/3600)); |
||
351 | } elseif ($type == 'E') { |
||
352 | $longitude = ($deg+(($min*60)/3600)); |
||
353 | } elseif ($type == 'W') { |
||
354 | $longitude = -($deg+(($min*60)/3600)); |
||
355 | } |
||
356 | } |
||
357 | return array('latitude' => round($latitude,5),'longitude' => round($longitude,5)); |
||
358 | } |
||
359 | |||
360 | public function convertDM($coord,$latlong) { |
||
361 | if ($latlong == 'latitude') { |
||
362 | if ($coord < 0) $NSEW = 'S'; |
||
363 | else $NSEW = 'N'; |
||
364 | } else { |
||
365 | if ($coord < 0) $NSEW = 'W'; |
||
366 | else $NSEW = 'E'; |
||
367 | } |
||
368 | $coord = abs($coord); |
||
369 | $deg = floor($coord); |
||
370 | $coord = ($coord-$deg)*60; |
||
371 | $min = $coord; |
||
372 | return array('deg' => $deg,'min' => $min,'NSEW' => $NSEW); |
||
373 | } |
||
374 | public function convertDMS($coord,$latlong) { |
||
375 | if ($latlong == 'latitude') { |
||
376 | if ($coord < 0) $NSEW = 'S'; |
||
377 | else $NSEW = 'N'; |
||
378 | } else { |
||
379 | if ($coord < 0) $NSEW = 'W'; |
||
380 | else $NSEW = 'E'; |
||
381 | } |
||
382 | $coord = abs($coord); |
||
383 | $deg = floor($coord); |
||
384 | $coord = ($coord-$deg)*60; |
||
385 | $min = floor($coord); |
||
386 | $sec = round(($coord-$min)*60); |
||
387 | return array('deg' => $deg,'min' => $min,'sec' => $sec,'NSEW' => $NSEW); |
||
388 | } |
||
389 | |||
390 | /** |
||
391 | * Copy folder contents |
||
392 | * @param string $source Source path |
||
393 | * @param string $dest Destination path |
||
394 | * @return bool Returns true on success, false on failure |
||
395 | */ |
||
396 | public function xcopy($source, $dest) |
||
397 | { |
||
398 | $files = glob($source.'*.*'); |
||
399 | foreach($files as $file){ |
||
400 | $file_to_go = str_replace($source,$dest,$file); |
||
401 | copy($file, $file_to_go); |
||
402 | } |
||
403 | return true; |
||
404 | } |
||
405 | |||
406 | /** |
||
407 | * Check if an url exist |
||
408 | * @param String $url url to check |
||
409 | * @return bool Return true on succes false on failure |
||
410 | */ |
||
411 | public function urlexist($url){ |
||
412 | $headers=get_headers($url); |
||
413 | return stripos($headers[0],"200 OK")?true:false; |
||
414 | } |
||
415 | |||
416 | /** |
||
417 | * Convert hexa to string |
||
418 | * @param String $hex data in hexa |
||
419 | * @return String Return result |
||
420 | */ |
||
421 | public function hex2str($hex) { |
||
422 | $str = ''; |
||
423 | $hexln = strlen($hex); |
||
424 | for($i=0;$i<$hexln;$i+=2) $str .= chr(hexdec(substr($hex,$i,2))); |
||
425 | return $str; |
||
426 | } |
||
427 | |||
428 | /** |
||
429 | * Convert hexa color to rgb |
||
430 | * @param String $hex data in hexa |
||
431 | * @return String Return result |
||
432 | */ |
||
433 | public function hex2rgb($hex) { |
||
434 | $hex = str_replace('#','',$hex); |
||
435 | return sscanf($hex, "%02x%02x%02x"); |
||
436 | } |
||
437 | |||
438 | public function getHeading($lat1, $lon1, $lat2, $lon2) { |
||
439 | //difference in longitudinal coordinates |
||
440 | $dLon = deg2rad($lon2) - deg2rad($lon1); |
||
441 | //difference in the phi of latitudinal coordinates |
||
442 | $dPhi = log(tan(deg2rad($lat2) / 2 + M_PI / 4) / tan(deg2rad($lat1) / 2 + M_PI / 4)); |
||
443 | //we need to recalculate $dLon if it is greater than pi |
||
444 | if(abs($dLon) > M_PI) { |
||
445 | if($dLon > 0) { |
||
446 | $dLon = (2 * M_PI - $dLon) * -1; |
||
447 | } else { |
||
448 | $dLon = 2 * M_PI + $dLon; |
||
449 | } |
||
450 | } |
||
451 | //return the angle, normalized |
||
452 | return (rad2deg(atan2($dLon, $dPhi)) + 360) % 360; |
||
453 | } |
||
454 | |||
455 | public function checkLine($lat1,$lon1,$lat2,$lon2,$lat3,$lon3,$approx = 0.15) { |
||
456 | //$a = ($lon2-$lon1)*$lat3+($lat2-$lat1)*$lon3+($lat1*$lon2+$lat2*$lon1); |
||
457 | $a = -($lon2-$lon1); |
||
458 | $b = $lat2 - $lat1; |
||
459 | $c = -($a*$lat1+$b*$lon1); |
||
460 | $d = $a*$lat3+$b*$lon3+$c; |
||
461 | if ($d > -$approx && $d < $approx) return true; |
||
462 | else return false; |
||
463 | } |
||
464 | |||
465 | public function array_merge_noappend() { |
||
466 | $output = array(); |
||
467 | foreach(func_get_args() as $array) { |
||
468 | foreach($array as $key => $value) { |
||
469 | $output[$key] = isset($output[$key]) ? |
||
470 | array_merge($output[$key], $value) : $value; |
||
471 | } |
||
472 | } |
||
473 | return $output; |
||
474 | } |
||
475 | |||
476 | |||
477 | public function arr_diff($arraya, $arrayb) { |
||
478 | foreach ($arraya as $keya => $valuea) { |
||
479 | if (in_array($valuea, $arrayb)) { |
||
480 | unset($arraya[$keya]); |
||
481 | } |
||
482 | } |
||
483 | return $arraya; |
||
484 | } |
||
485 | |||
486 | /* |
||
487 | * Check if a key exist in an array |
||
488 | * Come from http://stackoverflow.com/a/19420866 |
||
489 | * @param Array array to check |
||
490 | * @param String key to check |
||
491 | * @return Bool true if exist, else false |
||
492 | */ |
||
493 | public function multiKeyExists(array $arr, $key) { |
||
494 | // is in base array? |
||
495 | if (array_key_exists($key, $arr)) { |
||
496 | return true; |
||
497 | } |
||
498 | // check arrays contained in this array |
||
499 | foreach ($arr as $element) { |
||
500 | if (is_array($element)) { |
||
501 | if ($this->multiKeyExists($element, $key)) { |
||
502 | return true; |
||
503 | } |
||
504 | } |
||
505 | } |
||
506 | return false; |
||
507 | } |
||
508 | |||
509 | /** |
||
510 | * Returns list of available locales |
||
511 | * |
||
512 | * @return array |
||
513 | */ |
||
514 | public function listLocaleDir() |
||
515 | { |
||
516 | $result = array('en'); |
||
517 | if (!is_dir('./locale')) { |
||
518 | return $result; |
||
519 | } |
||
520 | $handle = @opendir('./locale'); |
||
521 | if ($handle === false) return $result; |
||
522 | while (false !== ($file = readdir($handle))) { |
||
523 | $path = './locale'.'/'.$file.'/LC_MESSAGES/fam.mo'; |
||
524 | if ($file != "." && $file != ".." && @file_exists($path)) { |
||
525 | $result[] = $file; |
||
526 | } |
||
527 | } |
||
528 | closedir($handle); |
||
529 | return $result; |
||
530 | } |
||
531 | |||
532 | public function nextcoord($latitude, $longitude, $speed, $heading, $archivespeed = 1, $seconds = ''){ |
||
533 | global $globalMapRefresh; |
||
534 | if ($seconds == '') { |
||
535 | $distance = ($speed*0.514444*$globalMapRefresh*$archivespeed)/1000; |
||
536 | } else { |
||
537 | $distance = ($speed*0.514444*$seconds*$archivespeed)/1000; |
||
538 | } |
||
539 | $r = 6378; |
||
540 | $latitude = deg2rad($latitude); |
||
541 | $longitude = deg2rad($longitude); |
||
542 | $bearing = deg2rad($heading); |
||
543 | $latitude2 = asin( (sin($latitude) * cos($distance/$r)) + (cos($latitude) * sin($distance/$r) * cos($bearing)) ); |
||
544 | $longitude2 = $longitude + atan2( sin($bearing)*sin($distance/$r)*cos($latitude), cos($distance/$r)-(sin($latitude)*sin($latitude2)) ); |
||
545 | return array('latitude' => number_format(rad2deg($latitude2),5,'.',''),'longitude' => number_format(rad2deg($longitude2),5,'.','')); |
||
546 | } |
||
547 | |||
548 | public function getCoordfromDistanceBearing($latitude,$longitude,$bearing,$distance) { |
||
549 | // distance in meter |
||
550 | $R = 6378.14; |
||
551 | $latitude1 = $latitude * (M_PI/180); |
||
552 | $longitude1 = $longitude * (M_PI/180); |
||
553 | $brng = $bearing * (M_PI/180); |
||
554 | $d = $distance; |
||
555 | |||
556 | $latitude2 = asin(sin($latitude1)*cos($d/$R) + cos($latitude1)*sin($d/$R)*cos($brng)); |
||
557 | $longitude2 = $longitude1 + atan2(sin($brng)*sin($d/$R)*cos($latitude1),cos($d/$R)-sin($latitude1)*sin($latitude2)); |
||
558 | |||
559 | $latitude2 = $latitude2 * (180/M_PI); |
||
560 | $longitude2 = $longitude2 * (180/M_PI); |
||
561 | |||
562 | $flat = round ($latitude2,6); |
||
563 | $flong = round ($longitude2,6); |
||
564 | /* |
||
565 | $dx = $distance*cos($bearing); |
||
566 | $dy = $distance*sin($bearing); |
||
567 | $dlong = $dx/(111320*cos($latitude)); |
||
568 | $dlat = $dy/110540; |
||
569 | $flong = $longitude + $dlong; |
||
570 | $flat = $latitude + $dlat; |
||
571 | */ |
||
572 | return array('latitude' => $flat,'longitude' => $flong); |
||
573 | } |
||
574 | |||
575 | /** |
||
576 | * GZIPs a file on disk (appending .gz to the name) |
||
577 | * |
||
578 | * From http://stackoverflow.com/questions/6073397/how-do-you-create-a-gz-file-using-php |
||
579 | * Based on function by Kioob at: |
||
580 | * http://www.php.net/manual/en/function.gzwrite.php#34955 |
||
581 | * |
||
582 | * @param string $source Path to file that should be compressed |
||
583 | * @param integer $level GZIP compression level (default: 9) |
||
584 | * @return string New filename (with .gz appended) if success, or false if operation fails |
||
585 | */ |
||
586 | public function gzCompressFile($source, $level = 9){ |
||
587 | $dest = $source . '.gz'; |
||
588 | $mode = 'wb' . $level; |
||
589 | $error = false; |
||
590 | if ($fp_out = gzopen($dest, $mode)) { |
||
591 | if ($fp_in = fopen($source,'rb')) { |
||
592 | while (!feof($fp_in)) |
||
593 | gzwrite($fp_out, fread($fp_in, 1024 * 512)); |
||
594 | fclose($fp_in); |
||
595 | } else { |
||
596 | $error = true; |
||
597 | } |
||
598 | gzclose($fp_out); |
||
599 | } else { |
||
600 | $error = true; |
||
601 | } |
||
602 | if ($error) |
||
603 | return false; |
||
604 | else |
||
605 | return $dest; |
||
606 | } |
||
607 | |||
608 | public function remove_accents($string) { |
||
609 | if ( !preg_match('/[\x80-\xff]/', $string) ) return $string; |
||
610 | $chars = array( |
||
611 | // Decompositions for Latin-1 Supplement |
||
612 | chr(195).chr(128) => 'A', chr(195).chr(129) => 'A', |
||
613 | chr(195).chr(130) => 'A', chr(195).chr(131) => 'A', |
||
614 | chr(195).chr(132) => 'A', chr(195).chr(133) => 'A', |
||
615 | chr(195).chr(135) => 'C', chr(195).chr(136) => 'E', |
||
616 | chr(195).chr(137) => 'E', chr(195).chr(138) => 'E', |
||
617 | chr(195).chr(139) => 'E', chr(195).chr(140) => 'I', |
||
618 | chr(195).chr(141) => 'I', chr(195).chr(142) => 'I', |
||
619 | chr(195).chr(143) => 'I', chr(195).chr(145) => 'N', |
||
620 | chr(195).chr(146) => 'O', chr(195).chr(147) => 'O', |
||
621 | chr(195).chr(148) => 'O', chr(195).chr(149) => 'O', |
||
622 | chr(195).chr(150) => 'O', chr(195).chr(153) => 'U', |
||
623 | chr(195).chr(154) => 'U', chr(195).chr(155) => 'U', |
||
624 | chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y', |
||
625 | chr(195).chr(159) => 's', chr(195).chr(160) => 'a', |
||
626 | chr(195).chr(161) => 'a', chr(195).chr(162) => 'a', |
||
627 | chr(195).chr(163) => 'a', chr(195).chr(164) => 'a', |
||
628 | chr(195).chr(165) => 'a', chr(195).chr(167) => 'c', |
||
629 | chr(195).chr(168) => 'e', chr(195).chr(169) => 'e', |
||
630 | chr(195).chr(170) => 'e', chr(195).chr(171) => 'e', |
||
631 | chr(195).chr(172) => 'i', chr(195).chr(173) => 'i', |
||
632 | chr(195).chr(174) => 'i', chr(195).chr(175) => 'i', |
||
633 | chr(195).chr(177) => 'n', chr(195).chr(178) => 'o', |
||
634 | chr(195).chr(179) => 'o', chr(195).chr(180) => 'o', |
||
635 | chr(195).chr(181) => 'o', chr(195).chr(182) => 'o', |
||
636 | chr(195).chr(182) => 'o', chr(195).chr(185) => 'u', |
||
637 | chr(195).chr(186) => 'u', chr(195).chr(187) => 'u', |
||
638 | chr(195).chr(188) => 'u', chr(195).chr(189) => 'y', |
||
639 | chr(195).chr(191) => 'y', |
||
640 | // Decompositions for Latin Extended-A |
||
641 | chr(196).chr(128) => 'A', chr(196).chr(129) => 'a', |
||
642 | chr(196).chr(130) => 'A', chr(196).chr(131) => 'a', |
||
643 | chr(196).chr(132) => 'A', chr(196).chr(133) => 'a', |
||
644 | chr(196).chr(134) => 'C', chr(196).chr(135) => 'c', |
||
645 | chr(196).chr(136) => 'C', chr(196).chr(137) => 'c', |
||
646 | chr(196).chr(138) => 'C', chr(196).chr(139) => 'c', |
||
647 | chr(196).chr(140) => 'C', chr(196).chr(141) => 'c', |
||
648 | chr(196).chr(142) => 'D', chr(196).chr(143) => 'd', |
||
649 | chr(196).chr(144) => 'D', chr(196).chr(145) => 'd', |
||
650 | chr(196).chr(146) => 'E', chr(196).chr(147) => 'e', |
||
651 | chr(196).chr(148) => 'E', chr(196).chr(149) => 'e', |
||
652 | chr(196).chr(150) => 'E', chr(196).chr(151) => 'e', |
||
653 | chr(196).chr(152) => 'E', chr(196).chr(153) => 'e', |
||
654 | chr(196).chr(154) => 'E', chr(196).chr(155) => 'e', |
||
655 | chr(196).chr(156) => 'G', chr(196).chr(157) => 'g', |
||
656 | chr(196).chr(158) => 'G', chr(196).chr(159) => 'g', |
||
657 | chr(196).chr(160) => 'G', chr(196).chr(161) => 'g', |
||
658 | chr(196).chr(162) => 'G', chr(196).chr(163) => 'g', |
||
659 | chr(196).chr(164) => 'H', chr(196).chr(165) => 'h', |
||
660 | chr(196).chr(166) => 'H', chr(196).chr(167) => 'h', |
||
661 | chr(196).chr(168) => 'I', chr(196).chr(169) => 'i', |
||
662 | chr(196).chr(170) => 'I', chr(196).chr(171) => 'i', |
||
663 | chr(196).chr(172) => 'I', chr(196).chr(173) => 'i', |
||
664 | chr(196).chr(174) => 'I', chr(196).chr(175) => 'i', |
||
665 | chr(196).chr(176) => 'I', chr(196).chr(177) => 'i', |
||
666 | chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij', |
||
667 | chr(196).chr(180) => 'J', chr(196).chr(181) => 'j', |
||
668 | chr(196).chr(182) => 'K', chr(196).chr(183) => 'k', |
||
669 | chr(196).chr(184) => 'k', chr(196).chr(185) => 'L', |
||
670 | chr(196).chr(186) => 'l', chr(196).chr(187) => 'L', |
||
671 | chr(196).chr(188) => 'l', chr(196).chr(189) => 'L', |
||
672 | chr(196).chr(190) => 'l', chr(196).chr(191) => 'L', |
||
673 | chr(197).chr(128) => 'l', chr(197).chr(129) => 'L', |
||
674 | chr(197).chr(130) => 'l', chr(197).chr(131) => 'N', |
||
675 | chr(197).chr(132) => 'n', chr(197).chr(133) => 'N', |
||
676 | chr(197).chr(134) => 'n', chr(197).chr(135) => 'N', |
||
677 | chr(197).chr(136) => 'n', chr(197).chr(137) => 'N', |
||
678 | chr(197).chr(138) => 'n', chr(197).chr(139) => 'N', |
||
679 | chr(197).chr(140) => 'O', chr(197).chr(141) => 'o', |
||
680 | chr(197).chr(142) => 'O', chr(197).chr(143) => 'o', |
||
681 | chr(197).chr(144) => 'O', chr(197).chr(145) => 'o', |
||
682 | chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe', |
||
683 | chr(197).chr(148) => 'R',chr(197).chr(149) => 'r', |
||
684 | chr(197).chr(150) => 'R',chr(197).chr(151) => 'r', |
||
685 | chr(197).chr(152) => 'R',chr(197).chr(153) => 'r', |
||
686 | chr(197).chr(154) => 'S',chr(197).chr(155) => 's', |
||
687 | chr(197).chr(156) => 'S',chr(197).chr(157) => 's', |
||
688 | chr(197).chr(158) => 'S',chr(197).chr(159) => 's', |
||
689 | chr(197).chr(160) => 'S', chr(197).chr(161) => 's', |
||
690 | chr(197).chr(162) => 'T', chr(197).chr(163) => 't', |
||
691 | chr(197).chr(164) => 'T', chr(197).chr(165) => 't', |
||
692 | chr(197).chr(166) => 'T', chr(197).chr(167) => 't', |
||
693 | chr(197).chr(168) => 'U', chr(197).chr(169) => 'u', |
||
694 | chr(197).chr(170) => 'U', chr(197).chr(171) => 'u', |
||
695 | chr(197).chr(172) => 'U', chr(197).chr(173) => 'u', |
||
696 | chr(197).chr(174) => 'U', chr(197).chr(175) => 'u', |
||
697 | chr(197).chr(176) => 'U', chr(197).chr(177) => 'u', |
||
698 | chr(197).chr(178) => 'U', chr(197).chr(179) => 'u', |
||
699 | chr(197).chr(180) => 'W', chr(197).chr(181) => 'w', |
||
700 | chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y', |
||
701 | chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z', |
||
702 | chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z', |
||
703 | chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z', |
||
704 | chr(197).chr(190) => 'z', chr(197).chr(191) => 's' |
||
705 | ); |
||
706 | $string = strtr($string, $chars); |
||
707 | return $string; |
||
708 | } |
||
709 | |||
710 | /* |
||
711 | * Extract int from a string |
||
712 | * Come from http://php.net/manual/fr/function.intval.php comment by michiel ed thalent nl |
||
713 | * |
||
714 | * @param String Input string |
||
715 | * @return Integer integer from the string |
||
716 | */ |
||
717 | public function str2int($string, $concat = false) { |
||
718 | $length = strlen($string); |
||
719 | for ($i = 0, $int = '', $concat_flag = true; $i < $length; $i++) { |
||
720 | if (is_numeric($string[$i]) && $concat_flag) { |
||
721 | $int .= $string[$i]; |
||
722 | } elseif(!$concat && $concat_flag && strlen($int) > 0) { |
||
723 | $concat_flag = false; |
||
724 | } |
||
725 | } |
||
726 | return (int) $int; |
||
727 | } |
||
728 | |||
729 | public function create_socket($host, $port, &$errno, &$errstr) { |
||
730 | $ip = gethostbyname($host); |
||
731 | $s = socket_create(AF_INET, SOCK_STREAM, 0); |
||
732 | $r = @socket_connect($s, $ip, $port); |
||
733 | if (!socket_set_nonblock($s)) echo "Unable to set nonblock on socket\n"; |
||
734 | if ($r || socket_last_error() == 114 || socket_last_error() == 115) { |
||
735 | return $s; |
||
736 | } |
||
737 | $errno = socket_last_error($s); |
||
738 | $errstr = socket_strerror($errno); |
||
739 | socket_close($s); |
||
740 | return false; |
||
741 | } |
||
742 | |||
743 | public function create_socket_udp($host, $port, &$errno, &$errstr) { |
||
744 | $ip = gethostbyname($host); |
||
745 | $s = socket_create(AF_INET, SOCK_DGRAM, 0); |
||
746 | $r = @socket_bind($s, $ip, $port); |
||
747 | if ($r || socket_last_error() == 114 || socket_last_error() == 115) { |
||
748 | return $s; |
||
749 | } |
||
750 | $errno = socket_last_error($s); |
||
751 | $errstr = socket_strerror($errno); |
||
752 | socket_close($s); |
||
753 | return false; |
||
754 | } |
||
755 | |||
756 | public function getUserIP() { |
||
757 | $client = @$_SERVER['HTTP_CLIENT_IP']; |
||
758 | $forward = @$_SERVER['HTTP_X_FORWARDED_FOR']; |
||
759 | return filter_var($client, FILTER_VALIDATE_IP) ? $client : filter_var($forward, FILTER_VALIDATE_IP) ? $forward : $_SERVER['REMOTE_ADDR']; |
||
760 | } |
||
761 | public function replace_mb_substr($string, $offset, $length) |
||
762 | { |
||
763 | if (!function_exists('mb_substr')) { |
||
764 | $arr = preg_split("//u", $string); |
||
765 | $slice = array_slice($arr, $offset + 1, $length); |
||
766 | return implode("", $slice); |
||
767 | } else { |
||
768 | return mb_substr($string,$offset,$length,'UTF-8'); |
||
769 | } |
||
770 | } |
||
771 | |||
772 | // Come from comment : http://php.net/manual/fr/function.is-writable.php#73596 |
||
773 | public function is__writable($path) { |
||
774 | //will work in despite of Windows ACLs bug |
||
775 | //NOTE: use a trailing slash for folders!!! |
||
776 | //see http://bugs.php.net/bug.php?id=27609 |
||
777 | //see http://bugs.php.net/bug.php?id=30931 |
||
778 | if ($path{strlen($path)-1}=='/') // recursively return a temporary file path |
||
779 | return $this->is__writable($path.uniqid(mt_rand()).'.tmp'); |
||
780 | else if (is_dir($path)) |
||
781 | return $this->is__writable($path.'/'.uniqid(mt_rand()).'.tmp'); |
||
782 | // check tmp file for read/write capabilities |
||
783 | $rm = file_exists($path); |
||
784 | $f = @fopen($path, 'a'); |
||
785 | if ($f===false) |
||
786 | return false; |
||
787 | fclose($f); |
||
788 | if (!$rm) |
||
789 | unlink($path); |
||
790 | return true; |
||
791 | } |
||
792 | |||
793 | /* |
||
794 | * Great circle route |
||
795 | * Translated to PHP from javascript version of https://github.com/springmeyer/arc.js |
||
796 | * @param Float $begin_lat Latitude of origin point |
||
797 | * @param Float $begin_lon Longitude of origin point |
||
798 | * @param Float $end_lat Latitude of final point |
||
799 | * @param Float $end_lon Longitude of final point |
||
800 | * @param Integer $nbpts Number of intermediate vertices desired |
||
801 | * @param Integer $offset Controls the likelyhood that lines will be split which cross the dateline |
||
802 | * @return Array Coordinate of the route |
||
803 | */ |
||
804 | public function greatcircle($begin_lat,$begin_lon,$end_lat,$end_lon,$nbpts = 20, $offset = 10) { |
||
805 | if ($nbpts <= 2) return array(array($begin_lon,$begin_lat),array($end_lon,$end_lat)); |
||
806 | $sx = deg2rad($begin_lon); |
||
807 | $sy = deg2rad($begin_lat); |
||
808 | $ex = deg2rad($end_lon); |
||
809 | $ey = deg2rad($end_lat); |
||
810 | $w = $sx - $ex; |
||
811 | $h = $sy - $ey; |
||
812 | $z = pow(sin($h/2.0),2) + cos($sy)*cos($ey)*pow(sin($w/2.0),2); |
||
813 | $g = 2.0*asin(sqrt($z)); |
||
814 | if ($g == M_PI || is_nan($g)) return array(array($begin_lon,$begin_lat),array($end_lon,$end_lat)); |
||
815 | $first_pass = array(); |
||
816 | $delta = 1.0/($nbpts-1); |
||
817 | for ($i =0; $i < $nbpts; ++$i) { |
||
818 | $step = $delta*$i; |
||
819 | $A = sin((1 - $step) * $g) / sin($g); |
||
820 | $B = sin($step * $g) / sin($g); |
||
821 | $x = $A * cos($sy) * cos($sx) + $B * cos($ey) * cos($ex); |
||
822 | $y = $A * cos($sy) * sin($sx) + $B * cos($ey) * sin($ex); |
||
823 | $z = $A * sin($sy) + $B * sin($ey); |
||
824 | $lat = rad2deg(atan2($z, sqrt(pow($x, 2) + pow($y, 2)))); |
||
825 | $lon = rad2deg(atan2($y, $x)); |
||
826 | $first_pass[] = array($lon,$lat); |
||
827 | } |
||
828 | $bHasBigDiff = false; |
||
829 | $dfMaxSmallDiffLong = 0; |
||
830 | // from http://www.gdal.org/ogr2ogr.html |
||
831 | // -datelineoffset: |
||
832 | // (starting with GDAL 1.10) offset from dateline in degrees (default long. = +/- 10deg, geometries within 170deg to -170deg will be splited) |
||
833 | $dfDateLineOffset = $offset; |
||
834 | $dfLeftBorderX = 180 - $dfDateLineOffset; |
||
835 | $dfRightBorderX = -180 + $dfDateLineOffset; |
||
836 | $dfDiffSpace = 360 - $dfDateLineOffset; |
||
837 | |||
838 | // https://github.com/OSGeo/gdal/blob/7bfb9c452a59aac958bff0c8386b891edf8154ca/gdal/ogr/ogrgeometryfactory.cpp#L2342 |
||
839 | $first_pass_ln = count($first_pass); |
||
840 | for ($j = 1; $j < $first_pass_ln; ++$j) { |
||
841 | $dfPrevX = $first_pass[$j-1][0]; |
||
842 | $dfX = $first_pass[$j][0]; |
||
843 | $dfDiffLong = abs($dfX - $dfPrevX); |
||
844 | if ($dfDiffLong > $dfDiffSpace && |
||
845 | (($dfX > $dfLeftBorderX && $dfPrevX < $dfRightBorderX) || ($dfPrevX > $dfLeftBorderX && $dfX < $dfRightBorderX))) |
||
846 | { |
||
847 | $bHasBigDiff = true; |
||
848 | } else if ($dfDiffLong > $dfMaxSmallDiffLong) { |
||
849 | $dfMaxSmallDiffLong = $dfDiffLong; |
||
850 | } |
||
851 | } |
||
852 | $poMulti = array(); |
||
853 | $first_pass_ln = count($first_pass); |
||
854 | if ($bHasBigDiff && $dfMaxSmallDiffLong < $dfDateLineOffset) { |
||
855 | $poNewLS = array(); |
||
856 | //$poMulti[] = $poNewLS; |
||
857 | for ($k = 0; $k < $first_pass_ln; ++$k) { |
||
858 | $dfX0 = floatval($first_pass[$k][0]); |
||
859 | if ($k > 0 && abs($dfX0 - $first_pass[$k-1][0]) > $dfDiffSpace) { |
||
860 | $dfX1 = floatval($first_pass[$k-1][0]); |
||
861 | $dfY1 = floatval($first_pass[$k-1][1]); |
||
862 | $dfX2 = floatval($first_pass[$k][0]); |
||
863 | $dfY2 = floatval($first_pass[$k][1]); |
||
864 | if ($dfX1 > -180 && $dfX1 < $dfRightBorderX && $dfX2 == 180 && |
||
865 | $k+1 < count($first_pass) && |
||
866 | $first_pass[$k-1][0] > -180 && $first_pass[$k-1][0] < $dfRightBorderX) |
||
867 | { |
||
868 | $poNewLS[] = array(-180, $first_pass[$k][1]); |
||
869 | $k++; |
||
870 | //echo 'here'; |
||
871 | $poNewLS[] = array($first_pass[$k][0], $first_pass[$k][1]); |
||
872 | continue; |
||
873 | } else if ($dfX1 > $dfLeftBorderX && $dfX1 < 180 && $dfX2 == -180 && |
||
874 | $k+1 < $first_pass_ln && |
||
875 | $first_pass[$k-1][0] > $dfLeftBorderX && $first_pass[$k-1][0] < 180) |
||
876 | { |
||
877 | $poNewLS[] = array(180, $first_pass[$k][1]); |
||
878 | $k++; |
||
879 | $poNewLS[] = array($first_pass[$k][0], $first_pass[$k][1]); |
||
880 | continue; |
||
881 | } |
||
882 | if ($dfX1 < $dfRightBorderX && $dfX2 > $dfLeftBorderX) |
||
883 | { |
||
884 | // swap dfX1, dfX2 |
||
885 | $tmpX = $dfX1; |
||
886 | $dfX1 = $dfX2; |
||
887 | $dfX2 = $tmpX; |
||
888 | // swap dfY1, dfY2 |
||
889 | $tmpY = $dfY1; |
||
890 | $dfY1 = $dfY2; |
||
891 | $dfY2 = $tmpY; |
||
892 | } |
||
893 | if ($dfX1 > $dfLeftBorderX && $dfX2 < $dfRightBorderX) { |
||
894 | $dfX2 += 360; |
||
895 | } |
||
896 | if ($dfX1 <= 180 && $dfX2 >= 180 && $dfX1 < $dfX2) |
||
897 | { |
||
898 | $dfRatio = (180 - $dfX1) / ($dfX2 - $dfX1); |
||
899 | $dfY = $dfRatio * $dfY2 + (1 - $dfRatio) * $dfY1; |
||
900 | $poNewLS[] = array($first_pass[$k-1][0] > $dfLeftBorderX ? 180 : -180, $dfY); |
||
901 | $poMulti[] = $poNewLS; |
||
902 | $poNewLS = array(); |
||
903 | $poNewLS[] = array($first_pass[$k-1][0] > $dfLeftBorderX ? -180 : 180, $dfY); |
||
904 | //$poMulti[] = $poNewLS; |
||
905 | } else { |
||
906 | //$poNewLS[] = array(); |
||
907 | $poMulti[] = $poNewLS; |
||
908 | $poNewLS = array(); |
||
909 | } |
||
910 | $poNewLS[] = array($dfX0, $first_pass[$k][1]); |
||
911 | } else { |
||
912 | $poNewLS[] = array($first_pass[$k][0], $first_pass[$k][1]); |
||
913 | } |
||
914 | } |
||
915 | $poMulti[] = $poNewLS; |
||
916 | } else { |
||
917 | // add normally |
||
918 | $poNewLS0 = array(); |
||
919 | //$poMulti[] = $poNewLS0; |
||
920 | for ($l = 0; $l < $first_pass_ln; ++$l) { |
||
921 | $poNewLS0[] = array($first_pass[$l][0],$first_pass[$l][1]); |
||
922 | } |
||
923 | $poMulti[] = $poNewLS0; |
||
924 | } |
||
925 | return $poMulti; |
||
926 | } |
||
927 | } |
||
928 | ?> |
This check looks from parameters that have been defined for a function or method, but which are not used in the method body.