/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/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 = '')"; |
/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/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/jrest.ini.php.defaut |
---|
85,6 → 85,9 |
format_CXS = 100_100 |
format_CRXS = 100_100 |
url_service_geo_local = http://api.tela-botanica.org/service:eflore:0.1/osm/nom-commune |
url_service_geo_mondial = http://api.tela-botanica.org/service:eflore:0.1/osm/zone-admin |
commande_script_images = "/usr/local/php/5.5/bin/php /home/apitela/www/scripts/cel/cli.php generationimages -a genererMinaturesPourId -id %s &"; |
[database_cel] |
/trunk/jrest/services/CoordSearch.php |
---|
17,20 → 17,14 |
*/ |
class CoordSearch extends Cel { |
private $adresse_service_geonames = null; |
private $adresse_service_mondial = null; |
private $adresse_service_local = null; |
private $nom_service_geocoding = null; |
private $nom_service_reverse_geocoding = null; |
public function __construct($config) { |
parent::__construct($config); |
$this->adresse_service_geonames = $this->config['cel']['url_service_geo_geonames']; |
$this->adresse_service_mondial = $this->config['cel']['url_service_geo_mondial']; |
$this->adresse_service_local = $this->config['cel']['url_service_geo_local']; |
$this->nom_service_geocoding = $this->config['cel']['nom_service_geocoding_geonames']; |
$this->nom_service_reverse_geocoding = $this->config['cel']['nom_service_reverse_geocoding_geonames']; |
} |
/** |
52,7 → 46,7 |
$informations_communes = $this->effectuerRequeteReverseGeocodingCartoOsm($params['lat'], $params['lon']); |
if (!$informations_communes) { |
$informations_communes = $this->effectuerRequeteReverseGeocodingGeonames($params['lat'], $params['lon']); |
$informations_communes = $this->effectuerRequeteReverseGeocodingMondiale($params['lat'], $params['lon']); |
} |
$header = 'Content-Type: application/json; charset=UTF-8'; |
60,7 → 54,7 |
} elseif ($this->estUneRequeteGeocoding($params)) { |
$informations_coord = $this->chercherCentroideCommuneBdd($params['commune'],$params['code_postal']); |
if (!$informations_coord) { |
$informations_coord = $this->effectuerRequeteGeocodingGeonames($params['commune'],$params['code_postal'],$params['code_pays']); |
$informations_coord = $this->effectuerRequeteGeocodingMondiale($params['commune'],$params['code_postal'],$params['code_pays']); |
} |
$header = 'Content-Type: application/json; charset=UTF-8'; |
113,35 → 107,6 |
return (is_a($retour, 'stdClass') && property_exists($retour, 'nom') && property_exists($retour, 'codeINSEE')); |
} |
private function effectuerRequeteReverseGeocodingGeonames($lat, $lon) { |
$url = $this->adresse_service_geonames. |
$this->nom_service_reverse_geocoding. |
'?lat='.urlencode($lat).'&lng='.urlencode($lon). |
'&style=full'; |
$infos_commune_json = @file_get_contents($url); |
$objet_retour = json_decode($infos_commune_json); |
$retour = false; |
if ($this->estUnRetourReverseGeocodingGeonamesValide($objet_retour)) { |
$retour = array( |
'nom' => $objet_retour->geonames[0]->adminName4, |
'code_insee' => $objet_retour->geonames[0]->adminCode4); |
} |
return $retour; |
} |
private function estUnRetourReverseGeocodingGeonamesValide($retour) { |
$valide = false; |
if (is_a($retour, 'stdClass') && property_exists($retour, 'geonames') |
&& is_array($retour->geonames) && count($retour->geonames) > 0) { |
$objet_resultats = $retour->geonames[0]; |
if (property_exists($objet_resultats, 'adminName4') && property_exists($objet_resultats, 'adminCode2')) { |
$valide = true; |
} |
} |
return $valide; |
} |
private function chercherCentroideCommuneBdd($commune, $departement) { |
$commune_formatee = str_replace(array(' ', '-'), '_', $commune); |
if (strlen($departement) > 2) { |
178,36 → 143,27 |
return $lat_long; |
} |
private function effectuerRequeteGeocodingGeonames($commune, $code_postal, $code_pays) { |
$url = $this->adresse_service_geonames. |
$this->nom_service_geocoding. |
'?placename_startsWith='.urlencode($commune). |
(($code_postal != '*') ? '&postalcode_startsWith='.urlencode($code_postal) : ''). |
'&country='.urlencode($code_pays).'&maxRows=10'; |
$coord_json = @file_get_contents($url); |
$objet_retour = json_decode($coord_json); |
private function effectuerRequeteReverseGeocodingMondiale($lat, $lon) { |
$url = $this->adresse_service_mondial.'?lat='.$lat.'&lon='.$lon; |
// Pour limiter par niveau ajouter ce qui suit à la requête : |
//.'&niveau=2,3,4'; |
$res = json_decode(file_get_contents($url), true); |
$retour = false; |
if ($this->estUnRetourGeocodingGeonamesValide($objet_retour)) { |
$retour = array( |
'lat' => $objet_retour->postalCodes[0]->lat, |
'lng' => $objet_retour->postalCodes[0]->lng, |
'nom' => $objet_retour->postalCodes[0]->placeName, |
'code_insee' => $objet_retour->postalCodes[0]->postalCode |
); |
$code = ""; |
$localite = ""; |
if(!empty($res)) { |
$infos_pays = $res[min(array_keys($res))]; |
$infos_localite = $res[max(array_keys($res))]; |
$localite = $infos_localite['intitule']; |
if(!empty($infos_pays['codeIso31661'])) { |
$code = $infos_pays['codeIso31661']; |
} elseif(!empty($infos_pays['codeIso31662'])) { |
$code = substr($infos_pays['codeIso31662'], 0, 2); |
} |
return $retour; |
} |
private function estUnRetourGeocodingGeonamesValide($retour) { |
$valide = false; |
if (is_a($retour, 'stdClass') && property_exists($retour, 'postalCodes') |
&& is_array($retour->postalCodes) && count($retour->postalCodes) > 0) { |
$objet_resultats = $retour->postalCodes[0]; |
if (property_exists($objet_resultats, 'lat') && property_exists($objet_resultats, 'lng')) { |
$valide = true; |
return array('nom' => $localite, 'code_insee' => $code); |
} |
} |
return $valide; |
} |
} |
/trunk/jrest/services/InventoryObservationList.php |
---|
89,7 → 89,7 |
} |
// cas de mise à jour de multiples observations: |
$ret = GestionObservation::modifierMultiplesObservation($uid[0], $obs, $pairs); |
$ret = $gestionnaire_observation->modifierMultiplesObservation($uid[0], $obs, $pairs); |
if ($ret === false) { |
return false; // JRest::badRequest(); |
} |
/trunk/jrest/services/ImportXLS.php |
---|
92,6 → 92,7 |
'nt', |
'famille', |
'nom_referentiel', |
'pays', |
'zone_geo', |
'ce_zone_geo', |
'date_observation', |
565,6 → 566,7 |
// $localisation est rempli à partir de plusieurs champs: C_ZONE_GEO et C_CE_ZONE_GEO |
$localisation = Array(C_ZONE_GEO => NULL, C_CE_ZONE_GEO => NULL); |
self::traiterLocalisation($ligne, $localisation); |
//TODO: le jour où c'est efficace, traiter le pays à l'import |
// $transmission est utilisé pour date_transmission |
// XXX: @ contre "Undefined index" |
585,6 → 587,7 |
"nom_referentiel" => $referentiel, |
"pays" => $ligne[C_PAYS], |
"zone_geo" => $localisation[C_ZONE_GEO], |
"ce_zone_geo" => $localisation[C_CE_ZONE_GEO], |
/trunk/jrest/services/CelWidgetExport.php |
---|
38,6 → 38,7 |
'id_utilisateur' => 'ce_utilisateur', |
'utilisateur' => 'courriel_utilisateur', |
'courriel_utilisateur' => 'courriel_utilisateur', |
'pays' => 'pays', |
'commune' => 'zone_geo', |
'zone_geo' => 'zone_geo', |
'dept' => 'departement', |