Comment effectuer des tâches répétitives dans QGIS?


11

J'essaie de faire un traitement sur de nombreux fichiers de fonctionnalités, donc je voudrais l'automatiser.

En fait, j'ai un fichier de formes avec la distribution spatiale de certaines espèces et un avec le type de végétation.

Je voudrais sélectionner (par attribut) une espèce dans le fichier de formes des espèces, puis sélectionner (par localité) toutes les zones de végétation qui se croisent avec leur aire de répartition. Enfin, j'aimerais avoir un fichier de formes avec, comme nom, le nom de l'espèce, et avec les attributs et les formes des types de végétation fréquentés. Et je voudrais répéter cela pour toutes les espèces (plus de 100), et si possible, faites-le d'une manière facile (afin que cela puisse être fait par une autre personne).

J'ai déjà essayé cette tâche en utilisant le plugin Sextante, mais je ne peux pas avoir le nom de l'espèce comme nom de fichier de formes à la fin.

Quelqu'un peut-il suggérer une méthode pour cela?


1
D'après votre description, l'ensemble du travail serait plus adapté à une géodatabase complète comme PostGIS ou SpatiaLite. Mais une solution complète pour effectuer ce dont vous avez besoin n'est peut-être pas anodine.
steko

Réponses:


5

Cette entrée de blog peut aider à comprendre comment le faire dans SEXTANTE:

http://qgissextante.blogspot.fr/2013/01/using-selection-algorithms.html

J'espère que ça aide


Salut, merci pour cela, je veux l'essayer, mais je ne suis pas expert sur ce type de script, pouvez-vous expliquer ce que nous avons à faire avec ce script? où devons-nous le copier? Merci.
Onesime

Génial, merci beaucoup, je l'ai essayé (via la console Python) et cela fonctionne bien. La prochaine étape, je vais essayer de l'adapter en tant que modeleur Sextante. C'est dommage qu'il n'y ait pas une telle commande dans un outil tel que Sextante (définissez le nom du fichier de sortie avec certaines variables).
Onesime

3

Cela nécessite un petit script. Pour le rendre reproductible je voudrais essayer de l' accomplir dans R . Cela devrait également être possible avec QGis et Sextante en utilisant l'exécution par lots (fonction clic droit sur la fonction) dans un modèle Sextante. Ici, vous pouvez d'abord utiliser l'outil d'intersection vectorielle et ensuite une sorte de jointure spatiale.

Dans R, je l'essayerais comme ça. Vous devrez peut-être modifier le code car je ne connais pas votre structure de données et vos variables.

library(raster);library(rgdal);library(sp)         # Load in required packages

vegetation <- readOGR("H:/Examplefolder",          # To load a vegetation polygon shape here 
                      "vegi")                      # called vegi.shp    

setwd(harddriveD)                                  # Now, switch to the directory containing your species shapes
                                                   # and use the following code 
species_files <- grep( ".shp",                     # to extract all shape names
                       dir(),
                       ignore.case=T,
                       value=T)

                                                   # Now read in your speciesfiles in a loop 
for(name in species_files){                        # and do a  vegetation data
                                                   # overlay with your basename
    spec_name <- strsplit(name,split=".shp")[[1]]  # to get only the load in
                                                   # your species name shape. 

    spec_shp <- readOGR(".",spec_name)             # I assume that you have point data. Otherwise change the code.
    ov <- over(spec_shp,vegetation)                # Make a overlay with your vegetation data, 
                                                   # returns a dataframe of the overlaying vegetation shape attributes, 
                                                   # which are within your species shape. 
                                                   # This dataframe has the same number of rows as your input species shape. 
   cd <- coordinates(spec_shp);                    # Therefore you could just append the needed information to your species shape.
   proj <- proj4string(spec_shp)                   # save coordinates and proj.

                                                   # Append your vegetation data to your species shape
   spec_shp$Vegetation <- ov$ShrubSpecies          # Or whatever you want to get. 

   spp <- SpatialPointsDataFrame(                  # In the end export your shape again. 
                    coords=cd,                     # I would advise you to use a different folder. 
                    data=as.data.frame(spec_shp),  # In case you have polygons instead of Point data
                    proj4string=CRS(proj) )        # use the SpatialPolygonDataFrame function. -> help ?SpatialPolygonDataFrame
  writeOGR(spp,                                    #Should result in a new shape 
           "foldername",                           # which has your species name.
           spec_name,
           driver="ESRI Shapefile")                      

}

J'ai émis de nombreuses hypothèses sur votre objectif et la structure de votre ensemble de données. Vous devez probablement corriger le code selon vos besoins avant de l'essayer.


Merci pour votre aide, je vais l'essayer. Mes données sur les espèces sont en polygone (distribution des espèces), mais je pense que c'est peut-être tout à fait la même chose? merci beaucoup
Onesime

Vous avez juste besoin de changer une fonction (SpatialPolygonsDataFrame par exemple) et très probablement retourne une liste de dataframes ou autre chose.
Courlis
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.