Subversion Repositories eFlore/Projets.eflore-projets

Compare Revisions

Ignore whitespace Rev 1120 → Rev 1121

/branches/v5.8-aspergeraie/services/modules/0.1/nasa-srtm/Altitude.php
1,5 → 1,4
<?php
 
/**
* Classe unique du web service nasa-srtm qui détermine l'altitude d'un point à partir de ses coordonnees
* Les coordonnees sont definies dans des fichiers au format HGT dans un dossier specifique
11,11 → 10,11
* correspondant a des point precis. L'ecart entre chaque entree des tableaux est constant, ce qui
* permet de calculer la latitude et la longitude de chaque point. L'altitude du point le plus proche
* de celui passe en parametres sera renvoyee au client.
*
*
* Parametres du web service :
* - latitude : latitude du point dont on recherche les coordonnees
* - longitude : longitude du point dont on recherche les coordonnees
*
*
* @package framework-0.4
* @author Alexandre GALIBERT <alexandre.galibert@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
24,19 → 23,17
* @copyright 2013 Tela Botanica (accueil@tela-botanica.org)
*
*/
class Altitude {
 
 
class Altitude {
private $parametres = array();
private $ressources = array();
private $coordonnees = null;
private $fichierSrtm = '';
 
const LONGUEUR_COTE = 1201;
const OFFSET = 2;
 
 
public function consulter($ressources, $parametres) {
$this->ressources = $ressources;
$this->parametres = $parametres;
51,7 → 48,7
}
return $retour;
}
 
private function traiterCoordonnees() {
if ($this->estParametreExistant('lat') && $this->estParametreExistant('lon')) {
$longitude = $this->parametres['lon'];
69,15 → 66,15
throw new Exception($message, RestServeur::HTTP_CODE_CONTENU_REQUIS);
}
}
 
private function estParametreExistant($nomParametre) {
return in_array($nomParametre, array_keys($this->parametres));
}
 
private function estUnFloat($variable) {
return (preg_match("/^(-)?\d+(\.\d+)?$/", $variable) == 1);
}
 
private function verifierValiditeCoordonnees($longitude, $latitude) {
$longitude = floatval($longitude);
$latitude = floatval($latitude);
95,17 → 92,17
$this->coordonnees->latitude = $latitude;
}
}
 
private function rechercherFichierSrtm() {
$nomFichierSrtm = $this->construireNomFichierSrtm();
if (!file_exists($nomFichierSrtm)) {
$message = "Erreur interne : certaines ressources demandées n'ont pas pu être trouvées sur le serveur.";
$message = "Erreur interne : la ressource « $nomFichierSrtm » demandée n'a pas pu être trouvée sur le serveur.";
throw new Exception($message, restServeur::HTTP_CODE_ERREUR);
} else {
$this->fichierSrtm = $nomFichierSrtm;
}
}
 
private function construireNomFichierSrtm() {
$latitudeEntier = abs(floor($this->coordonnees->latitude));
if ($latitudeEntier < 10) {
123,13 → 120,13
$nomFichierSrtm = $dossierSrtm.$suffixeLatitude.$latitudeEntier.$suffixeLongitude.$longitudeEntier.".hgt.zip";
return $nomFichierSrtm;
}
 
private function recupererAltitude() {
$zip = zip_open($this->fichierSrtm);
$fichier = zip_read($zip);
$donnees = zip_entry_read($fichier, zip_entry_filesize($fichier));
zip_close($zip);
 
$xDepart = floor($this->coordonnees->longitude);
$yDepart = floor($this->coordonnees->latitude);
$longitude = $this->coordonnees->longitude;
138,7 → 135,7
$positionY = (self::LONGUEUR_COTE-1) * (1 - $latitude + $yDepart);
$positionX = ($positionX + 0.5 > ceil($positionX)) ? ceil($positionX) : floor($positionX);
$positionY = ($positionY + 0.5 > ceil($positionY)) ? ceil($positionY) : floor($positionY);
 
$binaire = substr($donnees, ($positionY * self::LONGUEUR_COTE + $positionX) * self::OFFSET, self::OFFSET);
$this->coordonnees->altitude = current(unpack("n*", $binaire));
if (!$this->coordonnees->altitude) {
145,7 → 142,5
$this->coordonnees->altitude = 0;
}
}
}
 
?>
}