如何在QGIS中执行重复性任务?


11

我正在尝试对许多功能文件进行处理,因此我想使其自动化。

实际上,我有一个shapefile具有某些物种的空间分布,而另一个则具有植被类型。

我想在“物种形状”文件中选择(按属性)一个物种,然后选择(按位置)与其分布区域相交的所有植被区域。最后,我想创建一个shapefile,其名称为物种名称,并具有常见植被类型的属性和形式。我想对所有物种(超过100个)重复此操作,并且如果可能的话,可以轻松地进行此操作(这样可以由另一个人完成)。

我已经使用Sextante插件尝试了此任务,但是最后没有种类名称作为shapefile名称。

有人可以建议一种方法吗?


1
根据您的描述,整个工作将更适合于功能齐全的地理数据库,例如PostGIS或SpatiaLite。但是执行所需功能的完整解决方案可能并不简单。
steko 2013年

Answers:


5

此博客条目可能有助于了解如何在SEXTANTE中做到这一点:

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

希望能帮助到你


嗨,谢谢你,我想尝试一下,但是我不是这种脚本的专家,所以你能解释一下我们与这个脚本有什么关系吗?我们应该在哪里复制它?谢谢。
2013年

太好了,非常感谢,我尝试了一下(通过Python控制台),它运行良好。下一步,我将尝试使其适应Sextante建模器。在Sextante这样的工具中没有这样的命令是有害的(使用一些变量设置输出文件的名称)。
Onesime

3

这需要一个小脚本。为了使其可重现,我将尝试在R中完成它。通过在Sextante模型中使用批处理(在功能上单击鼠标右键),QGis和Sextante也应该可行。在这里,您可以先使用矢量交集工具,然后再使用某种空间连接。

在R中,我会这样尝试。您可能需要修改代码,因为我不知道您的数据结构和变量。

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

}

我对您的目标和数据集的结构做出了许多假设。在尝试之前,您很可能必须根据需要更正代码。


感谢您的帮助,我会尝试的。我的物种数据在多边形(物种分布)中,但是我认为可能完全一样吗?非常感谢
Onesime

您只需要更改某些功能(例如,SpatialPolygonsDataFrame),就很可能会返回数据框列表或其他内容。
Curlew
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.