Làm cách nào để chọn các tính năng sử dụng biểu thức với pyqgis?


11

Làm cách nào tôi có thể chọn các tính năng với pyqgis bằng biểu thức?

Tôi đã thử sử dụng QssExpression nhưng phương thức chọn không thực hiện được:

exp = QgsExpression("'ogc_fid' = 482")
cLayer = canvas.currentLayer()
cLayer.select(exp)

Có thể và nếu vậy, làm thế nào để tôi làm điều đó?

Câu trả lời:


23

Thực hiện theo các bước sau:

  1. Lấy tham chiếu lớp:

    cLayer = iface.mapCanvas().currentLayer()

  2. Nhận một FeatureIterator từ một biểu thức:

    expr = QgsExpression( "\"ogc_fid\"=482" )

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. Xây dựng danh sách Id tính năng từ kết quả thu được trong 2.:

    ids = [i.id() for i in it]

  4. Chọn các tính năng với id thu được trong 3.:

    cLayer.setSelectedFeatures( ids )


LƯU Ý: Nếu bạn muốn đặt biểu thức có giá trị chuỗi , bạn cần thêm dấu ngoặc kép vào giá trị đó, theo cách này:

expr = QgsExpression( " \"name\" = 'my string' " )

Nếu giá trị chuỗi của bạn đến từ một biến, bạn có thể làm điều này:

myVariable = 'my string'
expr = QgsExpression( " \"name\" = '{}' ".format(myVariable) )

Làm thế nào để tôi nói "\"ogc_fid\"=482 AND name=\"hello world\""? Ở đây nó nói rằng cái này không có sẵn trong python: qgis.org/api/ . Có lẽ bạn biết một cách để phá vỡ giới hạn này?
Jenia Ivanov

2
Hãy nhớ rằng tên trường phải được trích dẫn kép, giá trị chuỗi được trích dẫn đơn và số không cần dấu ngoặc kép. Trong ví dụ của bạn : "\"ogc_fid\"=482 AND \"name\"='hello world'". BTW, liên kết bạn đưa vào nhận xét của bạn thực sự nói rằng thuộc tính tĩnh BinaryOperatorTextkhông có sẵn trong các ràng buộc Python, nhưng các toán tử vẫn hoạt động QgsExpression, ngay cả khi chúng được sử dụng thông qua các ràng buộc Python.
Germán Carrillo

@ GermánCarrillo Tôi đang sử dụng phương pháp của bạn ở trên nhưng không thể lấy nó để trả về bất kỳ giá trị nào, mặc dù đã sao chép và dán một giá trị đã biết để tìm kiếm. Cột chứa chuỗi, vì vậy tôi đã sử dụng expr = QgsExpression("\"police_ref\" = 'P0580996'"). Tôi đã thử thêm một ký tự ngắt vào cụm từ tìm kiếm (đối với dấu ngoặc đơn) nhưng nó không tạo ra sự khác biệt. Thật thú vị, nếu tôi mở bảng thuộc tính mà tôi đang truy vấn và sử dụng trình tạo biểu thức ở đó, nó sẽ đưa ra lựa chọn nếu Police numf tôi sử dụng làm ví dụ ở hàng đầu tiên, nhưng không phải vậy
Alex

@ GermánCarrillo xin lỗi đừng bận tâm điều đó, tôi không chắc mình đã làm gì khác nhưng tôi có thể lấy nó để chọn các tính năng ngay bây giờ! Đối với những người khác đọc, bạn không cần một ký tự ngắt cho các trích dẫn duy nhất
Alex

3

Điều này làm việc cho tôi trên Bảng điều khiển Python của QGIS

layer = qgis.utils.iface.activeLayer()
layer .selectByExpression(" \"ogc_fid\" = '{}' ".format(482))

Chào mừng bạn đến với GIS SE. Là người dùng mới, vui lòng tham gia Tour . Câu trả lời hiện có (và được chấp nhận) là đầy đủ hơn nhiều. Làm thế nào để cải thiện điều này? Nói chung, cách kiếm điểm danh tiếng là trả lời các câu hỏi chưa được trả lời , nhưng một câu trả lời hoàn chỉnh mới cho câu hỏi cũ ba năm sẽ được hoan nghênh nếu nó giải quyết cụ thể một vấn đề với giải pháp trước đó (trong trường hợp đó, vấn đề chắc chắn nên được đề cập) .
Vince

1

Bạn chỉ cần kiểm tra nó trong giao diện GUI: "Chọn theo biểu thức". Nếu nó hoạt động, bạn có thể dán nó vào mã Python của bạn được bao quanh bởi dấu ngoặc kép "".

exp = QgsExpression("ogc_fid=482")

Nếu bạn so sánh với một chuỗi, bạn có thể thêm một trích dẫn ''.

exp = QgsExpression("ogc_fid='482'")

Đó là cùng một nguyên tắc trong python, nó có thể tạo ra sự khác biệt giữa trích dẫn kép và trích dẫn đơn.

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.