Como executar tarefas repetitivas no QGIS?

11

Estou tentando fazer um tratamento em muitos arquivos de recursos, então gostaria de automatizá-lo.

De fato, tenho um arquivo de forma com a distribuição espacial de algumas espécies e outro com o tipo de vegetação.

Gostaria de selecionar (por atributo) uma espécie no Shapefile de espécies e, em seguida, selecionar (por localidade) todas as áreas de vegetação que se cruzam com sua área de distribuição. Finalmente, eu gostaria de ter um shapefile com, como nome, o nome da espécie e com atributos e formas dos tipos de vegetação freqüentes. E eu gostaria de repetir isso para todas as espécies (mais de 100) e, se possível, faça isso de maneira fácil (para que isso possa ser feito por outra pessoa).

Eu já tentei essa tarefa usando o plug-in Sextante, mas não posso ter o nome da espécie como um nome de shapefile no final.

Alguém pode sugerir um método para isso?

Onesime
fonte
1
A partir da sua descrição, todo o trabalho seria mais adequado para um geodatabase completo, como PostGIS ou SpatiaLite. Mas uma solução completa para executar o que você precisa pode não ser trivial.
STEKO

Respostas:

5

Esta entrada de blog pode ajudar a entender como fazê-lo no SEXTANTE:

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

Espero que ajude

Victor Olaya
fonte
Olá, obrigado por isso, quero experimentá-lo, mas não sou especialista nesse tipo de script, então você pode explicar o que temos a ver com esse script? onde devemos copiá-lo? obrigado.
Onesime 30/01
Ótimo, muito obrigado, eu tentei (através do Console Python) e funciona bem. O próximo passo, tentarei adaptá-lo como modelador Sextante. É um dano que não exista um comando em uma ferramenta como Sextante (defina o nome do arquivo de saída com algumas variáveis).
Onesime 31/01
3

Isso exige um pequeno script. Para torná-lo reprodutíveis gostaria de tentar realizá-lo em R . Também deve ser possível com o QGis e o Sextante usando a execução em lote (clique com o botão direito na função) em um modelo do Sextante. Aqui você pode primeiro usar a ferramenta de interseção vetorial e depois algum tipo de junção espacial.

Em R eu tentaria assim. Talvez você precise modificar o código, pois não conheço sua estrutura de dados e variáveis.

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

}

Eu fiz muitas suposições sobre seu objetivo e a estrutura do seu conjunto de dados. Provavelmente você precisará corrigir o código de acordo com suas necessidades antes de testá-lo.

Maçarico
fonte
Obrigado pela sua ajuda, vou tentar. Meus dados de espécies estão em polígono (distribuição de espécies), mas acho que talvez seja o mesmo? muito obrigado
Onesime 29/01
Você só precisa alterar alguma função (SpatialPolygonsDataFrame, por exemplo) e, provavelmente, retorna uma lista de quadros de dados ou outra coisa.
Curlew