Rev 392 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** Exemple de lancement du script :* /opt/lampp/bin/php cli.php osm/parseur_osm -a compter -f "/home/jpm/Stockage/osm/languedoc-roussillon-communes.osm"**/class ParseurOsm extends Script {private $communes = array();private $relations_communes = array();private $relation_a_chemins = array();private $chemin_a_noeuds = array();private $noeuds = array();private $pas = 10000;private $pas_commune = 1000;protected $parametres_autorises = array('-f' => array(true, null, 'Chemin du fichier osm à analyser'),'-m' => array(false, 'auto', 'Mode «auto» ou «manuel». En manuel, les compteurs dans les boucles sont affichés.'));public function executer() {$this->bdd = new Bdd();// Lancement de l'action demandée$cmd = $this->getParametre('a');switch ($cmd) {case 'analyser' :$this->lireFichierOsm();break;case 'ordre' :$this->ordonnerWays();break;case 'polygone' :$this->remplirPolygone();break;case 'zero' :$this->remettreOrdreAZero();break;case 'ordonnerPolygoneInc' :$this->relationsPolygoneIncomplet(1, 0);break;case 'remplirPolygoneInc' :$this->remplirCommunesPolygoneIncomplet();break;case 'renommer' :$this->renommerEnPolygoneIncomplet();break;case 'centre' :$this->centroid();break;default :$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));}}/*** Lit le fichier OSM et lance l'analyse des noeuds xml en fonction de leur type.*/private function lireFichierOsm() {$lecteur = new XMLReader();if ($lecteur->open($this->getParametre('f'))) {$dom = new DomDocument();while ($lecteur->read()) {if ($lecteur->nodeType == XMLREADER::ELEMENT) {if ($lecteur->localName == 'relation') {$relation = $lecteur->expand();$this->analyserRelation($relation);if (count($this->relation_a_chemins) > $this->pas) {$this->insererRelationAChemins();}if (count($this->relations_communes) > $this->pas_commune) {$this->insererRelationsCommunes();}} else if ($lecteur->localName == 'way') {$way = $lecteur->expand();$this->analyserWay($way);if (count($this->chemin_a_noeuds) > $this->pas) {$this->insererCheminANoeuds();}} else if ($lecteur->localName == 'node') {$node = $lecteur->expand();$this->analyserNode($node);if (count($this->noeuds) > $this->pas) {$this->insererNoeuds();}}}if (count($this->noeuds) > $this->pas) {$this->insererNoeuds();$this->insererCheminANoeuds();}if ($this->getParametre('m') == 'manuel') {$this->afficherAvancement("Analyse de la ligne du fichier OSM : ", 1);}}$this->insererRelationsCommunes();$this->insererRelationAChemins();$this->insererCheminANoeuds();$this->insererNoeuds();} else {$e = "Impossible d'ouvrir le fichier osm : %s";$this->traiterErreur($e, array($this->getParametre('f')));}}/*** Récupère l'id commune, nom commune et le code INSEE et remplie la table `CommuneOSM`*/private function analyserRelation($relation) {$relation_id = $this->proteger($relation->getAttribute('id'));$chemins = $relation->getElementsByTagName('member');foreach ($chemins as $chemin) {if ($chemin->getAttribute('type') == 'way') { //écarter le noeud centrale$chemin_id = $this->proteger($chemin->getAttribute('ref'));$role = $this->proteger($chemin->getAttribute('role'));//role: null, inner, outer, exclave et enclave.$this->relation_a_chemins[] = array($relation_id, $chemin_id, $role);}}$commune_nom = null;$commune_insee = null;$tags = $relation->getElementsByTagName('tag');foreach ($tags as $tag) {$tag_cle = $tag->getAttribute('k');$tag_val = $tag->getAttribute('v');switch ($tag_cle) {case 'name' :$commune_nom = $this->proteger($tag_val);break;case 'ref:INSEE' :$commune_insee = $this->proteger($tag_val);break;}if (!is_null($commune_nom) && !is_null($commune_insee)) {$this->relations_communes[] = array($relation_id, $commune_nom, $commune_insee);if (!isset($this->communes[$commune_insee])) {$this->communes[$commune_insee] = $relation_id;} else {$e = "La relation #%s contient déjà le tag ref:INSEE avec la valeur %s."."Veuillez corriger la carte OSM.";$this->traiterErreur($e, array($this->communes[$commune_insee], $commune_insee, $relation_id));}break;}}}/*** Récupère l'id_way et tous les id_node de chaque way et remplie la table `osm_chemin_a_noeuds`*/private function analyserWay($way) {$chemin_id = $this->proteger($way->getAttribute('id'));$ordre = 0;$noeuds = $way->getElementsByTagName('nd');$chemin_a_noeuds = array();foreach ($noeuds as $noeud) {$noeud_id = $this->proteger($noeud->getAttribute('ref'));$ordre++;$this->chemin_a_noeuds[] = array($chemin_id, $noeud_id, $ordre);}}/*** Fonction qui récupère tous les l'id_node et les valeurs(Lat/Lon) correspondantes et remplie la table `osm_noeuds`*/private function analyserNode($node) {$noeud_id = $this->proteger($node->getAttribute('id'));$lat = $this->proteger($node->getAttribute('lat'));$lon = $this->proteger($node->getAttribute('lon'));$this->noeuds[] = array($noeud_id, $lat, $lon);}private function insererRelationsCommunes() {$requete = 'INSERT INTO osm_relations (id_relation, nom, code_insee) '.'VALUES '.$this->creerValuesMultiple($this->relations_communes);$this->inserer($requete);$this->relations_communes = array();}private function insererRelationAChemins() {$requete = 'INSERT INTO osm_relation_a_chemins (id_relation, id_chemin, role) '.'VALUES '.$this->creerValuesMultiple($this->relation_a_chemins);$this->inserer($requete);$this->relation_a_chemins = array();}private function insererCheminANoeuds() {$requete = 'INSERT INTO osm_chemin_a_noeuds (id_chemin, id_noeud, ordre) '.'VALUES '.$this->creerValuesMultiple($this->chemin_a_noeuds);$this->inserer($requete);$this->chemin_a_noeuds = array();}private function insererNoeuds() {$requete = 'INSERT INTO osm_noeuds (id_noeud, lat, `long`) '.'VALUES '.$this->creerValuesMultiple($this->noeuds);$this->inserer($requete);$this->noeuds = array();}/*** Fonction qui rajoute l'ordre et le sens de chaque way d'une relation dans la table `osm_relation_a_chemins`* ALGO:* -On fait un select de toutes les ways d'une relation.* -On fait un count sur le tableau ways resutlant.* -On met l'ordre du premier Way à 0.* -On met : Actuelway = id_premier_way* -Select dans table nodes, les nodes du way actuel* -On prend le dernier noeud* -On met : ActuelNoeud = id_dernier_noeud* -Boucle for (i = 0; i < count(tabeau_way); i++) { sur le nombre de ways* -On sélectionne id_way suivant qui contient le dernier_noeud du précédent* (En écartant l'id_way déja existant )* -On recherche les noeuds du nouveau way* -On teste sur les extrémités du way précédent(dernier noeud) et suivant(premier noeud)* -si égalité: $nombrePolygone=1;* -sens:directe* -ordre++* -ActuelNoeud = id_dernier_noeud* sinon* -sens:indirecte* -ordre++* -ActuelNoeud = id_premier_noeud* }*/private function ordonnerWays() {$requete = 'SELECT DISTINCT id_relation '.'FROM osm_relation_a_chemins ';$relations = $this->bdd->recupererTous($requete);foreach ($relations as $relation) {$idRelation = $relation['id_relation'];$requete = 'SELECT id_chemin '.'FROM osm_relation_a_chemins '."WHERE id_relation = $idRelation";$ways = $this->bdd->recupererTous($requete);$nombreWays = count($ways);// premier élément du tableau$idPremierWay = $ways[0]['id_chemin'];$wayActuel = $idPremierWay;$requete = 'UPDATE osm_relation_a_chemins '.'SET ordre = 0, sens = "directe" '."WHERE id_relation = $idRelation "."AND id_chemin = $wayActuel ";$this->inserer($requete);// selection dernier noeud$requete = 'SELECT id_noeud '.'FROM osm_chemin_a_noeuds '."WHERE id_chemin = $wayActuel ORDER BY ordre";$nodes = $this->bdd->recupererTous($requete);$nombreNodes = count($nodes);$dernierNoeud = $nodes[$nombreNodes - 1]['id_noeud'];$noeudActuel = $dernierNoeud;for ($ordre = 1; $ordre < $nombreWays; $ordre++) {//selectionner le way qui possède le dernier noeud du précédent way et écarter l'actuel$requete = 'SELECT WN.id_chemin '.'FROM osm_relation_a_chemins AS RW LEFT JOIN osm_chemin_a_noeuds AS WN ON (RW.id_chemin = WN.id_chemin) '."WHERE WN.id_noeud = $noeudActuel "."AND WN.id_chemin != $wayActuel "."AND RW.id_relation = $idRelation ";$ways = $this->bdd->recupererTous($requete);if (isset($ways[0])) {$wayActuel = $ways[0]['id_chemin'];$requete = 'SELECT id_noeud '.'FROM osm_chemin_a_noeuds '."WHERE id_chemin = $wayActuel ORDER BY ordre ";$nodes = $this->bdd->recupererTous($requete);$nombreNodes = count($nodes);if ( strcmp($nodes[0]['id_noeud'], $noeudActuel ) == 0 ) {$requete = 'UPDATE osm_relation_a_chemins '."SET ordre = '$ordre', sens = 'directe' "."WHERE id_relation = $idRelation "."AND id_chemin = $wayActuel ";$this->inserer($requete);$noeudActuel = $nodes[$nombreNodes-1]['id_noeud'];} else {$requete = 'UPDATE osm_relation_a_chemins '."SET ordre = '$ordre', sens = 'indirecte' "."WHERE id_relation = $idRelation "."AND id_chemin = $wayActuel";$this->inserer($requete);$noeudActuel = $nodes[0]['id_noeud'];}}}}}/*** 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`*/private function remplirPolygone() {$polygone = array();$idNodes = array();$String = '';$requete = 'SELECT id_relation, nom, code_insee FROM osm_relations ';$relations = $this->bdd->recupererTous($requete);foreach ($relations as $relation) {$idCommune = $relation['id_relation'];$nomCommune = $relation['nom'];$INSEE = $relation['code_insee'];$requete = 'SELECT id_chemin FROM osm_relation_a_chemins '."WHERE id_relation = $idCommune ".'ORDER BY ordre';$ways = $this->bdd->recupererTous($requete);foreach ($ways as $way) {$idWay = $way['id_chemin'];$requeteSensWay= "SELECT sens FROM osm_relation_a_chemins WHERE id_relation = $idCommuneAND id_chemin = $idWay";$sens = $this->bdd->recupererTous($requeteSensWay);$requeteNodes = "SELECT id_noeud FROM osm_chemin_a_noeuds WHERE id_chemin= $idWay ORDER BY ordre ";$nodes = $this->bdd->recupererTous($requeteNodes);if($sens[0]['sens'] == "directe") {foreach ($nodes as $node) {$idNodes[] = $node['id_noeud'];}$noeuds = implode(", ", $idNodes);//requête IN qui gère l'ordre des noeuds de chaque way (CAS ASC)$requeteLatitudeLongitude = 'SELECT NLL.id_noeud, NLL.lat, NLL.`long` '.'FROM osm_chemin_a_noeuds WN, osm_noeuds NLL '."WHERE NLL.id_noeud IN ($noeuds) ".'AND WN.id_noeud = NLL.id_noeud '."AND WN.id_chemin = $idWay ORDER BY WN.ordre ASC";unset($noeuds);unset($idNodes);$LatLons = $this->bdd->recupererTous($requeteLatitudeLongitude);foreach ($LatLons as $LatLon) {$Latitude = $LatLon['lat'];$Longitude = $LatLon['long'];$String = "$Latitude $Longitude";$polygone[] = $String;}} else {foreach ($nodes as $node) {$idNodes[] = $node['id_noeud'];}$noeuds = implode(", ", $idNodes);//requête IN qui gère l'ordre des noeuds de chaque way (CAS DESC)$requeteLatitudeLongitude = 'SELECT NLL.id_noeud, NLL.lat, NLL.`long` '.'FROM osm_chemin_a_noeuds WN ,osm_noeuds NLL '."WHERE NLL.id_noeud IN ($noeuds) ".'AND WN.id_noeud = NLL.id_noeud '."AND WN.id_chemin = $idWay ORDER BY WN.ordre DESC";unset($noeuds);unset($idNodes);$LatLons = $this->bdd->recupererTous($requeteLatitudeLongitude);foreach ($LatLons as $LatLon) {$Latitude = $LatLon['lat'];$Longitude = $LatLon['long'];$String = "$Latitude $Longitude";$polygone[] = $String;}}}$this->etatPolygone($polygone, $idCommune, $nomCommune, $INSEE);unset($separationVirgule);unset($requeteNodes);unset($String);unset($polygone);}}private function etatPolygone($polygone, $idCommune, $nomCommune, $INSEE) {$separationVirgulePolygone = implode(', ', $polygone);$nomCommuneProtege = $this->bdd->proteger($nomCommune);$InseeProtege = $this->bdd->proteger($INSEE);if ($polygone[0] == $polygone[count($polygone)-1]) { //test sur début et fin du polygone//requête replace pour gérer la mise à jour à la suite$requete = 'REPLACE INTO osm_communes (id_relation, nom, code_insee, polygon, note ) '."VALUES ($idCommune, $nomCommuneProtege, $InseeProtege, "."POLYFROMTEXT('MULTIPOLYGON ((($separationVirgulePolygone)))'),'Polygone complet');";} else {$requete = 'REPLACE INTO osm_communes (id_relation, nom, code_insee, polygon, note ) '."VALUES ($idCommune, $nomCommuneProtege, $InseeProtege, "."POLYFROMTEXT('MULTIPOLYGON ((($separationVirgulePolygone)))'),'Polygone incomplet');";}$this->inserer($requete);}//Fonction qui remet à zéro l'ordre des ways des communes des polygones incomplets fait précédementprivate function remettreOrdreAZero() {$requeteRelations = "SELECT id_relation FROM osm_communes WHERE note LIKE 'Polygone incomplet'";$relations = $this->bdd->recupererTous($requeteRelations);foreach ($relations as $relation) {$idRelation = $relation['id_relation'];$requeteWays = "SELECT id_chemin FROM osm_relation_a_chemins WHERE id_relation= $idRelation";$ways = $this->bdd->recupererTous($requeteWays);foreach ($ways as $way) {$idWay = $way['id_chemin'];$this-> inserer('UPDATE osm_relation_a_chemins SET ordre = NULL '."WHERE id_relation = $idRelation AND id_chemin = $idWay ;");}}}/*** Fonction qui récupère les relations des polygones incomplets et appelle pour chaque relation la fonction* ordonnerPolygoneIncomplet($ordre,$tour,$idRelation,$nombrePolygone)*/private function relationsPolygoneIncomplet($ordre, $tour) {$nombrePolygone = 1;$requeteRelations = "SELECT id_relation FROM osm_communes WHERE note LIKE 'Polygone incomplet'";$relations = $this->bdd->recupererTous($requeteRelations);foreach ($relations as $relation) {$nombrePolygone = 1;$idRelation = $relation['id_relation'];$this->ordonnerPolygoneIncomplet($ordre,$tour,$idRelation,$nombrePolygone);}}/*** Fonction récursive qui exécute la même tâche que la fonction ordonnerWays() pour chaque polygone d'un* multipolygone et remplie le champ NbPoly dans la table `osm_relation_a_chemins` qui correspond au nombre de polygone fermé* dans le multipolygone*/private function ordonnerPolygoneIncomplet($ordre, $tour, $idRelation, $nombrePolygone) {$requeteWays = 'SELECT id_chemin FROM osm_relation_a_chemins '."WHERE id_relation = $idRelation AND ordre = 'NULL'";$ways = $this->bdd->recupererTous($requeteWays);$tempWays = $ways;$nombreWays = count($ways);// premier élément du tableau$idPremierWay = $ways[0]['id_chemin'];$wayActuel = $idPremierWay;$this-> inserer('UPDATE osm_relation_a_chemins '."SET ordre = $ordre, sens = 'directe', nbre_poly = $nombrePolygone "."WHERE id_relation = $idRelation "."AND id_chemin = $wayActuel ;");//selection dernier noeud$requeteNodes = "SELECT id_noeud FROM osm_chemin_a_noeuds WHERE id_chemin = $wayActuel ORDER BY ordre;";$nodes = $this->bdd->recupererTous($requeteNodes);$nombreNodes = count($nodes);$premierNoeud = $nodes[0]['id_noeud'];$dernierNoeud = $nodes[$nombreNodes-1]['id_noeud'];$noeudActuel = $dernierNoeud;$tour++;//Condition pour laquelle la boucle while continue à tourner; tant que le premier noeud du polygone n'est//égale au dernier et tant qu'il reste des ways à gérerwhile (($premierNoeud != $noeudActuel) && (($ordre % 1000) < count($tempWays))) {//select le way qui possède le dernier noeud du précédent way et écarter l'actuel$nombrePolygone;$ordre++;//select des ways qui n'ont pas été ordonnés: on obtient à chaque itération les ways qui restent à ordonner$requeteWays = 'SELECT WN.id_chemin FROM (osm_chemin_a_noeuds WN, osm_relation_a_chemins RW) '."WHERE WN.id_noeud = $noeudActuel AND WN.id_chemin != $wayActuel "."AND RW.id_chemin = WN.id_chemin AND RW.id_relation = $idRelation "."AND RW.ordre = 'NULL' ;";$ways = $this->bdd->recupererTous($requeteWays);if (isset($ways[0])) {$wayActuel = $ways[0]['id_chemin'];$requeteNodes = "SELECT id_noeud FROM osm_chemin_a_noeuds WHERE id_chemin = $wayActuel ORDER BY ordre;";$nodes = $this->bdd->recupererTous($requeteNodes);$nombreNodes = count($nodes);if (strcmp($nodes[0]['id_noeud'], $noeudActuel ) == 0) {$this-> inserer("UPDATE osm_relation_a_chemins SET ordre = '$ordre', sens = 'directe', "."nbre_poly = $nombrePolygone "."WHERE osm_relation_a_chemins.id_relation = $idRelation "."AND osm_relation_a_chemins.id_chemin = $wayActuel");$noeudActuel = $nodes[$nombreNodes-1]['id_noeud'];} else {$this-> inserer('UPDATE osm_relation_a_chemins '."SET ordre = '$ordre', sens = 'indirecte', "."nbre_poly = $nombrePolygone "."WHERE id_relation = $idRelation "."AND id_chemin = $wayActuel");$noeudActuel = $nodes[0]['id_noeud'];}}}$ordre = 1000 * $tour; //différencier chaque polygone: pour chaque polygone on a un multiple de mille$requeteCount = "SELECT ordre FROM osm_relation_a_chemins WHERE id_relation = $idRelation AND ordre = 0";$count = $this->bdd->recupererTous($requeteCount);if ((count($count)) != 0) { // s'ils en restent des ways à gérer$nombrePolygone++;//appelle de la fonction récursive$this->ordonnerPolygoneIncomplet($ordre, $tour, $idRelation, $nombrePolygone);}}/*** Fonction qui récupère les relations des polygones incomplets et appelle pour chaque relation la fonction* remplirPolygoneIncomplet($idRelation);*/private function remplirCommunesPolygoneIncomplet() {$nombrePolygone = 1;$requeteRelations = "SELECT id_relation FROM osm_communes WHERE note LIKE 'Polygone incomplet'";$relations = $this->bdd->recupererTous($requeteRelations);foreach ($relations as $relation) {$idRelation = $relation['id_relation'];$this->remplirPolygoneIncomplet($idRelation);//appel de la fonction avec comme paramètre ID-commune}}/*** Fonction qui exécute la même tâche que la fonction remplirPolygone() pour chaque polygone d'un multipolygone* et renvoie un tableau MultiPolygone[] où chaque case contient un polygone fermé et appelle la fonction* etatMultiPolygone($multiPolygone, $idCommune) qui remplie le Multipolygone de la commune correspondante*/private function remplirPolygoneIncomplet($idCommune) {$polygone = array();$multiPolygone = array();//tableau multipolygone qui contient tous les polygones d'un multipolygone$idNodes = array();$roles = array();//tableau roles qui contient les roles des ways$String = "";//sélectionner le nombre de polygones qui existe dans un multipolygone$requete = 'SELECT MAX(nbre_poly) AS nbre_poly '.'FROM osm_relation_a_chemins '."WHERE id_relation = $idCommune";$nombrePolygone = $this->bdd->recupererTous($requete);$nbPoly = $nombrePolygone[0]['nbre_poly'];for ($tour = 1; $tour <= $nbPoly; $tour++) {//boucle for qui parcourt chaque polygone du multipolygone$requeteWays = 'SELECT id_chemin FROM osm_relation_a_chemins '."WHERE id_relation = $idCommune "."AND nbre_poly = $tour ORDER BY ordre";$ways = $this->bdd->recupererTous($requeteWays);foreach ($ways as $way) {$idWay = $way['id_chemin'];$requeteSensWay = 'SELECT sens FROM osm_relation_a_chemins '."WHERE id_relation = $idCommune "."AND id_chemin = $idWay";//sélection de l'orientation du way$sens= $this->bdd->recupererTous($requeteSensWay);$requeteNodes = "SELECT id_noeud FROM osm_chemin_a_noeuds WHERE id_chemin= $idWay ORDER BY ordre";$nodes = $this->bdd->recupererTous($requeteNodes);if ($sens[0]['sens'] == "directe") {//test sur le sens des waysforeach ($nodes as $node) {$idNodes[] = $node['id_noeud'];}$noeuds = implode(", ", $idNodes);//requête IN qui gère l'ordre des noeuds de chaque way (CAS ASC)$requeteLatitudeLongitude = 'SELECT NLL.id_noeud, NLL.lat, NLL.`long` '.'FROM osm_chemin_a_noeuds WN, osm_noeuds NLL '."WHERE NLL.id_noeud IN ($noeuds) ".'AND WN.id_noeud = NLL.id_noeud '."AND WN.id_chemin= $idWay ORDER BY WN.ordre ASC";unset($noeuds);unset($idNodes);$LatLons = $this->bdd->recupererTous($requeteLatitudeLongitude);foreach ($LatLons as $LatLon) {$Latitude = $LatLon['lat'];$Longitude = $LatLon['long'];$String = "$Latitude $Longitude";$polygone[] = $String;}} else {foreach ($nodes as $node) {$idNodes[] = $node['id_noeud'];}$noeuds = implode(", ", $idNodes);//requête IN qui gère l'ordre des noeuds de chaque way (CAS DESC)$requeteLatitudeLongitude = 'SELECT NLL.id_noeud, NLL.lat, NLL.`long` '.'FROM osm_chemin_a_noeuds WN, osm_noeuds NLL '."WHERE NLL.id_noeud IN ($noeuds) ".'AND WN.id_noeud = NLL.id_noeud '."AND WN.id_chemin= $idWay ORDER BY WN.ordre DESC";unset($noeuds);unset($idNodes);$LatLons = $this->bdd->recupererTous($requeteLatitudeLongitude);foreach ($LatLons as $LatLon) {$Latitude = $LatLon['lat'];$Longitude = $LatLon['long'];$String = "$Latitude $Longitude";$polygone[] = $String;}}}$requeteRole = 'SELECT DISTINCT role '.'FROM osm_relation_a_chemins '."WHERE id_relation = $idCommune "."AND nbre_poly = $tour ";$role = $this->bdd->recupererTous($requeteRole);$role = $role[0]['role'];$separationVirgulePolygone = implode(", ", $polygone);$multiPolygone[] = $separationVirgulePolygone;$roles[] = $role;unset($separationVirgulePolygone);unset($polygone);}$this->etatMultiPolygone($multiPolygone, $roles, $idCommune, $nbPoly);//appel de la fonction de remplissage}/*** Remplie le champ polygone à partir du tableau MultiPolygone*/private function etatMultiPolygone($multiPolygone, $roles, $idCommune, $nbPoly) {$note = $this->proteger('Polygone complet');if ($nbPoly == 2 && ((in_array('inner', $roles)) || (in_array('enclave', $roles)))) {//cas Outer Inner à deux polygones$multiPoly = implode('),(', $multiPolygone);$requete = 'UPDATE osm_communes '."SET polygon = MPOLYFROMTEXT('MULTIPOLYGON((($multiPoly)))'), "."note = $note "."WHERE id_relation = $idCommune ";$this->inserer($requete);}if ((in_array('inner', $roles)) || (in_array('enclave', $roles)) != 1) { //tous les autres cas$multiPoly = implode(')),((', $multiPolygone);$requete = 'UPDATE osm_communes '."SET polygon = MPOLYFROMTEXT('MULTIPOLYGON((($multiPoly)))'), "."note = $note "."WHERE id_relation = $idCommune ";$this->inserer($requete);}}/*** Renomme la note des polygones vides d'un polygone complet en polygone incomplet*/private function renommerEnPolygoneIncomplet() {$requete = 'SELECT id_relation, ASTEXT(polygon) AS poly '.'FROM osm_communes ';$etatPolygones = $this->bdd->recupererTous($requete);foreach ($etatPolygones as $etatPolygone ) {if (isset($etatPolygone['poly']) == 0) {//test si le polygone est vide$idCommune = $this->proteger($etatPolygone['id_relation']);$note = $this->proteger('Polygone incomplet');$requete = 'UPDATE osm_communes '."SET note = $note "."WHERE id_relation = $idCommune ";$this->inserer($requete);}}}/*** Récupère le point centre de chaque polygone et remplie la colonne "centre"*/private function centroid() {$requete = 'SELECT id_relation, ASTEXT(polygon) AS poly '.'FROM osm_communes ';$communes = $this->bdd->recupererTous($requete);foreach ($communes as $commune) {$multipolygone = $commune['poly'];$requete = "SELECT ASTEXT(CENTROID(MPOLYFROMTEXT('$multipolygone'))) AS centre ";$point = $this->bdd->recupererTous($requete);$centre = $this->proteger($point[0]['centre']);$idCom = $this->proteger($commune['id_relation']);$requete = 'UPDATE osm_communes '."SET centre = POINTFROMTEXT($centre) "."WHERE id_relation = $idCom ";$this->inserer($requete);}}private function creerValuesMultiple($donnees) {$values = array();foreach ($donnees as $donnee) {$values[] = implode(',', $donnee);}$values_chaine = '('.implode('),(', $values).')';return $values_chaine;}private function inserer($requete) {$this->bdd->requeter($requete);}private function proteger($chaine) {return $this->bdd->proteger($chaine);}}?>