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