Subversion Repositories eFlore/Projets.eflore-projets

Compare Revisions

Ignore whitespace Rev 1045 → Rev 1046

/trunk/scripts/modules/osm/PolygoneCreateur.php
New file
0,0 → 1,144
<?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);
echo $requete;
$this->messages->traiterInfo("Nombre de chemins remis à zéro : ".$retour->rowCount());
}
}