Subversion Repositories eFlore/Applications.cel

Rev

Rev 3422 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3422 Rev 3843
Line 14... Line 14...
14
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
14
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
15
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
15
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
17
 */
17
 */
18
class RechercheInfosZoneGeo extends Cel {
18
class RechercheInfosZoneGeo extends Cel {
-
 
19
	// @TODO: surveiller les conséquences du changement climatique :)
-
 
20
	const POINT_EMERGE_LE_PLUS_BAS = -422;// mètres
19
	
21
 
20
	public $maxTimeoutRequeteMondiale = 0;
22
	public $maxTimeoutRequeteMondiale = 0;
Line 21... Line 23...
21
	
23
	
22
	/**
24
	/**
23
	 * Cas de la demande par lat et lon
25
	 * Cas de la demande par lat et lon
Line 69... Line 71...
69
			}
71
			}
70
		} else {
72
		} else {
71
			// Recherche par pays immédiate si en dehors de la bouding box française
73
			// Recherche par pays immédiate si en dehors de la bouding box française
72
			$infos_coord = $this->chercherInfosPays($coordonnees['latitude'], $coordonnees['longitude']);
74
			$infos_coord = $this->chercherInfosPays($coordonnees['latitude'], $coordonnees['longitude']);
73
		}
75
		}
-
 
76
 
74
		return $infos_coord;
77
		return array_merge($infos_coord,['lat' => $coordonnees['latitude'], 'lng' => $coordonnees['longitude']]);
75
	}
78
	}
Line 76... Line 79...
76
 
79
 
77
	// gère aussi les id_zone_geo @TODO renommer la méthode et internationaliser
80
	// gère aussi les id_zone_geo @TODO renommer la méthode et internationaliser
78
	// la gestion des codes
81
	// la gestion des codes
Line 549... Line 552...
549
		$lieu = ltrim($lieu);
552
		$lieu = ltrim($lieu);
550
		$lieu = preg_replace('/\*+/', '%', $lieu);
553
		$lieu = preg_replace('/\*+/', '%', $lieu);
551
		$lieu = str_replace(['+', ' ', '-'], '_', $lieu);
554
		$lieu = str_replace(['+', ' ', '-'], '_', $lieu);
552
		return $lieu;
555
		return $lieu;
553
	}
556
	}
-
 
557
 
-
 
558
	public function obtenirAltitude($donnees) {
-
 
559
		$altitude = [];
-
 
560
		$api = '';
-
 
561
		$parametres_coordonnees = '';
-
 
562
 
-
 
563
 
-
 
564
		if(empty($donnees) || empty($donnees['code_pays'])) {
-
 
565
			return $altitude;
-
 
566
		}
-
 
567
 
-
 
568
		$pays = $donnees['code_pays'];
-
 
569
		$lat = $donnees['lat'] ?? $donnees['latitude'] ?? null;
-
 
570
		$lon = $donnees['lon'] ?? $donnees['lng'] ?? $donnees['longitude'] ?? null;
-
 
571
 
-
 
572
		if (!($lat && $lon)) {
-
 
573
			return $altitude;
-
 
574
		}
-
 
575
 
-
 
576
		if ('FR' === $donnees['code_pays']) {
-
 
577
			$api = 'ign';
-
 
578
			$parametres_coordonnees = http_build_query(['lat' => $lat, 'lon' => $lon]);
-
 
579
		} else {
-
 
580
			$api = 'mapquest';
-
 
581
			$parametres_coordonnees = http_build_query(['latLngCollection' => $lat.','.$lon]);
-
 
582
		}
-
 
583
 
-
 
584
		$url_service = sprintf($this->config[$api]['url_service_altitude'], $this->config[$api]['cle_api'], $parametres_coordonnees);
-
 
585
 
-
 
586
		$ch = curl_init($url_service);
-
 
587
 
-
 
588
		if ('ign' === $api) {// pas de header Authorization pour mapquest
-
 
589
			curl_setopt($ch, CURLOPT_USERPWD, $this->config[$api]['username'] . ":" . $this->config[$api]['password']);
-
 
590
		}
-
 
591
 
-
 
592
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-
 
593
		$reponse = curl_exec($ch);
-
 
594
		curl_close($ch);
-
 
595
 
-
 
596
		$altitude = $this->traiterReponseServiceAltitude($api, $reponse);
-
 
597
 
-
 
598
		return ['altitude' => $altitude];
-
 
599
	}
-
 
600
 
-
 
601
	public function traiterReponseServiceAltitude($api, $reponse) {
-
 
602
		$reponse = json_decode($reponse);
-
 
603
		$elevationArrayKey = '';
-
 
604
		$elevationKey = '';
-
 
605
		$altitude = null;
-
 
606
 
-
 
607
		// on a de la chance les réponses de ces 2 api sont structurées de la même façon
-
 
608
		if ('ign' === $api) {
-
 
609
			$elevationArrayKey = 'elevations';
-
 
610
			$elevationKey = 'z';
-
 
611
		} elseif ('mapquest' === $api) {
-
 
612
			$elevationArrayKey = 'elevationProfile';
-
 
613
			$elevationKey = 'height';
-
 
614
		}
-
 
615
		// du coup on peut faire ça
-
 
616
		if (
-
 
617
			isset($reponse->{$elevationArrayKey})
-
 
618
			&& is_array($reponse->{$elevationArrayKey})
-
 
619
			&& isset($reponse->{$elevationArrayKey}[0]->{$elevationKey})
-
 
620
		// lorsque les coordonnées sortent de leur rayon d'action, ces APIs
-
 
621
		// renvoient bien quelque-chose: -32768 pour mapquest, et -99999 pour l'IGN
-
 
622
			&& POINT_EMERGE_LE_PLUS_BAS < floatval($reponse->{$elevationArrayKey}[0]->{$elevationKey})
-
 
623
		) {
-
 
624
			$altitude = $reponse->{$elevationArrayKey}[0]->{$elevationKey};
-
 
625
		}
-
 
626
 
-
 
627
		return $altitude;
-
 
628
	}
554
}
629
}