# -*- coding: utf-8 -*- # la ligne précédente permet d'utiliser des accents dans le script # il faut avoir créé avant l'utilisation de ce script une carte avec le buffer 1000m autour des routes (= roads_buff1000) import grass.script as grass import os #nullf est un pointeur vers le "fichier" artificiel /dev/null (os.devnull) vers lequel on dirige tous les messages inutiles des modules GRASS (une sorte de poubelle...) nullf = open(os.devnull, 'w') #ici on initialise le vecteur des écoles dans lequel on placera pour chaque école le compte des fois que cette école tombe dans le buffer des routes comptage=[0]*168 #on fait l'analyse 100 fois, chaque fois avec les points des écoles déplacés au hazard for i in range(0,100): #v.perturb déplace chaque point au hazard dans le rayon indiqué avec parameters, ici 30m pour les écoles plus 200m pour les routes ret=grass.run_command('v.perturb', input='schools_wake', output='schools_perturb', parameters=230, seed=i, overwrite=True, quiet=True, stderr = nullf) #on utilise v.select pour extraire les écoles qui touche le buffer de 1000m autour des routes grass.run_command('v.select', ainput='schools_perturb', binput='roads_buff1000', output='select_ecoles', overwrite=True, quiet=True, stderr = nullf) #v.db.select retourne l'ensemble des identifiants (cat) des écoles qui ont été identifiées dans l'étape précédente; la liste est mise dans la variable 'ecoles' ecoles=grass.read_command('v.db.select', map='select_ecoles', column='cat', flags='c') #pour les écoles identifiées on augmente le compte de un for ecole in ecoles.splitlines(): #on doit utiliser int(ecole) puisque splitlines() retourne des chaînes de caractères, mais un identifiant d'un élément d'un vecteur (ici du vecteur comptage[]) doit être un entier comptage[int(ecole)]=comptage[int(ecole)]+1 #Fin de la boucle for #on libère de nouveau le pointeur vers /dev/null nullf.close() #on remlit la variable 'ecoles' avec les identifiants de l'ensemble des écoles ecoles=grass.read_command('v.db.select', map='schools_wake', column='cat', flags='c') #pour chaque école, on affiche l'identifiant et le nombre de fois sur les 100 analyses que cette écoles est tombée dans le buffer des routes for ecole in ecoles.splitlines(): #si on veut uniquement afficher les écoles qui sont peut-être à risque, alors il faut décommenter la ligne suivante (càd retirer le dièse) # if comptage[int(ecole)]>0 and comptage[int(ecole)]<100: #pour pouvoir mettre ensemble le résultat du comptage en nombre avec les autres éléments en chaîne de caractères, il faut transformer le nombre en une chaîne de caractères avec la fonction str(). print ecole + ': ' + str(comptage[int(ecole)])