Đệm trong pyQGIS?


17

Tôi đang tìm kiếm một số ví dụ để thực hiện các kịch bản python đơn giản trong QGIS. Làm thế nào tôi có thể làm một phân tích bộ đệm trên một tập dữ liệu?

Tôi dường như không thể tìm thấy nhiều trong hướng dẫn và con trăn QGIS khá phù hợp với tài liệu Esri.

Câu trả lời:



12

Bạn có nhiều cách khác nhau để có được những gì bạn muốn bằng Bảng điều khiển PyQGIS:

  1. Đề nghị của Aragon;
  2. bằng cách sử dụng lớp QssGeometryAnalyzer:
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. bằng cách sử dụng lớp Sextante:
from sextante.core.Sextante import Sextante
Sextante.runalg("ftools:fixeddistancebuffer","input_path.shp", False, 500, 5, True, "output_path_buffer.shp")

Để lấy loại tham số Sextante.alghelp("ftools:fixeddistancebuffer")sextante trong Bảng điều khiển PyQGIS.

Hi vọng điêu nay co ich !


11

nếu bạn muốn mã cơ bản, bạn có thể thử:

#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})

Cảm ơn - là QssFeature tên lớp hay nó nên bao gồm một đường dẫn tuyệt đối? Và đệm (5,2) là khoảng cách đó?
GIS Danny

1
bạn cũng có thể làm điều này với một vòng lặp for và bạn cũng có thể tránh chọn các thuộc tính nếu không cần thiết gist.github.com/4094707
Nathan W

1
@GISDanny QssFeature là một lớp chứa cho một tính năng, ví dụ như thuộc tính và hình học trong QGIS. Lớp này là bit qgis.utils.iface.activeLayer (), sẽ sử dụng lớp hiện đang hoạt động trong QGIS.
Nathan W

Có thể chỉ định các đơn vị khi đệm trong Python? Tôi tiếp tục cố gắng đệm một lớp điểm Tôi tin rằng tôi đã đặt thành CRS với đơn vị tính theo feet nhưng bộ đệm tôi nhận được rất lớn - lớp điểm ban đầu được nhập từ csv bằng dây dài lat nhưng khi tôi tạo ra một lớp vectơ Tôi đã chỉ định một hệ thống cục bộ. Một cái gì đó rõ ràng là sai.
kflaw

9

Chỉ cần một điều nhỏ để thêm vào trả lời cuối cùng.

Để tìm kiếm thuật toán SEXTANTE về một chủ đề nhất định, hãy sử dụng Sextante.alglist (). Chẳng hạn, trong trường hợp tìm kiếm thứ gì đó có chứa "bộ đệm", bạn sẽ làm

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

Và bạn sẽ nhận được:

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

Bằng cách đó, bạn có thể tìm thấy tên của thuật toán để gọi (ftools: fixeddistancebuffer, trong ví dụ được đề xuất trong phần trả lời ở trên)

Bạn có thể biến tập lệnh của mình thành một thuật toán mới trong SEXTANTE. Tài liệu SEXTANTE có thông tin chi tiết về điều đó.


Đó là một mẹo tuyệt vời đáng được đề cập trên blog sextante của bạn. Tôi đã tìm kiếm điều này ngày hôm qua.
underdark
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.