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); |