Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 2537 → Rev 2538

/trunk/jrest/bibliotheque/RechercheInfosZoneGeo.php
New file
0,0 → 1,139
<?php
// declare(encoding='UTF-8');
/**
* Classe recherchant des infos sur une zone géo ou bien des coordonnées.
*
* @internal Mininum PHP version : 5.2
* @category CEL
* @package Services
* @subpackage Bibliothèques
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class RechercheInfosZoneGeo extends Cel {
 
//TODO: migrer tout ce qui concerne la zone géo dans cette classe
public function obtenirInfosPourCoordonnees($coordonnees) {
$infos_coord = null;
// Test facile qui permet d'abord de tenter une localisation bien plus rapide si les coordonnées
// sont dans la bounding box approximative de la France
if($this->testerCoordonneesWgsFrance($coordonnees['latitude'], $coordonnees['longitude'])) {
$infos_coord = $this->chercherInfosCommune('osm', $coordonnees['latitude'], $coordonnees['longitude']);
if ($infos_coord == null) {
// Sinon recherche par pays
$infos_coord = $this->chercherInfosPays($coordonnees['latitude'], $coordonnees['longitude']);
}
} else {
// Recherche par pays immédiate si en dehors de la bouding box française
$infos_coord = $this->chercherInfosPays($coordonnees['latitude'], $coordonnees['longitude']);
}
return $infos_coord;
}
public function chercherInfosCommune($projet, $latitude, $longitude) {
$valeurs_params = '?lat='.$latitude.'&lon='.$longitude;
$url_service = $this->config['cel']['url_service_geo_local'].$valeurs_params;
$url_service = str_replace(',', '.', $url_service);
$ch = curl_init($url_service);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$reponse = curl_exec($ch);
$infos_coord = $this->traiterReponseServiceCommune($reponse);
curl_close($ch);
return $infos_coord;
}
public function chercherInfosPays($latitude, $longitude) {
$valeurs_params = '?lat='.$latitude.'&lon='.$longitude;
$url_service = $this->config['cel']['url_service_geo_mondial'].$valeurs_params;
$url_service = str_replace(',', '.', $url_service);
$ch = curl_init($url_service);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$reponse = curl_exec($ch);
$res = json_decode($reponse, true);
$retour = null;
if(!empty($res)) {
// Cas où l'on a recherché des coordonnées en France
// On en profite pour remplir plus de données
// que le simple pays si elles sont présentes
if(isset($res[8]) && isset($res[8]['codeInsee'])) {
$retour = array(
'code_insee' => $res[8]['codeInsee'],
'nom' => $res[8]['intitule'],
'type' => 'france'
);
} else {
// Cas de la recherche en dehors de France
// La zone de plus haut niveau est toujours un pays
// (car le niveau de zone est limité à 2)
$infos_pays = $res[min(array_keys($res))];
// La zone de niveau le plus bas est la "localité"
// la plus précise qu'on a pu trouver
$infos_localite = $res[max(array_keys($res))];
// Cas où l'on a trouvé un code pays
if(!empty($infos_pays['codeIso31661'])) {
$retour = array(
'code_pays' => $infos_pays['codeIso31661'],
'nom' => ''
);
} elseif(!empty($infos_pays['codeIso31662'])) {
// Quelquefois la zone de plus haut niveau est une région ou une province
// heureusement son code est de forme XX-YY ou XX est le code iso du pays !
$retour = array(
'code_pays' => substr($infos_pays['codeIso31662'], 0, 2),
'nom' => ''
);
}
// Pas de sens de prendre un nom de localité si on a pas de pays
if(!empty($retour['code_pays'])) {
// Type sert à savoir quelle fonction de mise à jour on appellera
$retour['type'] = 'pays';
$retour['nom'] = $infos_localite['intitule'];
}
}
}
return $retour;
}
public function traiterReponseServiceCommune($reponse) {
$retour = null;
$reponse = json_decode($reponse);
// cas du service lion 1906 qui peut renvoyer plusieurs communes (on prend la première)
if (is_array($reponse)) {
$reponse = $reponse[0];
}
if (isset($reponse->codeINSEE)) {
// Type sert à savoir quelle fonction de mise à jour on appellera
$retour = array('code_insee' => $reponse->codeINSEE,
'nom' => $reponse->nom,
'type' => 'france');
}
return $retour;
}
private function testerCoordonneesWgsFrance($latitude, $longitude) {
$coord_france = false;
if ($latitude != '' && $longitude != '') {
if ($latitude < 51.071667 && $latitude > 41.316667) {
if ($longitude < 9.513333 && $longitude > -5.140278) {
$coord_france = true;
}
}
}
return $coord_france;
}
}
/trunk/jrest/bibliotheque/GestionObservation.php
57,7 → 57,7
}
 
$this->ajoutInfoUtilisateurARequete($parametres);
self::formaterParametresObservation($parametres);
$this->formaterParametresObservation($parametres);
 
$requete_insertion_observation = 'INSERT INTO cel_obs ';
$sous_requete_colonnes = $this->traiterParametresObservationEtConstruireSousRequeteAjout($parametres);
140,7 → 140,7
// uniquement en cas de nom_sel présent
$this->traiterEspece($parametres);
}
self::formaterParametresObservation($parametres);
$this->formaterParametresObservation($parametres);
$champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres);
$champ_maj[] = "date_modification = NOW()";
$clauseSet = implode(', ', $champ_maj);
163,7 → 163,7
/**
* @return nombre d'observations mises à jour, ou FALSE en cas de problème
*/
static function modifierMultiplesObservation($utilisateur, Array $ordre, $parametres) {
public function modifierMultiplesObservation($utilisateur, Array $ordre, $parametres) {
// nous pouvons aussi retirer 'ce_utilisateur' (== $utilisateur) qui sera dans la clause WHERE
$exclusions = ['nom_sel_nn', 'nom_sel', 'nom_ret_nn', 'nom_referentiel', 'ce_utilisateur'];
$parametres = array_diff_key($parametres, array_flip($exclusions));
174,7 → 174,7
create_function('$e','return strpos($e, "(Valeurs multiples)") === false;'));
 
// modifie $parametres par référence
self::formaterParametresObservation($parametres);
$this->formaterParametresObservation($parametres);
 
$champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres);
$nbreUpdate = count($champ_maj);
214,7 → 214,7
$parametres = array_merge($parametresDefaut, $parametres);
 
$this->traiterEspece($parametres);
self::formaterParametresObservation($parametres);
$this->formaterParametresObservation($parametres);
 
$champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres);
$champ_maj[] = 'date_modification = NOW()';
462,12 → 462,13
* @param array $parametres tableau indexé avec les mêmes noms de champs que la bdd
* @return $parametres le tableau modifié selon ce qu'il contenait
*/
static function formaterParametresObservation(&$parametres) {
public function formaterParametresObservation(&$parametres) {
// Pour empecher que des numéros de département de 1 à 9 soient saisis sans 0
// TODO: décider quoi faire pour les zones géo plus générales
if (isset($parametres['ce_zone_geo'])) {
if ($parametres['ce_zone_geo'] == 'null' || trim($parametres['ce_zone_geo']) == "") {
if ($parametres['ce_zone_geo'] == 'null' || trim($parametres['ce_zone_geo']) == "" || !is_numeric($parametres['ce_zone_geo'])) {
$parametres['ce_zone_geo'] = "";
$parametres['pays'] = '';
} else {
if (strlen($parametres['ce_zone_geo']) == 4) {
$parametres['ce_zone_geo'] = '0'.$parametres['ce_zone_geo'];
478,9 → 479,32
} else {
$parametres['ce_zone_geo'] = 'INSEE-C:'. $parametres['ce_zone_geo'];
}
$parametres['pays'] = 'FR';
}
} else {
$parametres['pays'] = '';
}
 
// TODO: Fusionner cette partie et la partie du dessus en une fonction qui complete toutes les infos
// géo, quand on sera riche et qu'on aura du temps
if(empty($parametres['pays']) && !empty($parametres['latitude']) && !empty($parametres['longitude'])) {
$recherche_pays = new RechercheInfosZoneGeo($this->config);
$infos_pays = $recherche_pays->obtenirInfosPourCoordonnees($parametres);
if($infos_pays['type'] == 'france') {
$parametres['pays'] = 'FR';
// Ajout d'infos supplémentaires si jamais on a pas de ce zone geo ou de zone geo
if(empty($parametres['ce_zone_geo'])) {
$parametres['ce_zone_geo'] = 'INSEE-C:'.$infos_pays['code_insee'];
}
if(empty($parametres['zone_geo'])) {
$parametres['zone_geo'] = $infos_pays['nom'];
}
} else {
$parametres['pays'] = $infos_pays['code_pays'];
}
}
 
// TODO : voir si l'on peut utiliser un des fonctions de la classe cel
if (isset($parametres['date_observation']) && $parametres['date_observation'] != 'null') {
//TODO: prendre en compte des dates incomplètes ?
/trunk/jrest/bibliotheque/FormateurGroupeColonne.php
150,6 → 150,8
'importable' => FALSE)),
'nom_referentiel' => self::GenColInfo(Array('abbrev' => 'nom_referentiel',
'nom' => 'Referentiel taxonomique')),
'pays' => self::GenColInfo(Array('abbrev' => 'pays',
'nom' => 'Pays')),
'zone_geo' => self::GenColInfo(Array('abbrev' => 'zone_geo',
'nom' => 'Commune')),
'ce_zone_geo' => self::GenColInfo(Array('abbrev' => 'ce_zone_geo',
/trunk/jrest/bibliotheque/RechercheObservation.php
225,6 → 225,18
}
$sous_requete .= ' AND ' ;
break;
case 'pays':
if ($valeur == "NULL") {
$sous_requete .= "(pays IS NULL OR pays = '')";
} else {
$pays_t = explode(',', $valeur);
foreach($pays_t as &$pays) {
$pays = Cel::db()->proteger($pays);
}
$sous_requete .= '(pays IN ('.implode(',', $pays_t).')) ';
}
$sous_requete .= ' AND ' ;
break;
case 'departement':
if ($valeur == "NULL") {
$sous_requete .= "(ce_zone_geo IS NULL OR ce_zone_geo = '')";