New file |
0,0 → 1,143 |
<?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()); |
} |
} |