Как выполнять повторяющиеся задачи в QGIS?


11

Я пытаюсь выполнить обработку многих файлов функций, поэтому я хотел бы автоматизировать ее.

На самом деле, у меня есть один шейп-файл с пространственным распределением некоторых видов, а другой - с типом растительности.

Я хотел бы выбрать (по атрибуту) один вид в шейп-файле видов, а затем выбрать (по месту) все области растительности, которые пересекаются с их ареалом распространения. Наконец, я хотел бы иметь шейп-файл с именем, названием вида, а также с атрибутами и формами часто используемых типов растительности. И я хотел бы повторить это для всех видов (более 100) и, если возможно, сделать это легко (чтобы это мог сделать другой человек).

Я уже пробовал эту задачу с помощью плагина Sextante, но у меня не может быть названия вида в качестве имени шейп-файла в конце.

Может кто-нибудь предложить метод для этого?


1
Из вашего описания вся работа будет более подходящей для полнофункциональной базы геоданных, такой как PostGIS или SpatiaLite. Но полное решение для выполнения того, что вам нужно, может быть не тривиальным.
— steko

Ответы:


5

Эта запись в блоге может помочь понять, как это сделать в SEXTANTE:

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

Надеюсь, поможет


Привет, спасибо за это, я хочу попробовать, но я не эксперт в такого рода сценариях, так что вы можете объяснить, что мы должны делать с этим сценарием? где мы должны скопировать это? Спасибо.
— Onesime

Отлично, большое спасибо, я попробовал (через консоль Python), и он работает хорошо. Следующим шагом я постараюсь адаптировать его как модельера Sextante. Ущерб, что в таком инструменте, как Sextante, нет такой команды (задайте имя выходного файла с некоторыми переменными).
— Единственное время

3

Это требует небольшого сценария. Для того, чтобы сделать его воспроизводимым я хотел бы попробовать выполнить его в R . Это также должно быть возможно с QGis и Sextante, используя пакетное выполнение (щелчок правой кнопкой мыши по функции) в модели 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) и, скорее всего, перезапускать список фреймов данных или что-то еще.
— Керлью
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.