กำลังบัฟเฟอร์ใน pyQGIS?


17

ฉันกำลังมองหาตัวอย่างเพื่อทำสคริปต์หลามแบบง่าย ๆ ใน QGIS ฉันจะทำการวิเคราะห์บัฟเฟอร์บนชุดข้อมูลได้อย่างไร

ฉันไม่สามารถพบได้มากในคู่มือและงูเหลือม QGIS ที่ค่อนข้างตรงกับเอกสาร Esri

คำตอบ:


5

มีลักษณะที่เป็นPyQGIS ตำรา

ทำตามตัวอย่างวิธีการวนซ้ำเวกเตอร์เลเยอร์ การเข้าถึงรูปทรงเรขาคณิตคุณสามารถใช้วิธีการบัฟเฟอร์ () ดูเพิ่มเติมที่ QGIS API: http://www.qgis.org/api/classQgsGeometry.html#a98208752e1beb1a5d3a7eedffbfdb2e4


12

คุณมีวิธีที่แตกต่างกันในการได้รับสิ่งที่คุณต้องการโดย PyQGIS Console:

  1. ข้อเสนอแนะของอารากอน;
  2. โดยใช้คลาส QgsGeometryAnalyzer:
from qgis.utils import iface
from qgis.analysis import QgsGeometryAnalyzer 
mc = iface.mapCanvas() 
layer = mc.currentLayer()
QgsGeometryAnalyzer().buffer(layer, "path_to/output.shp", 500, False, False, -1)
  1. โดยใช้คลาส Sextante:
from sextante.core.Sextante import Sextante
Sextante.runalg("ftools:fixeddistancebuffer","input_path.shp", False, 500, 5, True, "output_path_buffer.shp")

ในการรับพารามิเตอร์ sextante พิมพ์Sextante.alghelp("ftools:fixeddistancebuffer")ใน PyQGIS Console

หวังว่านี่จะช่วยได้!


11

หากคุณต้องการรหัสพื้นฐานคุณสามารถลอง:

#Don't forget to Toggle Editing

lyr = qgis.utils.iface.activeLayer()
provider = lyr.dataProvider()
feat= QgsFeature()
alls = provider.attributeIndexes()
provider.select(alls)

while provider.nextFeature(feat):
    buff = feat.geometry().buffer(5,2)
    lyr.dataProvider().changeGeometryValues({feat.id(): buff})

ขอบคุณ - QgsFeature เป็นชื่อเลเยอร์หรือควรมีเส้นทางที่แน่นอนหรือไม่ และบัฟเฟอร์ (5,2) คือระยะทางนั้นหรือไม่?
GIS Danny

1
คุณสามารถทำสิ่งนี้ได้ด้วย for for loop และคุณยังสามารถหลีกเลี่ยงการเลือกคุณสมบัติได้หากไม่ต้องการgist.github.com/4094707
Nathan W

1
@GISDanny QgsFeature เป็นคลาสคอนเทนเนอร์สำหรับคุณลักษณะเช่นแอตทริบิวต์และรูปทรงเรขาคณิตใน QGIS เลเยอร์คือบิต qgis.utils.iface.activeLayer () ซึ่งจะใช้เลเยอร์ที่ใช้งานอยู่ในปัจจุบันใน QGIS
นาธาน W

เป็นไปได้หรือไม่ที่จะระบุหน่วยเมื่อบัฟเฟอร์ใน Python ฉันพยายามบัฟเฟอร์เลเยอร์จุดฉันเชื่อว่าฉันได้ตั้งค่า CRS กับหน่วยเป็นฟุต แต่บัฟเฟอร์ที่ฉันได้รับมีขนาดใหญ่ - เลเยอร์จุดถูกนำเข้าจาก csv ด้วยสายยาว lat แต่เดิมเมื่อฉันสร้างเลเยอร์เวกเตอร์ออกจาก มันฉันระบุระบบท้องถิ่น เห็นได้ชัดว่ามีบางอย่างผิดปกติ
kflaw

9

เพียงเล็กน้อยเพื่อเพิ่มคำตอบสุดท้าย

ในการค้นหาอัลกอริทึม SEXTANTE เกี่ยวกับหัวข้อที่กำหนดให้ใช้ Sextante.alglist () ตัวอย่างเช่นในกรณีของการค้นหาสิ่งที่มี "บัฟเฟอร์" คุณจะต้องทำ

>>> from sextante.core.Sextante import Sextante
>>> Sextante.alglist("buffer")

และคุณจะได้รับ:

Grid Buffer------------------------------------------>saga:gridbuffer
Grid Proximity Buffer-------------------------------->saga:gridproximitybuffer
Shapes Buffer---------------------------------------->saga:shapesbuffer
Threshold Buffer------------------------------------->saga:thresholdbuffer
Fixed distance buffer-------------------------------->ftools:fixeddistancebuffer
Variable distance buffer----------------------------->ftools:variabledistancebuffer
r.buffer - Creates a raster map layer showing buffer zones surrounding cells that contain non-NULL category values.--->grass:r.buffer
v.buffer.angle--------------------------------------->grass:v.buffer.angl
v.buffer.column - Creates a buffer around features of given type.--->grass:v.buffer.column
v.buffer.distance - Creates a buffer around features of given type.--->grass:v.buffer.distance
v.buffer.minordistance------------------------------->grass:v.buffer.minordistance

ด้วยวิธีนี้คุณสามารถค้นหาชื่อของอัลกอริทึมที่จะเรียกใช้ (ftools: fixeddistancebuffer ในตัวอย่างที่เสนอในการตอบกลับด้านบน)

คุณสามารถเปลี่ยนสคริปต์เป็นอัลกอริทึมใหม่ใน SEXTANTE เอกสาร SEXTANTE มีข้อมูลโดยละเอียดเกี่ยวกับเรื่องนั้น


นั่นเป็นคำแนะนำที่ดีที่ควรพูดถึงในบล็อกของคุณ ฉันกำลังมองหาสิ่งนี้เมื่อวานนี้
Underdark
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.