conteneur = $conteneur; $this->bdd = $this->conteneur->getBdd(); $this->messages = $this->conteneur->getMessages(); $this->mode = $this->conteneur->getParametre('m'); } /** * Fonction qui parcourt tous les ways les noeuds de chaque relation en prenant en considération l'ordre et * le sens de chaque ways concaténés ensemble (séparés par des virgules). Update du champ polygone de chaque * relation dans la table `osm_relations` */ public function executer() { // Lancement de l'action demandée $cmd = $this->conteneur->getParametre('a'); switch ($cmd) { case 'polygone' : $this->genererPolygones(); break; case 'centre' : $this->mettreAJourCentroide(); break; case 'zero' : $this->remettreOrdreAZero(); break; default : $msgTpl = "Erreur : la commande '%s' n'est pas prise en compte par la classe %s !"; $msg = sprintf($msgTpl, $cmd, get_class($this)); throw new Exception($msg); } print "\n";// Pour ramener à la ligne en fin de script } private function genererPolygones() { $relations = $this->getRelations(); foreach ($relations as $relation) { $chemins = $this->getChemins($relation['id_relation']); $noeuds = array(); foreach ($chemins as $chemin) { $noeuds = array_merge($noeuds, $this->getNoeuds($chemin['id_chemin'], $chemin['sens'])); } $this->creerPolygone($relation, $noeuds); if ($this->mode == 'manuel') { $this->messages->afficherAvancement("Création du polygone pour la relation : ", 1); } } } private function getRelations() { $requete = 'SELECT id_relation, nom, code_insee '. 'FROM osm_relations '. ' -- '.__FILE__.' : '.__LINE__; $relations = $this->bdd->recupererTous($requete); return $relations; } private function getChemins($idRelation) { $requete = 'SELECT id_chemin, sens '. 'FROM osm_relation_a_chemins '. "WHERE id_relation = $idRelation ". 'ORDER BY ordre '. ' -- '.__FILE__.' : '.__LINE__; $chemins = $this->bdd->recupererTous($requete); return $chemins; } private function getNoeuds($idChemin, $sens) { $tri = ($sens == 'directe') ? 'ASC' : 'DESC'; $requete = 'SELECT NLL.id_noeud, NLL.lat, NLL.`long` '. 'FROM osm_chemin_a_noeuds AS WN '. ' INNER JOIN osm_noeuds AS NLL ON (WN.id_noeud = NLL.id_noeud) '. "WHERE WN.id_chemin = $idChemin ". "ORDER BY WN.ordre $tri ". ' -- '.__FILE__.' : '.__LINE__; $noeuds = $this->bdd->recupererTous($requete); $latLng = array(); foreach ($noeuds as $noeud) { $latLng[] = $noeud['lat'].' '.$noeud['long']; } return $latLng; } private function creerPolygone($relation, $noeuds) { $polygone = implode(', ', $noeuds); $idRelation = $relation['id_relation']; $nomCommuneP = $this->bdd->proteger($relation['nom']); $InseeP = $this->bdd->proteger($relation['code_insee']); $note = ($noeuds[0] == $noeuds[count($noeuds) - 1]) ? 'Polygone complet' : 'Polygone incomplet'; $requete = 'REPLACE INTO osm_communes (id_relation, nom, code_insee, polygone, notes ) '. "VALUES ($idRelation, $nomCommuneP, $InseeP, ". "POLYFROMTEXT('MULTIPOLYGON ((($polygone)))'), '$note') ". ' -- '.__FILE__.' : '.__LINE__; unset($polygone); $this->bdd->requeter($requete); } /** * Pour chaque commune, renseigne le champe "centre" avec un point centroïde du polygone (si non null). */ private function mettreAJourCentroide() { $requete = 'UPDATE osm_communes '. 'SET centre = CENTROID(polygone) '. "WHERE polygone IS NOT NULL ". ' -- '.__FILE__.' : '.__LINE__; $retour = $this->bdd->requeter($requete); $this->messages->traiterInfo("Nombre de centroïde mis à jour : ".$retour->rowCount()); } /** * Pour chaque commune, remet à zéro l'ordre des chemins si le polygone est incomplet. */ private function remettreOrdreAZero() { $sousRequeteRelations = 'SELECT DISTINCT id_relation '. 'FROM osm_communes '. "WHERE notes = 'Polygone incomplet' "; $requete = 'UPDATE osm_relation_a_chemins '. 'SET ordre = NULL '. "WHERE id_relation IN ($sousRequeteRelations) ". ' -- '.__FILE__.' : '.__LINE__; $retour = $this->bdd->requeter($requete); $this->messages->traiterInfo("Nombre de chemins remis à zéro : ".$retour->rowCount()); } }