Subversion Repositories eFlore/Applications.cel

Compare Revisions

Regard whitespace Rev 2913 → Rev 2914

/trunk/jrest/bibliotheque/RechercheInfosZoneGeo.php
74,27 → 74,28
return $infos_coord;
}
public function obtenirInfosPourNoms($nom, $pays, $code) {
// gère aussi les id_zone_geo @TODO renommer la méthode et internationaliser
// la gestion des codes
public function obtenirInfosPourNom($nom, $pays, $code_departement=null, $id_zone=null) {
$nom = trim($nom);
$pays = trim($pays);
$code = trim($code);
$code_departement = trim($code_departement);
$retour = false;
// Dans le cas de la france on possède directement une table
// avec les centroïdes des communes
if($pays == 'FR' || $code != "") {
$retour = $this->chercherCentroideCommuneBdd($nom, $code);
if($pays == 'FR' || $code_departement != "") {
$retour = $this->chercherCentroideCommuneBdd($nom, $code_departement, $id_zone);
} else {
// Sinon méthode habituelle, un test simple suivi d'un test plus complexe
// On cherche donc d'abord en France
// @TODO c'est quoi ce if() mal ordonné ?
if($pays == "") {
$retour = $this->chercherCentroideCommuneBdd($nom, $code);
$retour = $this->chercherCentroideCommuneBdd($nom, $code_departement, $id_zone);
}
// Si on ne trouve rien on teste dans le monde entier
if($retour == false) {
$retour = $this->effectuerRequeteGeocodingMondiale($nom, '2,3,4,5,6,7,8', 1, $pays);
$retour = $this->effectuerRequeteGeocodingMondiale($nom, '2,3,4,5,6,7,8', 1, $pays, $id_zone);
}
}
101,6 → 102,64
return $retour;
}
/**
* Renvoie tous les codes de zones pour le groupe $groupe
*/
protected function obtenirZonesDuGroupe($groupe) {
$requete = 'SELECT valeur as id_zone FROM cel_groupes_zones '
. 'WHERE id_groupe = ' . Cel::db()->proteger($groupe)
. ' -- '.__FILE__.':'.__LINE__;
 
$liste_zones = Cel::db()->requeter($requete);
return $liste_zones;
}
 
/**
* Renvoie des infos pour un groupes de zones, déclaré dans la table
* cel_groupe_zones : toutes les infos des zones concernées, plus le carré
* englobant (bounding box) et le centroïde de l'union des zones
*/
public function obtenirInfosPourGroupeZonesFrance($groupe) {
$groupe = trim($groupe);
$retour = false;
 
$zones = $this->obtenirZonesDuGroupe($groupe);
$retour = array(
'groupe' => array(),
'zones' => array()
);
foreach ($zones as $zone) {
$idZone = $zone['id_zone'];
$retour['zones'][] = $this->obtenirInfosPourNom(null, null, null, $idZone);
}
 
// recherche bbox (de Bouygues Telecom) @TODO faire ça au dessus, en une passe ?
$lngmin = 99999;
$latmin = 99999;
$lngmax = -99999;
$latmax = -99999;
foreach ($retour['zones'] as $zone) {
$lat = $zone['lat'];
$lng = $zone['lng'];
if ($lat < $latmin) { $latmin = $lat; }
if ($lat > $latmax) { $latmax = $lat; }
if ($lng < $lngmin) { $lngmin = $lng; }
if ($lng > $lngmax) { $lngmax = $lng; }
}
$retour['groupe']['bbox'] = array(
'lat_min' => $latmin,
'lat_max' => $latmax,
'lon_min' => $lngmin,
'lon_max' => $lngmax
);
$retour['groupe']['centroide'] = array(
'lat' => ($latmin + $latmax) / 2,
'lon' => ($lngmin + $lngmax) / 2
);
 
return $retour;
}
public function chercherInfosCommune($projet, $latitude, $longitude) {
$valeurs_params = '?lat='.$latitude.'&lon='.$longitude;
204,7 → 263,8
return $retour;
}
private function effectuerRequeteGeocodingMondiale($nom, $niveau = '2,3,4,5,6,7,8', $limite = 1, $pays = null) {
// @TODO gérer $id_zone (inactif pour l'instant)
protected function effectuerRequeteGeocodingMondiale($nom, $niveau = '2,3,4,5,6,7,8', $limite = 1, $pays = null, $id_zone=null) {
$url_sans_pays = $this->config['cel']['url_service_geo_mondial'].'?masque='.urlencode($nom).'&niveau='.$niveau.'&limite='.$limite;
$url = $url_sans_pays.(!empty($pays) ? '&pays='.urlencode($pays) : '');
 
243,18 → 303,35
return $retour;
}
private function chercherCentroideCommuneBdd($commune, $departement) {
/**
* Renvoie les infos d'une commune, incluant les coordonnées du centroïde,
* en fonction du nom et/ou du département, et/ou de l'id_zone (plus fiable)
*/
protected function chercherCentroideCommuneBdd($commune, $departement=null, $id_zone=null) {
$commune_formatee = str_replace(array(' ', '-'), '_', trim($commune));
// clauses
$clauses = array();
if ($commune != null) {
$clauses[] = 'nom LIKE '.Cel::db()->proteger($commune_formatee);
}
if ($departement != null) {
$departement = trim($departement, "*");
if (strlen($departement) > 2) {
// @TODO piège : si deux communes ont le même nom dans deux
// DROM-COM, la troncature à 2 chiffres sera insuffisante
$departement = substr($departement, 0, 2);
}
$requete = 'SELECT utm_x, utm_y, utm_secteur, code FROM cel_zones_geo '.
'WHERE nom LIKE '.Cel::db()->proteger($commune_formatee).' '.
'AND code LIKE '.Cel::db()->proteger($departement.'%').' '.
' -- '.__FILE__.':'.__LINE__;
$clauses[] = 'code LIKE '.Cel::db()->proteger($departement.'%');
}
if ($id_zone != null) {
$clauses[] = 'id_zone_geo = '.Cel::db()->proteger($id_zone);
}
$clauses = implode(' AND ', $clauses);
$requete = 'SELECT utm_x, utm_y, utm_secteur, code FROM cel_zones_geo '
. 'WHERE ' . $clauses
. ' -- '.__FILE__.':'.__LINE__;
 
$commune_coordonnees = Cel::db()->requeter($requete);
$retour = false;
317,7 → 394,7
*
*/
private function reduireListeLieux($tableau) {
protected function reduireListeLieux($tableau) {
$index = array();
foreach($tableau as $ligne) {
$index_loc = trim(preg_replace("/\([a-zA-Z0-9]{2}\)$/", "", $ligne[0]));
337,11 → 414,11
return array_values($index);
}
private function trierListeLieux($a, $b) {
protected function trierListeLieux($a, $b) {
return strcmp($a[0], $b[0]);
}
private function testerCoordonneesWgsFrance($latitude, $longitude) {
protected function testerCoordonneesWgsFrance($latitude, $longitude) {
$coord_france = false;
if ($latitude != '' && $longitude != '') {
if ($latitude < 51.071667 && $latitude > 41.316667) {
353,7 → 430,7
return $coord_france;
}
private function traiterLigneResultatRequeteGeocodingMondiale($res) {
protected function traiterLigneResultatRequeteGeocodingMondiale($res) {
$lat = "";
$lon = "";
383,7 → 460,7
return $retour;
}
private function convertirUtmVersLatLong($x, $y, $sector) {
protected function convertirUtmVersLatLong($x, $y, $sector) {
$convertisseur = new gPoint();
$convertisseur->setUTM($x, $y, $sector);
$convertisseur->convertTMtoLL();
394,7 → 471,7
return $lat_long;
}
private function extraireCodePays($infos_pays) {
protected function extraireCodePays($infos_pays) {
$code = "";
if(!empty($infos_pays['codeIso31661'])) {
$code = $infos_pays['codeIso31661'];
406,11 → 483,11
return $code;
}
private function estUneChaineRequeteValide($lieu) {
protected function estUneChaineRequeteValide($lieu) {
return (strlen($lieu) > 0) && ($lieu != '%');
}
private function formaterLigneResultat($ligne) {
protected function formaterLigneResultat($ligne) {
if(empty($ligne['code']) || $ligne['code'] == null) {
$res = array($ligne['nom'], '');
} else {
426,7 → 503,7
* @param string $lieu
* @return string le lieu formaté pour la recherche
*/
private function formaterChaineLieuPourRequete($lieu) {
protected function formaterChaineLieuPourRequete($lieu) {
$lieu = ltrim($lieu);
$lieu = preg_replace('/\*+/', '%', $lieu);
$lieu = str_replace(['+', ' ', '-'], '_', $lieu);