Come eseguire attività ripetitive in QGIS?


11

Sto cercando di fare un trattamento su molti file di funzionalità, quindi vorrei automatizzarlo.

In effetti, ho un file di forma con la distribuzione spaziale di alcune specie e uno con tipo di vegetazione.

Vorrei selezionare (per attributo) una specie nel Shapefile di specie, quindi selezionare (per località) tutte le aree di vegetazione che si intersecano con la loro area di distribuzione. Infine, vorrei avere un file di forma con, come nome, il nome della specie e con attributi e forme dei tipi di vegetazione frequentati. E vorrei ripetere questo per tutte le specie (più di 100), e se possibile farlo in modo semplice (in modo che possa essere fatto da un'altra persona).

Ho già provato questo compito usando il plugin Sextante, ma alla fine non posso avere il nome della specie come nome dello shapefile.

Qualcuno può suggerire un metodo per questo?


1
Dalla tua descrizione l'intero lavoro sarebbe più adatto per un geodatabase completo come PostGIS o SpatiaLite. Ma una soluzione completa per eseguire ciò di cui hai bisogno potrebbe non essere banale.
steko,

Risposte:


5

Questo post di blog potrebbe aiutare a capire come farlo in SEXTANTE:

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

Spero che sia d'aiuto


Ciao, grazie per questo, voglio provarlo, ma non sono esperto di questo tipo di sceneggiatura, quindi puoi spiegarci cosa dobbiamo fare con questa sceneggiatura? dove dovremmo copiarlo? Grazie.
Onesime,

Ottimo, grazie mille, l'ho provato (tramite la console Python) e funziona bene. Il prossimo passo, proverò ad adattarlo come modellatore di Sextante. È dannoso che non esista tale comando in uno strumento come Sextante (impostare il nome del file di output con alcune variabili).
Onesime

3

Questo richiede una piccola sceneggiatura. Per renderlo riproducibile avrei cercato di realizzarlo in R . Dovrebbe anche essere possibile con QGis e Sextante usando l'esecuzione batch (tasto destro del mouse sulla funzione) in un modello Sextante. Qui è possibile utilizzare innanzitutto lo strumento di intersezione vettoriale e successivamente una sorta di unione spaziale.

In R lo proverei così. Potrebbe essere necessario modificare il codice poiché non conosco la struttura e le variabili dei dati.

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")                      

}

Ho fatto molte ipotesi sul tuo obiettivo e sulla struttura del tuo set di dati. Molto probabilmente devi correggere il codice in base alle tue esigenze prima di provarlo.


Grazie per il tuo aiuto, lo proverò. I miei dati sulle specie sono in poligono (distribuzione delle specie), ma penso che sia forse lo stesso? molte grazie
Onesime

Hai solo bisogno di cambiare alcune funzioni (SpatialPolygonsDataFrame per esempio) e molto probabilmente restituisce un elenco di frame di dati o qualcos'altro.
Chiurlo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.