Skip to Content

GRASS GIS v. 6.4.2: la nouvelle console Python (Shell Python), exemple d'utilisation simple ou avec le module Shapely

Niveau Intermédiaire
Logiciels utilisés GRASS GIS
divers modules Python (au choix)
Plateforme Windows | Mac | Linux | FreeBSD

python

La version 6.4.2 de GRASS GIS offre une nouvelle interface avec une console Python (Shell Python) intégrée (comme illustré précédemment dans www.portailsig.org/content/sortie-de-la-version-642-de-grass-gis-et-nouvelle-interface-shell-python-modeleur-graphique-)

Mais, que peut-on faire avec cette console ?

Avant

Python devait être lancé depuis le Shell GRASS :

et le module grass.script importé avant tout traitement.

Maintenant, avec la console Python

Et l'on constate que le module grass.script est « préimporté ».

En pratique : obtenir les coordonnées des extrémités d'une ligne et créer une nouvelle couche points à partir de celles-ci

La couche ligne est nommée ici testgrass:

Démarche

  • la première chose à faire est d'obtenir les coordonnées des 2 extrémités de la ligne. Cela se fait avec la commande v.to.db pour obtenir debligne et finligne puis debx, deby, (debz) et finx, finy (finz)

Comment créer la couche points résultante ?

Une solution est donnée par Ivan Marchesini sur la liste Grass-User dans osgeo-org.1560.n6.nabble.com/How-one-can-find-the-starting-and-end-point-of-a-line-in-a-vector-file-or-how-one-can-connect-two-lie-td4542252.html. Sa solution passe par le format standard de GRASS GIS lors de l'exportation de points avec v.out.ascii (grass.fbk.eu/gdp/html_grass64/v.out.ascii.html):

Le format pour la couche ligne:

L  2 1
186139.12370417 53082.65419398
188199.1227985 53467.75855873
 1  1

Le format pour la couche points correspondante:

P  1 1
186139.12370417 53082.65419398
1 1       
P  1 1
188199.1227985 53467.75855873
1 2    

  • avant tout, il est nécessaire de créer une couche vide, testpt, destinée à recevoir ces points, avec la commande v.edit:


 

  • puis un fichier temporaire GRASS (grass.tempfile()) pour enregistrer ces points au format standard:

  • ces points sont ensuite ajoutés à la couche testpt avec la commande v.edit et le fichier temporaire:

Résultat

Il reste bien évidemment à ajouter une table d'attributs à cette couche soit avec Python, soit directement à partir de l'interface.

Le script complet

traitement

  1. """coordonnées du premier sommet"""
  2. debligne =grass.read_command("v.to.db", flags="p", map="testgrass", type="line", option="start", units="meters" , quiet=True)
  3. debx=float(debligne.split("|")[1])
  4. deby=float(debligne.split("|")[2])
  5. debz=float(debligne.split("|")[3])
  6.  
  7. """coordonnées du deuxième sommet"""
  8. finligne=grass.read_command("v.to.db", flags="p", map="testgrass",type="line", option="end", units="meters", quiet=True)
  9. finx=float(finligne.split("|")[1])
  10. finy=float(finligne.split("|")[2])
  11. finz=float(finligne.split("|")[3])
  12.  
  13. """création d'une couche vide testpt"""
  14. grass.read_command("v.edit",tool="create",map="testpt")
  15.  
  16. """création d'un fichier temporaire au format standard:
  17. P 1 1
  18. 186139.12370417 53082.65419398
  19. 1 1
  20. P 1 1
  21. 188199.1227985 53467.75855873
  22. 1 2"""
  23. fichtemp = grass.tempfile()
  24. pfich = open(fichtemp, 'w')
  25. print>> pfich, "P", "1", "1"
  26. print>> pfich, debx, deby, debz
  27. print>> pfich, "1", 1
  28. print>> pfich, "P", "1", "1"
  29. print>> pfich, finx, finy, finz
  30. print>> pfich, "1", 2
  31. pfich.close()
  32.  
  33. """importation des points dans la couche testpt"""
  34. grass.run_command("v.edit", input=fichtemp, flags="n", tool="add",map="testpt", snap="node", thresh="1")

Utilisation d'autres modules Python

Jusqu'à présent seul le module grass.script a été utilisé, mais il reste très proche des commandes de GRASS GIS, il ne fait que les « emballer ».

Il est tout à fait possible d'utiliser dans la console d'autres modules Python pour traiter les données, comme Shapely, ce qui devient beaucoup plus intéressant pour ceux qui les connaissent bien:

Il y a aussi moyen d'utiliser RPy2, PyQGIS et tous les autres, même matplotlib (sans système de projection):

Conclusions

Cela devient de plus en plus amusant de pouvoir tout combiner avec Python,  pratiquement tous les logiciels SIGs, les modules géospatiaux comme Shapely, les modules Python autres et la possibilité de  passer de l'un à l'autre « en live ».

Sur Windows, c'est plus complexe puisque Python n'est pas installé par défaut (comme sur Linux ou Mac OS X où les logiciels SIGs se basent sur la version installée, avec tous les modules). ArcGIS, GRASS GIS ou QGIS sont donc obligés d'installer chacun leur propre implantation de Python. Comme il n'y a pas non plus de compilateur installé par défaut, ces modules sont souvent livrés sous forme de fichier exe avec tous les problèmes liés à la base de registres (voir www.portailsig.org/content/python-pour-les-sigistes-comment-installer-un-module-externe-geojson-shapely-ou-gdalogr-par-).

Notons, pour terminer, que cette console ouvre la voie à la version 7 de GRASS GIS où tout est en Python (interface, modules, traitements, etc.). Cette version est disponible en version développement.

Tous les traitements on été effectués sur Mac OS X avec GRASS GIS version 6.4.2 de www.kyngchaos.com/software/grass

Site officiel : GRASS GIS
Autres Liens : Python: le module Shapely, géométries, prédicats spatiaux, analyse spatiale, matrices de Clementini (DE-9IM), traitements de shapefiles ou autres, et représentation avec matplotlib


Creative Commons License
licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique Commerciale 2.0 France

Commentaires

Le fait de dessiner une ligne

Le fait de dessiner une ligne sur un fond blanc n'est proposé ici qu'à titre d'illustration de l'utilisation de Python avec des modules classiques comme matplotlib dans la console de GRASS GIS.  Ça n'a rien à voir avec le traitement des réseaux dans GRASS GIS. Je vous invite à poser votre question sur le www.forumsig.org lieu plus adapté pour cela.

incompréhention

bonjour
je peine à comprendre le besoin de tracer des lignes sur un fond blanc. Comment réalisé cela sur une carte?
Mon but est de réaliser la cartographie d'un réseau.
Me suis je orienter vers un mauvais logiciel?
merci de vos éclaircissements.

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.