PyQGIS에서 표현식을 사용하여 기능 선택


13

표현식을 사용하여 PyQGIS에서 기능을 선택하려면 어떻게해야합니까?

QgsExpression선택을 시도 했지만 select 메소드가 사용하지 않습니다.

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

가능합니까? 그렇다면 어떻게해야합니까?

답변:


24

요즘 (QGIS v3.x)

  1. 레이어 참조를 가져옵니다.

    layer = iface.activeLayer()

  2. 표현별로 기능을 선택하십시오.

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


QGIS 2.16 이전

이 단계를 따르세요:

  1. 레이어 참조를 가져옵니다.

    cLayer = iface.mapCanvas().currentLayer()

  2. 표현식에서 featureIterator를 가져옵니다.

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

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. 2에서 얻은 결과에서 기능 ID 목록을 작성하십시오.

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

  4. 3에서 얻은 ID를 가진 기능을 선택하십시오.

    cLayer.setSelectedFeatures( ids )


참고 : 문자열 값 을 사용하여 표현식을 설정하려면 다음과 같이 따옴표를 해당 값에 추가해야합니다.

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

문자열 값이 변수에서 나온 경우 다음을 수행 할 수 있습니다.

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

내가 어떻게 말 "\"ogc_fid\"=482 AND name=\"hello world\""합니까? : 여기이 파이썬에서 사용할 수없는 것을 말한다 qgis.org/api/... . 이 제한을 우회하는 방법을 알고 있습니까?
Jenia Ivanov

2
필드 이름은 큰 따옴표로 묶어야하고 문자열 값은 작은 따옴표로 묶어야하며 숫자에는 따옴표가 필요하지 않습니다. 귀하의 예에서 : "\"ogc_fid\"=482 AND \"name\"='hello world'". BTW, 의견에 포함 된 링크는 실제로 정적 속성 BinaryOperatorText을 Python 바인딩에서 사용할 수 없지만 QgsExpressionPython 바인딩을 통해 사용하더라도 연산자는 작동합니다 .
Germán Carrillo

@ GermánCarrillo 위의 방법을 사용하고 있지만 검색 할 알려진 값을 복사하여 붙여 넣었음에도 불구하고 값을 반환 할 수 없습니다. 열에는 문자열이 포함되어 있으므로 사용했습니다 expr = QgsExpression("\"police_ref\" = 'P0580996'"). 검색어에 작은 따옴표를 구분 문자로 추가하려고 시도했지만 차이가 없습니다. 흥미롭게도, 내가 쿼리하는 속성 테이블을 열고 거기에 표현식 빌더를 사용하는 경우, 예제로 사용하는 police_ref가 첫 번째 행에 있지만 그렇지 않은 경우 선택합니다.
Alex

@ GermánCarrillo 죄송합니다, 내가 다르게 한 일을 확신하지 못하지만 기능을 선택할 수 있습니다! 다른 사람들이 읽을 때는 작은 따옴표를위한 분리 문자가 필요하지 않습니다.
Alex

6

이것은 QGIS Python Console에서 나를 위해 일했습니다.

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

GIS SE에 오신 것을 환영합니다. 신규 사용자는 둘러보기 를 이용하십시오 . 기존의 (그리고 수용된) 답변이 훨씬 더 완벽합니다. 이것이 어떻게 개선됩니까? 일반적으로 평판 점수를 얻는 방법은 답변 되지 않은 질문 에 답변 하는 것이지만 이전 솔루션의 문제를 구체적으로 해결하는 경우 3 년 된 질문에 대한 새로운 완전한 답변을 환영합니다 (이 경우 문제를 분명히 언급해야 함) .
Vince

2

GUI 인터페이스에서 "표현식으로 선택"에서만 테스트하면됩니다. 작동하면 큰 따옴표 ""로 묶은 Python 코드에 붙여 넣을 수 있습니다.

exp = QgsExpression("ogc_fid=482")

문자열과 비교할 경우 작은 따옴표 ''를 추가 할 수 있습니다.

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

파이썬에서도 같은 원리입니다. 큰 따옴표와 작은 따옴표 사이의 차이를 만들 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.