Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 1058 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/**
 * Traitement de l'ordre :
 *
 * Fonction qui rajoute l'ordre et le sens de chaque way d'une relation dans la table `osm_relation_a_chemins`
 *
 * Exemple de lancement du script :
 * /opt/lampp/bin/php -d memory_limit=8000M cli.php osm -a ordre -m manuel
 *
 */
class PolygoneCreateur {
        private $conteneur;
        private $bdd;
        private $messages;
        private $mode;

        public function __construct($conteneur) {
                $this->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());
        }
}