PyQGIS ile ifade kullanarak özellik seçme


13

İfade kullanarak PyQGIS ile özellikleri nasıl seçebilirim?

Bir kullanmayı denedim QgsExpressionama select yöntemi almaz:

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

Bu mümkün mü ve eğer öyleyse, nasıl yaparım?

Yanıtlar:


24

Günümüzde (QGIS v3.x)

  1. Katman referansını alın:

    layer = iface.activeLayer()

  2. Özellikleri ifadeye göre seçin:

    layer.selectByExpression( "\"ogc_fid\"=482" )


QGIS 2.16'dan önce

Bu adımları takip et:

  1. Katman referansını alın:

    cLayer = iface.mapCanvas().currentLayer()

  2. İfadeden bir featureIterator edinin:

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

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. 2'de elde edilen sonuçtan özellik ID'lerinin bir listesini oluşturun:

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

  4. 3'te elde edilen kimliğe sahip özellikleri seçin:

    cLayer.setSelectedFeatures( ids )


Not: dize değeri olan bir ifade ayarlamak istiyorsanız , böyle bir değere tırnak işaretleri eklemeniz gerekir:

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

Dize değeriniz bir değişkenten geliyorsa, bunu yapabilirsiniz:

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

Nasıl söylerim "\"ogc_fid\"=482 AND name=\"hello world\""? Burada bunun python'da mevcut olmadığını söylüyor: qgis.org/api/… . Belki de bu sınırlamayı aşmanın bir yolunu biliyorsunuzdur?
Jenia Ivanov

2
Alan adlarının çift tırnaklı olması, dize değerlerinin tek tırnak içinde olması ve sayıların tırnak içine alınması gerekmediğini unutmayın. Sizin örnekte: "\"ogc_fid\"=482 AND \"name\"='hello world'". BTW, yorumunuza eklediğiniz bağlantı aslında BinaryOperatorTextPython bağlarında statik özniteliğin bulunmadığını, ancak işleçlerin QgsExpressionPython bağlamaları ile kullanılsalar bile çalıştığını belirtiyor .
Germán Carrillo

@ GermánCarrillo Yukarıdaki yönteminizi kullanıyorum, ancak aramak için bilinen bir değeri kopyalayıp yapıştırmasına rağmen herhangi bir değer döndürmek için alamıyorum. Sütun dizeleri içerir, bu yüzden kullandım expr = QgsExpression("\"police_ref\" = 'P0580996'"). Arama terimine (tek tırnak için) bir kesme karakteri eklemeyi denedim ama bir fark yaratmıyor. İlginç bir şekilde, sorguladığım öznitelik tablosunu açar ve orada ifade oluşturucuyu kullanırsam, örnek olarak kullandığım police_ref ilk sıradaysa, ancak başka türlü değilse, bir seçim yapar
Alex

@ GermánCarrillo özür dilerim, farklı ne yaptığımdan emin değilim ama şimdi özellikleri seçmek için alabilirsiniz! Diğerleri okumak için, tek tırnak için bir kırılma karakterine ihtiyacınız yoktur
Alex

6

Bu benim için QGIS Python Konsolunda çalıştı

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

CBS SE'ye hoş geldiniz. Yeni bir kullanıcı olarak, lütfen tura katılın . Mevcut (ve kabul edilmiş) cevap çok daha eksiksiz. Bu nasıl gelişir? Genel olarak, itibar puanı kazanmanın yolu cevaplanmamış soruları cevaplamaktır , ancak önceki çözümle ilgili bir sorunu özellikle ele alıyorsa, üç yıllık bir soruya yeni bir tam cevap memnuniyetle karşılanacaktır (bu durumda sorun kesinlikle belirtilmelidir) .
Vince

2

Yalnızca GUI arayüzünde test etmeniz gerekir: "İfadeye Göre Seç". Çalışırsa, çift tırnak işareti "" ile çevrili Python kodunuza yapıştırabilirsiniz.

exp = QgsExpression("ogc_fid=482")

Bir dizeyle karşılaştırırsanız, tek tırnak ekleyebilirsiniz ''.

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

Python ile aynı prensiptir, çift tırnak ve tek tırnak arasındaki farkı yaratabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.