วิธีการทำงานซ้ำ ๆ ใน QGIS?


11

ฉันกำลังพยายามจัดการกับไฟล์ฟีเจอร์หลายไฟล์ดังนั้นฉันจึงต้องการทำให้เป็นอัตโนมัติ

ในความเป็นจริงฉันมีหนึ่งรูปร่างไฟล์ที่มีการกระจายเชิงพื้นที่ของสปีชีส์บางส่วนและอีกหนึ่งชนิดที่มีพืชพรรณ

ฉันต้องการเลือก (ตามคุณสมบัติ) หนึ่งสปีชีส์ใน Species Shapefile จากนั้นเลือก (ตามท้องถิ่น) พื้นที่พืชทั้งหมดที่ตัดกับพื้นที่การกระจาย ในที่สุดฉันต้องการไฟล์รูปร่างด้วยชื่อชื่อสปีชีส์และคุณลักษณะและรูปแบบของพันธุ์พืชที่แวะเวียนมา และฉันต้องการที่จะทำซ้ำสิ่งนี้สำหรับทุกสายพันธุ์ (มากกว่า 100) และถ้าเป็นไปได้ทำในลักษณะที่ง่าย (เพื่อให้คนอื่นสามารถทำได้)

ฉันได้ลองใช้งานนี้โดยใช้ปลั๊กอิน Sextante แล้ว แต่ฉันไม่สามารถมีชื่อสปีชีส์เป็นชื่อ shapefile ได้ในตอนท้าย

มีคนแนะนำวิธีการนี้ได้ไหม?


1
จากคำอธิบายของคุณงานทั้งหมดจะเหมาะกว่าสำหรับฐานข้อมูลภูมิศาสตร์แบบเต็มเช่น PostGIS หรือ SpatiaLite แต่วิธีการแก้ปัญหาที่สมบูรณ์เพื่อทำสิ่งที่คุณต้องการอาจไม่ใช่เรื่องเล็กน้อย
steko

คำตอบ:


5

รายการบล็อกนี้อาจช่วยให้เข้าใจวิธีการทำใน SEXTANTE:

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

หวังว่ามันจะช่วย


สวัสดีขอบคุณที่ฉันต้องการลอง แต่ฉันไม่เชี่ยวชาญในสคริปต์ชนิดนี้ดังนั้นคุณสามารถอธิบายสิ่งที่เราต้องทำกับสคริปต์นี้ได้อย่างไร เราจะต้องคัดลอกที่ไหน? ขอบคุณ
Onesime

เยี่ยมมากขอบคุณมากฉันลอง (ผ่าน Python Console) และใช้งานได้ดี ขั้นตอนต่อไปฉันจะพยายามปรับให้เป็น Sextante modeler มันเป็นความเสียหายที่ไม่มีคำสั่งดังกล่าวในเครื่องมือเช่น Sextante (ตั้งชื่อของไฟล์ที่ส่งออกด้วยตัวแปรบางอย่าง)
Onesime

3

สิ่งนี้เรียกร้องให้สคริปต์เล็กน้อย เพื่อให้สามารถทำซ้ำได้ฉันจะพยายามที่จะประสบความสำเร็จในการวิจัย ควรเป็นไปได้กับ QGis และ Sextante โดยใช้ batch-execution (rightclick on function) ในรูปแบบ 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 เป็นต้น) และส่วนใหญ่มีแนวโน้มที่จะส่งคืนรายการของ dataframes หรืออย่างอื่น
Curlew
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.