Tính năng lọc dựa trên các thuộc tính của chúng bằng Python?


16

Làm cách nào để có được các tính năng theo thuộc tính của chúng (tương tự Iqueryfilter trong arcobjects) trong Qgis bằng python? Thay vì nhận tất cả các tính năng và lọc nó theo cách thủ công, có tùy chọn nào để sử dụng mệnh đề where để lọc nó không?

Ví dụ: Tôi có một tên trường gọi là 'Các hạt'. Nó có hơn năm mươi nghìn tính năng. Không thể tìm nạp tất cả các tính năng và lọc nó vì tốn thời gian. Vì vậy, tôi có thể truy vấn nó bằng cách sử dụng iqueryfilter.whereclause = 'Counties = Norwich' trong arcobjects. Điều tương tự tôi cần ở PyQgis.


1
@NathanW vâng bạn đúng. tôi chỉ cần trả về dữ liệu bằng cách sử dụng truy vấn từ lớp. bạn có thể vui lòng cung cấp cho tôi bất kỳ ví dụ trong pyqgis?
venkat

@NathanW Xin chào, tôi hiểu rồi. nó hoạt động như truy vấn định nghĩa trong arcgis. xem ví dụ này t = outputLayer.setSubsetString ('UniqID =' + inputFeat.attribution ("UniqID"). toPyObject ()) nếu t == True: outputProvider = outputLayer.dataProvider () print outputProvider.feature dữ liệu hài lòng
venkat

@venkat bạn đang đặt truy vấn ở đâu trong QGIS? Cảm ơn.
ianbroad

Câu trả lời:


12

Công cụ biểu thức QGIS có thể thực hiện việc này bằng QgsFeatureRequest.setFilterExpression( unicode )phương thức (Kể từ QGIS 2.2)

request = QgsFeatureRequest().setFilterExpression( u'"Counties" = \'Norwich\'' )
it = l.getFeatures( request )

Bắt đầu với QGIS 2.10, thậm chí có khả năng lọc theo cách như vậy sẽ cung cấp cho bạn một số hiệu suất bổ sung so với các loại lọc khác (như triển khai python).

Về cơ bản điều này áp dụng nếu đáp ứng ba điều kiện sau:

  • Bạn đang sử dụng một lớp với nhà cung cấp postgis Tại thời điểm này (2.16), nhiều hơn là chỉ nhà cung cấp postgis thực hiện điều này (spatialite, ogr, oracle ...).
  • Biểu hiện của bạn không quá phức tạp (những thứ như thế >, =, IN, NOT NULL... được hỗ trợ)
  • Bạn đã bật tính năng này trong Cài đặt> Tùy chọn> Nguồn dữ liệu> Xử lý nguồn dữ liệu> Thực hiện biểu thức ở phía máy chủ postgres
  • Lợi ích hiệu suất là tối ưu với các chỉ mục thích hợp trên các bảng cơ sở dữ liệu

Với QGIS 3.0, thậm chí có thể chỉ cần làm

features = l.getFeatures('"Counties" = \'Norwicth\'')

1

Bài đăng này - có thể được coi là một câu trả lời cho một câu hỏi trùng lặp - chi tiết cách tìm nạp tất cả các thuộc tính từ một lớp. Tác giả mô tả quá trình bạn đang tìm kiếm là lọc dữ liệu theo cách thủ công sau khi được trả về. Đây là một tài liệu tham khảo khá đầy đủ và liên kết của họ sẽ thực sự giúp bạn hiểu.


2
Đây không phải là một câu hỏi trùng lặp. tôi không muốn tìm nạp tất cả các thuộc tính từ một lớp. Lọc nó trước và sau đó tôi muốn tìm nạp các tính năng theo tiêu chí lọc. tức là hiệu suất tốt hơn nhiều.
venkat

1

Bằng cách sử dụng một truy vấn sql nó cũng dễ dàng có thể với ogr. Bạn có thể thực thi mã này chẳng hạn trong bảng điều khiển python của QGIS hoặc một tập lệnh độc lập.
Ví dụ :

from osgeo import ogr

path = "path to your shapefile.shp"
ID = "FieldID" # For instance 'Countries' 
datasource = ogr.Open(str(path)) # your datasource

layer = datasource.GetLayer(0) # Import layer 0 --> only works with shapefiles
layerName = str( layer.GetName() )# Save the Layersname first

# Do the sql query
# Selects all features from a layer datasource where Field Countries is equal to 'Germany'
layers = datasource.ExecuteSQL("SELECT * FROM %s WHERE %s = '%s'" % (layerName, ID, 'Germany') )
res = []
for i in range(0,layers.GetFeatureCount()):
   f = layers.GetFeature(i)
   g = f.GetGeometryRef()
   res.append(g.Area()) 

# res now contains the measured area of each feature where the attribute ID has the value 'Germany'

0

Chỉ định các bộ lọc SQL chưa được hỗ trợ bằng API QGIS kể từ phiên bản 1.9.

Theo tôi hiểu từ bài viết danh sách gửi thư này , hỗ trợ cho "SQL của nhà cung cấp bản địa" sẽ chỉ có trong một bản phát hành trong tương lai.

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.