Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 1038 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1038 Rev 1046
1
<?php
1
<?php
2
/**
2
/**
-
 
3
 * Permet de mettre à jour les contours à partir d'un fichier de diff.
-
 
4
 *
3
 * Exemple lancement:
5
 * Exemple de lancement du script :
4
 * /opt/lampp/bin/php -d memory_limit=3500M /home/mohcen/web/cartoOSM/scripts/cli.php osm/mise_a_jour -a recupererRelationAMod
6
 * /opt/lampp/bin/php -d memory_limit=3500M cli.php osm -a maj -f fichier_osm_change -e fichier_osm_nouveau
5
 * -f fichier_osm_change -e fichier_osm_nouveau
-
 
6
*/
7
 */
7
class MiseAjour extends Script {
8
class MiseAJour {
-
 
9
	private $conteneur;
-
 
10
	private $bdd;
-
 
11
	private $messages;
-
 
12
	private $mode;
-
 
13
 
8
	private $communes = array();
14
	private $communes = array();
9
	private $relations_communes = array();
15
	private $relations_communes = array();
10
	private $relation_a_chemins = array();
16
	private $relation_a_chemins = array();
11
	private $chemin_a_noeuds = array();
17
	private $chemin_a_noeuds = array();
12
	private $noeuds = array();
18
	private $noeuds = array();
13
	private $pas = 10000;
19
	private $pas = 10000;
14
	private $pas_commune = 1000;
20
	private $pas_commune = 1000;
-
 
21
	private $elementType = '';
15
 
22
 
-
 
23
	public function __construct($conteneur) {
-
 
24
		$this->conteneur = $conteneur;
16
	protected $parametres_autorises = array(
25
		$this->bdd = $this->conteneur->getBdd();
-
 
26
		$this->messages = $this->conteneur->getMessages();
-
 
27
		$this->mode = $this->conteneur->getParametre('m');
-
 
28
	}
-
 
29
 
-
 
30
	/**
-
 
31
	 * Fonction qui parcourt tous les ways les noeuds de chaque relation en prenant en considération l'ordre et
-
 
32
	 * le sens de chaque ways concaténés ensemble (séparés par des virgules). Update du champ polygone de chaque
17
	'-f' => array(true, null, 'Chemin du fichier osm à analyser'));
33
	 * relation dans la table `osm_relations`
18
 
-
 
19
	public function executer() {
-
 
20
		$this->bdd = new Bdd();
34
	 */
21
 
35
	public function executer() {
22
		// Lancement de l'action demandée
36
		// Lancement de l'action demandée
23
		$cmd = $this->getParametre('a');
37
		$cmd = $this->conteneur->getParametre('a');
24
	    switch ($cmd) {
38
		switch ($cmd) {
25
			case 'MAJ' :
39
			case 'maj' :
26
				$this->MettreAjour();
40
				$this->mettreAjour();
27
				break;
41
				break;
-
 
42
			default :
-
 
43
				$msgTpl = "Erreur : la commande '%s' n'est pas prise en compte par la classe %s !";
28
				default :
44
				$msg = sprintf($msgTpl, $cmd, get_class($this));
29
				$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
-
 
-
 
45
				throw new Exception($msg);
30
		}
46
		}
31
    }
47
		print "\n";// Pour ramener à la ligne en fin de script
32
 
48
	}
33
 
49
 
34
	/**
50
	/**
35
	 * Fonction permettant de traiter et d'analyser le fichier de différence et de mettre  à jour la base de données
51
	 * Fonction permettant de traiter et d'analyser le fichier de différence et de mettre  à jour la base de données
36
	 * en tenant compte des trois cas:Suppression, Création ,modification
52
	 * en tenant compte des trois cas:Suppression, Création ,modification
37
	*/
53
	*/
38
	private function MettreAjour() {
54
	private function mettreAjour() {
39
		$lecteur = new XMLReader();
55
		$lecteur = $this->getLecteurXml();
40
		if ($lecteur->open($this->getParametre('f'))) {
-
 
41
			$dom = new DomDocument();
-
 
42
			while ($lecteur->read()) {
56
		while ($lecteur->read()) {
43
				if ($lecteur->nodeType == XMLREADER::ELEMENT) {
57
			if ($lecteur->nodeType == XMLREADER::ELEMENT) {
44
					if ($lecteur->localName == 'create') {
-
 
45
						$creations = $lecteur->expand();
58
				$this->elementType = $lecteur->localName;
46
						$this->	analyserCreations($creations);
59
				$this->analyserElementXml($lecteur->localName, $lecteur->expand());
47
					}
60
			}
48
					if ($lecteur->localName == 'modify') {
-
 
49
						$modifications = $lecteur->expand();
-
 
50
						$this->	analyserModifications($modifications);
-
 
51
					}
61
 
52
					if ($lecteur->localName == 'delete') {
62
			if ($this->mode == 'manuel') {
53
						$suppressions = $lecteur->expand();
-
 
54
						$this->	analyserSuppressions($suppressions);
63
				$this->messages->afficherAvancement("Analyse de la ligne du fichier de diff OSM : ", 1);
55
					}
-
 
56
				}
-
 
57
			}
64
			}
58
		} else {
-
 
59
			$e = "Impossible d'ouvrir le fichier osm : %s";
-
 
60
			$this->traiterErreur($e, array($this->getParametre('f')));
-
 
61
		}
65
		}
62
	}
66
	}
-
 
67
 
-
 
68
	private function getLecteurXml() {
-
 
69
		$fichierOsm = $this->conteneur->getParametre('f');
-
 
70
		$lecteur = new XMLReader();
-
 
71
		$ouvertureXmlOk = $lecteur->open($fichierOsm);
-
 
72
		if ($ouvertureXmlOk === false) {
-
 
73
			$msgTpl = "Impossible d'ouvrir le fichier osm : %s";
-
 
74
			$msg = sprintf($msgTpl, $this->conteneur->getParametre('f'));
63
 
75
			new Exception($msg);
64
	/**
76
		}
65
	 * Fonction permettant le traitement du cas création concernant les relations, ways et les noeuds.
77
		return $lecteur;
-
 
78
	}
66
	 */
79
 
67
	private function analyserCreations($creations) {
80
	private function analyserElementXml($noeudDom) {
68
		$relations = $creations->getElementsByTagName('relation');
81
		$relations = $noeudDom->getElementsByTagName('relation');
69
		foreach ($relations as $relation) {
82
		if ($relations->length > 0) {
70
			$this-> analyserRelation($relation);
-
 
71
			if (count($this->relation_a_chemins) > $this->pas) {
83
			foreach ($relations as $relation) {
72
				$this->insererRelationAChemins();
-
 
73
			}
-
 
74
			if (count($this->relations_communes) > $this->pas_commune) {
84
				$this->analyserRelation($relation);
75
				$this->insererRelationsCommunes();
85
				$this->traiterRelations();
76
			}
86
			}
-
 
87
		}
77
		}
88
 
-
 
89
		$ways = $creations->getElementsByTagName('way');
78
		$ways = $creations->getElementsByTagName('way');
90
		if ($ways->length > 0) {
79
		foreach ($ways as $way) {
91
			foreach ($ways as $way) {
80
			$this->analyserWay($way);
-
 
81
			if (count($this->chemin_a_noeuds) > $this->pas) {
92
				$this->analyserWay($way);
82
				$this->insererCheminANoeuds();
93
				$this->traiterCheminANoeuds();
83
			}
94
			}
-
 
95
		}
84
		}
96
 
-
 
97
		$noeuds = $creations->getElementsByTagName('node');
85
		$noeuds = $creations->getElementsByTagName('node');
98
		if ($noeuds->length > 0) {
86
		foreach ($noeuds as $noeud) {
99
			foreach ($noeuds as $noeud) {
87
			$this->analyserNode($noeud);
-
 
88
			if (count($this->noeuds) > $this->pas) {
100
				$this->analyserNode($noeud);
89
				$this->insererNoeuds();
101
				$this->traiterNoeuds();
90
			}
102
			}
91
		}
-
 
-
 
103
		}
92
		$this->insererRelationsCommunes();
104
 
93
		$this->insererRelationAChemins();
-
 
94
		$this->insererCheminANoeuds();
-
 
95
		$this->insererNoeuds();
105
		$this->traiterElementsOrphelins();
96
	}
-
 
97
 
-
 
98
	/**
-
 
99
	 * Fonction permettant le traitement du cas modification concernant les relations, ways et les noeuds.
106
	}
100
	 */
107
 
101
	private function analyserModifications($modifications) {
108
	private function traiterRelations() {
-
 
109
		if (count($this->relation_a_chemins) > $this->pas) {
102
		$relations = $modifications->getElementsByTagName('relation');
110
			switch ($this->elementType) {
-
 
111
				case 'create' :
103
		foreach ($relations as $relation) {
112
					$this->insererRelationAChemins();
104
			$this-> analyserRelation($relation);
113
					break;
105
			if (count($this->relation_a_chemins) > $this->pas) {
114
				case 'modify' :
106
				$this->modifierRelationAChemins();
115
					$this->modifierRelationAChemins();
107
			}
116
					break;
-
 
117
				case 'delete' :
108
			if (count($this->relations_communes) > $this->pas_commune) {
118
					$this->supprimerRelationAChemins();
109
				$this->modifierRelationsCommunes();
119
					break;
110
			}
120
			}
111
		}
121
		}
-
 
122
		if (count($this->relations_communes) > $this->pas_commune) {
112
		$ways = $modifications->getElementsByTagName('way');
123
			switch ($this->elementType) {
-
 
124
				case 'create' :
-
 
125
					$this->insererRelationsCommunes();
113
		foreach ($ways as $way) {
126
					break;
-
 
127
				case 'modify' :
-
 
128
					$this->modifierRelationsCommunes();
114
			$this->analyserWay($way);
129
					break;
-
 
130
				case 'delete' :
115
			if (count($this->chemin_a_noeuds) > $this->pas) {
131
					$this->supprimerRelationsCommunes();
116
				$this->modifierCheminANoeuds();
132
					break;
-
 
133
			}
-
 
134
		}
-
 
135
	}
117
			}
136
 
118
		}
137
	private function traiterChemins() {
-
 
138
		if (count($this->chemin_a_noeuds) > $this->pas) {
119
		$noeuds = $modifications->getElementsByTagName('node');
139
			switch ($this->elementType) {
-
 
140
				case 'create' :
-
 
141
					$this->insererCheminANoeuds();
120
		foreach ($noeuds as $noeud) {
142
					break;
-
 
143
				case 'modify' :
-
 
144
					$this->modifierCheminANoeuds();
121
			$this->analyserNode($noeud);
145
					break;
-
 
146
				case 'delete' :
122
			if (count($this->noeuds) > $this->pas) {
147
					$this->supprimerCheminANoeuds();
123
				$this->modifierNoeuds();
148
					break;
124
			}
-
 
125
		}
-
 
126
		$this->modifierRelationsCommunes();
-
 
127
		$this->modifierRelationAChemins();
-
 
128
		$this->modifierCheminANoeuds();
149
			}
129
		$this->modifierNoeuds();
-
 
130
	}
150
		}
131
 
-
 
132
	/**
151
	}
133
	 * Fonction permettant le traitement du cas suppression concernant les relations, ways et les noeuds.
152
 
134
	 */
153
	private function traiterNoeuds() {
135
	private function analyserSuppressions($suppressions) {
154
		if (count($this->noeuds) > $this->pas) {
-
 
155
			switch ($this->elementType) {
136
		$relations = $suppressions->getElementsByTagName('relation');
156
				case 'create' :
137
		foreach ($relations as $relation) {
157
					$this->insererNoeuds();
138
			$this-> analyserRelation($relation);
158
					break;
139
			if (count($this->relation_a_chemins) > $this->pas) {
159
				case 'modify' :
140
				$this->supprimerRelationAChemins();
160
					$this->modifierNoeuds();
-
 
161
					break;
141
			}
162
				case 'delete' :
142
			if (count($this->relations_communes) > $this->pas_commune) {
163
					$this->supprimerNoeuds();
-
 
164
					break;
-
 
165
			}
143
				$this->supprimerRelationsCommunes();
166
		}
144
			}
167
	}
-
 
168
 
-
 
169
	private function traiterElementsOrphelins() {
-
 
170
		switch ($this->elementType) {
-
 
171
			case 'create' :
145
		}
172
				$this->insererRelationsCommunes();
-
 
173
				$this->insererRelationAChemins();
-
 
174
				$this->insererCheminANoeuds();
-
 
175
				$this->insererNoeuds();
146
		$ways = $suppressions->getElementsByTagName('way');
176
				break;
-
 
177
			case 'modify' :
-
 
178
				$this->modifierRelationsCommunes();
-
 
179
				$this->modifierRelationAChemins();
-
 
180
				$this->modifierCheminANoeuds();
-
 
181
				$this->modifierNoeuds();
-
 
182
				break;
147
		foreach ($ways as $way) {
183
			case 'delete' :
148
			$this->analyserWay($way);
-
 
149
			if (count($this->chemin_a_noeuds) > $this->pas) {
-
 
150
				$this->supprimerCheminANoeuds();
-
 
151
			}
-
 
152
		}
-
 
153
		$noeuds = $suppressions->getElementsByTagName('node');
-
 
154
		foreach ($noeuds as $noeud) {
184
				$this->supprimerRelationsCommunes();
155
			$this->analyserNode($noeud);
185
				$this->supprimerRelationAChemins();
156
			if (count($this->noeuds) > $this->pas) {
186
				$this->supprimerCheminANoeuds();
157
				$this->supprimerNoeuds();
-
 
158
			}
-
 
159
		}
-
 
160
		$this->supprimerRelationsCommunes();
-
 
161
		$this->supprimerRelationAChemins();
187
				$this->supprimerNoeuds();
162
		$this->supprimerCheminANoeuds();
-
 
163
		$this->supprimerNoeuds();
188
				break;
164
	}
189
		}
165
 
190
	}
166
 
191
 
167
	/**
192
	/**
168
	 * Récupère l'id commune, nom commune et le code INSEE et remplie la table `osm_relations`
193
	 * Récupère l'id commune, nom commune et le code INSEE et remplie la table `osm_relations`
169
	 */
194
	 */
170
	private function analyserRelation($relation) {
195
	private function analyserRelation($relation) {
171
		$relation_id = $this->proteger($relation->getAttribute('id'));
196
		$relation_id = $relation->getAttribute('id');
172
		$chemins = $relation->getElementsByTagName('member');
197
		$chemins = $relation->getElementsByTagName('member');
173
		foreach ($chemins as $chemin) {
198
		foreach ($chemins as $chemin) {
174
			if ($chemin->getAttribute('type') == 'way') { //écarter le noeud centrale
199
			if ($chemin->getAttribute('type') == 'way') { //écarter le noeud centrale
175
				$chemin_id = $this->proteger($chemin->getAttribute('ref'));
200
				$chemin_id = $chemin->getAttribute('ref');
176
				$role = $this->proteger($chemin->getAttribute('role'));//role: null, inner, outer, exclave et enclave.
201
				$role = $chemin->getAttribute('role');//role: null, inner, outer, exclave et enclave.
177
				$this->relation_a_chemins[] = array($relation_id, $chemin_id, $role);
202
				$this->relation_a_chemins[] = array($relation_id, $chemin_id, $role);
178
			}
203
			}
179
		}
204
		}
-
 
205
 
-
 
206
		$tags = $relation->getElementsByTagName('tag');
-
 
207
		if ($tags->length > 0) {
-
 
208
			$this->analyserTags($relation_id, $tags);
-
 
209
		}
-
 
210
	}
-
 
211
 
-
 
212
	private function analyserTags($relation_id, $tags) {
180
		$commune_nom = null;
213
		$commune_nom = null;
181
		$commune_insee = null;
214
		$commune_insee = null;
182
		$tags = $relation->getElementsByTagName('tag');
-
 
183
		foreach ($tags as $tag) {
215
		foreach ($tags as $tag) {
184
			$tag_cle = $tag->getAttribute('k');
216
			$tag_cle = $tag->getAttribute('k');
185
			$tag_val = $tag->getAttribute('v');
217
			$tag_val = $tag->getAttribute('v');
186
			switch ($tag_cle) {
218
			switch ($tag_cle) {
187
				case 'name' :
219
				case 'name' :
188
					$commune_nom = $this->proteger($tag_val);
220
					$commune_nom = $tag_val;
189
					break;
221
					break;
190
				case 'ref:INSEE' :
222
				case 'ref:INSEE' :
191
					$commune_insee = $this->proteger($tag_val);
223
					$commune_insee = $tag_val;
192
					break;
224
					break;
193
			}
225
			}
194
			if (!is_null($commune_nom) && !is_null($commune_insee)) {
226
			if (!is_null($commune_nom) && !is_null($commune_insee)) {
195
				$this->relations_communes[] = array($relation_id, $commune_nom, $commune_insee);
227
				$this->relations_communes[] = array($relation_id, $commune_nom, $commune_insee);
196
				if (!isset($this->communes[$commune_insee])) {
228
				if (!isset($this->communes[$commune_insee])) {
197
					$this->communes[$commune_insee] = $relation_id;
229
					$this->communes[$commune_insee] = $relation_id;
198
				} else {
230
				} else {
199
					$e = "La relation #%s contient déjà le tag ref:INSEE avec la valeur %s.".
231
					$e = "La relation #%s contient déjà le tag ref:INSEE avec la valeur %s.".
200
						"Veuillez corriger la carte OSM.";
232
						"Veuillez corriger la carte OSM.";
201
					$this->traiterErreur($e, array($this->communes[$commune_insee], $commune_insee, $relation_id));
233
					$this->traiterErreur($e, array($this->communes[$commune_insee], $commune_insee, $relation_id));
202
				}
234
				}
203
				break;
235
				break;
204
			}
236
			}
205
		}
237
		}
206
	}
238
	}
207
 
239
 
208
	/**
240
	/**
209
	 * Récupère l'id_way et tous les id_node de chaque way et remplie la table `osm_chemin_a_noeuds`
241
	 * Récupère l'id_way et tous les id_node de chaque way et remplie la table `osm_chemin_a_noeuds`
210
	 */
242
	 */
211
	private function analyserWay($way) {
243
	private function analyserWay($way) {
212
		$chemin_id = $this->proteger($way->getAttribute('id'));
244
		$chemin_id = $way->getAttribute('id');
213
		$ordre = 0;
-
 
214
		$noeuds = $way->getElementsByTagName('nd');
245
		$noeuds = $way->getElementsByTagName('nd');
215
		$chemin_a_noeuds = array();
246
		$ordre = 0;
216
		foreach ($noeuds as $noeud) {
247
		foreach ($noeuds as $noeud) {
217
			$noeud_id = $this->proteger($noeud->getAttribute('ref'));
248
			$noeud_id = $noeud->getAttribute('ref');
218
			$ordre++;
-
 
219
	    	$this->chemin_a_noeuds[] = array($chemin_id, $noeud_id, $ordre);
249
			$this->chemin_a_noeuds[] = array($chemin_id, $noeud_id, ++$ordre);
220
		}
250
		}
221
	}
251
	}
222
 
252
 
223
	/**
253
	/**
224
	 * Fonction qui récupère tous les l'id_node et les valeurs(Lat/Lon) correspondantes et remplie la table `osm_noeuds`
254
	 * Fonction qui récupère tous les l'id_node et les valeurs(Lat/Lon) correspondantes et remplie la table `osm_noeuds`
225
	 */
255
	 */
226
	private function analyserNode($node) {
256
	private function analyserNode($node) {
227
		$noeud_id = $this->proteger($node->getAttribute('id'));
257
		$this->noeuds[] = array(
228
		$lat = $this->proteger($node->getAttribute('lat'));
258
			$node->getAttribute('id'),
229
		$lon = $this->proteger($node->getAttribute('lon'));
259
			$node->getAttribute('lat'),
230
		$this->noeuds[] = array($noeud_id, $lat, $lon);
260
			$node->getAttribute('lon')
-
 
261
		);
231
	}
262
	}
232
 
263
 
233
	//Insertion des relations
264
	//Insertion des relations
234
	private function insererRelationsCommunes() {
265
	private function insererRelationsCommunes() {
235
		$requete =	'INSERT INTO osm_relations (id_relation, nom, code_insee) '.
266
		$requete = 'INSERT INTO osm_relations (id_relation, nom, code_insee) '.
236
					'VALUES '.$this->creerValuesMultiple($this->relations_communes);
267
			'VALUES '.$this->creerValuesMultiple($this->relations_communes).
-
 
268
			' -- '.__FILE__.' : '.__LINE__;
237
		$this->inserer($requete);
269
		$this->bdd->requeter($requete);
238
		$this->relations_communes = array();
270
		$this->relations_communes = array();
239
	}
271
	}
240
 
272
 
241
	//Insertion des relations à chemins
273
	//Insertion des relations à chemins
242
	private function insererRelationAChemins() {
274
	private function insererRelationAChemins() {
243
		$requete =	'INSERT INTO osm_relation_a_chemins (id_relation, id_chemin, role) '.
275
		$requete = 'INSERT INTO osm_relation_a_chemins (id_relation, id_chemin, role) '.
244
					'VALUES '.$this->creerValuesMultiple($this->relation_a_chemins);
276
			'VALUES '.$this->creerValuesMultiple($this->relation_a_chemins).
-
 
277
			' -- '.__FILE__.' : '.__LINE__;
245
		$this->inserer($requete);
278
		$this->bdd->requeter($requete);
246
		$this->relation_a_chemins = array();
279
		$this->relation_a_chemins = array();
247
	}
280
	}
248
 
281
 
249
	//Insertion des chemins à noeuds
282
	//Insertion des chemins à noeuds
250
	private function insererCheminANoeuds() {
283
	private function insererCheminANoeuds() {
251
		$requete = 	'INSERT INTO osm_chemin_a_noeuds (id_chemin, id_noeud, ordre) '.
284
		$requete = 'INSERT INTO osm_chemin_a_noeuds (id_chemin, id_noeud, ordre) '.
252
					'VALUES '.$this->creerValuesMultiple($this->chemin_a_noeuds);
285
			'VALUES '.$this->creerValuesMultiple($this->chemin_a_noeuds).
-
 
286
			' -- '.__FILE__.' : '.__LINE__;
253
		$this->inserer($requete);
287
		$this->bdd->requeter($requete);
254
		$this->chemin_a_noeuds = array();
288
		$this->chemin_a_noeuds = array();
255
	}
289
	}
256
 
290
 
257
	//Insertion des noeuds
291
	//Insertion des noeuds
258
	private function insererNoeuds() {
292
	private function insererNoeuds() {
259
		$requete = 'INSERT INTO osm_noeuds (id_noeud, lat, `long`) '.
293
		$requete = 'INSERT INTO osm_noeuds (id_noeud, lat, `long`) '.
260
	    		   'VALUES '.$this->creerValuesMultiple($this->noeuds);
294
			'VALUES '.$this->creerValuesMultiple($this->noeuds).
-
 
295
			' -- '.__FILE__.' : '.__LINE__;
261
		$this->inserer($requete);
296
		$this->bdd->requeter($requete);
262
		$this->noeuds = array();
297
		$this->noeuds = array();
263
	}
298
	}
264
 
299
 
265
	//Update des relations
300
	//Update des relations
266
	private function modifierRelationsCommunes() {
301
	private function modifierRelationsCommunes() {
267
		$donnees = $this->relations_communes;
302
		foreach ($this->relations_communes as $donnee) {
268
		foreach ($donnees as $donnee) {
303
			$infosP = $this->bdd->proteger($donnee);
269
		$requete = 'UPDATE osm_relations '.
304
			$requete = 'UPDATE osm_relations '.
270
					"SET id_relation = $donnee[0], nom = $donnee[1], code_insee = $donnee[2] ".
305
				"SET id_relation = $infosP[0], nom = $infosP[1], code_insee = $infosP[2] ".
271
					"WHERE id_relation = $donnee[0]";
306
				"WHERE id_relation = $infosP[0] ".
-
 
307
				' -- '.__FILE__.' : '.__LINE__;
272
			$this->inserer($requete);
308
			$this->bdd->requeter($requete);
273
		}
309
		}
274
		$this->relations_communes = array();
310
		$this->relations_communes = array();
275
	}
311
	}
276
 
312
 
277
	/*
313
	/*
278
	*Update des relations à chemins en supprimant l'ancienne relation et tous ses chemins
314
	*Update des relations à chemins en supprimant l'ancienne relation et tous ses chemins
279
	*de la table osm_relation_a_chemins et insérer la nouvelle
315
	*de la table osm_relation_a_chemins et insérer la nouvelle
280
	*/
316
	*/
281
	private function modifierRelationAChemins() {
317
	private function modifierRelationAChemins() {
282
		$relations_a_chemins_a_supp = array();
-
 
283
		$donnees = $this->relation_a_chemins;
318
		$this->supprimerRelationAChemins();
284
		foreach ($donnees as $donnee) {
319
		foreach ($this->relation_a_chemins as $donnee) {
285
			$relations_a_chemins_a_supp[] = $donnee[0];
-
 
286
		}
-
 
287
		$values_chaine = '('.implode(',',array_unique($relations_a_chemins_a_supp)).')';
-
 
288
		$requete = 'DELETE FROM osm_relation_a_chemins '.
-
 
289
					"WHERE id_relation IN $values_chaine";
-
 
290
		$this->inserer($requete);
320
			$infosP = $this->bdd->proteger($donnee);
291
		foreach ($donnees as $donnee) {
-
 
292
			$requete = 'INSERT INTO osm_relation_a_chemins (id_relation, id_chemin, role) '.
321
			$requete = 'INSERT INTO osm_relation_a_chemins (id_relation, id_chemin, role) '.
293
						"VALUES ($donnee[0], $donnee[1], $donnee[2]);";
322
				"VALUES ($infosP[0], $infosP[1], $infosP[2]) ".
-
 
323
				' -- '.__FILE__.' : '.__LINE__;
294
			$this->inserer($requete);
324
			$this->bdd->requeter($requete);
295
		}
325
		}
296
		$this->relation_a_chemins = array();
326
		$this->relation_a_chemins = array();
297
	}
327
	}
298
 
328
 
299
	/*
329
	/*
300
	*Update des chemins à noeuds en supprimant l'ancien chemin et tous ses noeuds
330
	*Update des chemins à noeuds en supprimant l'ancien chemin et tous ses noeuds
301
	*de la table osm_chemins_a_noeuds et insérer le nouveau
331
	*de la table osm_chemins_a_noeuds et insérer le nouveau
302
	*/
332
	*/
303
	private function modifierCheminANoeuds() {
333
	private function modifierCheminANoeuds() {
304
		$chemin_a_noeuds_a_supp = array();
-
 
305
		$donnees = $this->chemin_a_noeuds;
334
		$this->supprimerCheminANoeuds();
306
		foreach ($donnees as $donnee) {
335
		foreach ($this->chemin_a_noeuds as $donnee) {
307
			$chemin_a_noeuds_a_supp[] = $donnee[0];
-
 
308
		}
-
 
309
		$values_chaine = '('.implode(',',array_unique($chemin_a_noeuds_a_supp)).')';
-
 
310
		$requete = 'DELETE FROM osm_chemin_a_noeuds '.
-
 
311
					"WHERE id_chemin IN $values_chaine";
-
 
312
		$this->inserer($requete);
336
			$infosP = $this->bdd->proteger($donnee);
313
		foreach ($donnees as $donnee) {
-
 
314
			$requete = 'INSERT INTO osm_chemin_a_noeuds (id_chemin, id_noeud, ordre) '.
337
			$requete = 'INSERT INTO osm_chemin_a_noeuds (id_chemin, id_noeud, ordre) '.
315
						"VALUES ($donnee[0], $donnee[1], $donnee[2]);";
338
				"VALUES ($infosP[0], $infosP[1], $infosP[2]) ".
-
 
339
				' -- '.__FILE__.' : '.__LINE__;
316
			$this->inserer($requete);
340
			$this->bdd->requeter($requete);
317
		}
341
		}
318
		$this->chemin_a_noeuds = array();
342
		$this->chemin_a_noeuds = array();
319
	}
343
	}
320
 
-
 
321
 
344
 
322
	//Update des noeuds
345
	//Update des noeuds
323
	private function modifierNoeuds() {
346
	private function modifierNoeuds() {
324
		$donnees = $this->noeuds;
347
		foreach ($this->noeuds as $donnee) {
325
		foreach ($donnees as $donnee) {
348
			$infosP = $this->bdd->proteger($donnee);
326
			$requete = 'UPDATE osm_noeuds '.
349
			$requete = 'UPDATE osm_noeuds '.
327
						"SET id_noeud = $donnee[0], lat = $donnee[1], `long` = $donnee[2] ".
350
				"SET id_noeud = $infosP[0], lat = $infosP[1], `long` = $infosP[2] ".
-
 
351
				"WHERE id_noeud = $infosP[0] ".
328
						"WHERE id_noeud = $donnee[0]";
352
				' -- '.__FILE__.' : '.__LINE__;
329
			$this->inserer($requete);
353
			$this->bdd->requeter($requete);
330
		}
354
		}
331
		$this->noeuds = array();
355
		$this->noeuds = array();
332
	}
356
	}
333
 
-
 
334
 
357
 
335
	//Suppressions des relations
358
	//Suppressions des relations
336
	private function supprimerRelationsCommunes() {
359
	private function supprimerRelationsCommunes() {
337
		$donnees = $this->relations_communes;
-
 
338
		foreach ($donnees as $donnee) {
-
 
339
			$requete = 'DELETE FROM osm_relations '.
-
 
340
						"WHERE id_relation = $donnee[0]";
-
 
341
			$this->inserer($requete);
-
 
342
		}
360
		$idsIn = $this->getIds($this->relations_communes);
-
 
361
		$this->relations_communes = array();
-
 
362
		$requete = 'DELETE FROM osm_relations '.
-
 
363
			"WHERE id_relation IN ($idsIn) ".
-
 
364
			' -- '.__FILE__.' : '.__LINE__;
343
		$this->relations_communes = array();
365
		$this->bdd->requeter($requete);
344
	}
366
	}
345
 
367
 
346
	//Suppressions des relations à chemins
368
	//Suppressions des relations à chemins
347
	private function supprimerRelationAChemins() {
369
	private function supprimerRelationAChemins() {
348
		$donnees = $this->relations_communes;
-
 
349
		foreach ($donnees as $donnee) {
-
 
350
			$donnees = $this->relation_a_chemins;
370
		$idsIn = $this->getIds($this->relation_a_chemins);
351
			$requete = 'DELETE FROM osm_relation_a_chemins '.
-
 
352
						"WHERE id_relation = $donnee[0]";
-
 
353
			$this->inserer($requete);
-
 
354
		}
-
 
355
		$this->relation_a_chemins = array();
371
		$this->relation_a_chemins = array();
-
 
372
		$requete = 'DELETE FROM osm_relation_a_chemins '.
-
 
373
			"WHERE id_relation IN ($idsIn) ".
-
 
374
			' -- '.__FILE__.' : '.__LINE__;
-
 
375
		$this->bdd->requeter($requete);
356
	}
376
	}
357
 
377
 
358
	//Suppressions des chemins à noeuds
378
	//Suppressions des chemins à noeuds
359
	private function supprimerCheminANoeuds() {
379
	private function supprimerCheminANoeuds() {
360
		$donnees = $this->chemin_a_noeuds;
380
		$idsIn = $this->getIds($this->chemin_a_noeuds);
361
		foreach ($donnees as $donnee) {
-
 
362
			$donnees = $this->relation_a_chemins;
-
 
363
			$requete = 'DELETE FROM osm_chemin_a_noeuds '.
-
 
364
						"WHERE id_chemin = $donnee[0]";
-
 
365
			$this->inserer($requete);
-
 
366
		}
-
 
367
		$this->chemin_a_noeuds = array();
381
		$this->chemin_a_noeuds = array();
-
 
382
		$requete = 'DELETE FROM osm_chemin_a_noeuds '.
-
 
383
			"WHERE id_chemin IN ($idsIn) ".
-
 
384
			' -- '.__FILE__.' : '.__LINE__;
-
 
385
		$this->bdd->requeter($requete);
368
	}
386
	}
369
 
387
 
370
	//Suppressions des chemins à noeuds
388
	//Suppressions des chemins à noeuds
371
	private function supprimerNoeuds() {
389
	private function supprimerNoeuds() {
372
		$donnees = $this->noeuds;
390
		$idsIn = $this->getIds($this->noeuds);
373
		foreach ($donnees as $donnee) {
-
 
374
			$requete = 'DELETE FROM osm_noeuds '.
-
 
375
						"WHERE id_noeud = $donnee[0]";
-
 
376
			$this->inserer($requete);
-
 
377
		}
-
 
378
		$this->noeuds = array();
391
		$this->noeuds = array();
379
	}
-
 
380
 
-
 
381
	private function inserer($requete) {
392
		$requete = 'DELETE FROM osm_noeuds '.
-
 
393
			"WHERE id_noeud IN ($idsIn) ".
-
 
394
			' -- '.__FILE__.' : '.__LINE__;
382
		$this->bdd->requeter($requete);
395
		$this->bdd->requeter($requete);
383
	}
396
	}
384
 
397
 
-
 
398
	private function getIds(&$tableau) {
-
 
399
		$ids = array();
385
	private function proteger($chaine) {
400
		foreach ($tableau as $info) {
-
 
401
			$ids[] = $this->bdd->proteger($info[0]);
-
 
402
		}
-
 
403
		$idsSansDoublon = array_unique($ids);
-
 
404
		$idsIn = implode(',', $idsSansDoublon);
386
		return $this->bdd->proteger($chaine);
405
		return $idsIn;
387
	}
406
	}
388
 
407
 
389
	private function creerValuesMultiple($donnees) {
408
	private function creerValuesMultiple($donnees) {
390
		$values = array();
409
		$values = array();
391
		foreach ($donnees as $donnee) {
410
		foreach ($donnees as $infos) {
-
 
411
			$infosP = $this->bdd->proteger($infos);
392
			$values[] = implode(',', $donnee);
412
			$values[] = implode(',', $infosP);
393
		}
413
		}
394
		$values_chaine = '('.implode('),(', $values).')';
414
		$valuesClause = '('.implode('),(', $values).')';
395
		return $values_chaine;
415
		return $valuesClause;
396
	}
416
	}
397
}
417
}
398
?>
-
 
399
418