파이썬을 사용하여 속성을 기반으로 기능을 필터링 하시겠습니까?


16

파이썬을 사용하여 Qgi에서 속성 (arcobjects의 Iqueryfilter와 유사)으로 기능을 얻는 방법은 무엇입니까? 모든 기능을 가져 와서 수동으로 필터링하는 대신 where 절을 사용하여 필터링하는 옵션이 있습니까?

예 : 'Counties'라는 필드 이름이 있습니다. 5 만 개가 넘는 기능이 있습니다. 즉, 시간이 많이 걸리기 때문에 모든 기능을 가져 와서 필터링 할 수 없습니다. 따라서 arcobjects에서 iqueryfilter.whereclause = 'Counties = Norwich'를 사용하여 쿼리 할 수 ​​있습니다. PyQgis에 필요한 것과 비슷한 것입니다.


1
@NathanW 네 맞습니다. 레이어의 쿼리를 사용하여 데이터를 반환하면됩니다. pyqgis에 대한 예를 제공해 주시겠습니까?
venkat

@NathanW 안녕하세요. arcgis에서 정의 쿼리처럼 작동합니다. 이 예를 참조하십시오. t = outputLayer.setSubsetString ( 'UniqID ='+ inputFeat.attribute ( "UniqID"). toPyObject ()) t == True 인 경우 : outputProvider = outputLayer.dataProvider () print outputProvider.featureCount () 즉, 쿼리 만 반환합니다. 만족 된 데이터
venkat

@venkat QGIS 어디에서 쿼리를 하시겠습니까? 감사.
ianbroad

답변:


12

QGIS 표현식 엔진은 다음 QgsFeatureRequest.setFilterExpression( unicode )방법을 사용하여이를 수행 할 수 있습니다 (QGIS 2.2부터).

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

QGIS 2.10부터는 이런 방식으로 필터링하면 다른 유형의 필터링 (파이썬 구현과 같은)에 비해 추가 성능이 제공 될 수도 있습니다.

기본적으로 다음 세 가지 조건이 충족되는 경우 적용됩니다.

  • postgis 공급자와 함께 계층을 사용하고 있습니다 . 현재 (2.16) postgis 공급자 이외의 많은 것 (Spatialite, ogr, oracle ...)이이를 구현하고 있습니다.
  • 귀하의 표현이 지나치게 복잡하지 않습니다 (것 같은 >, =, IN, NOT NULL... 지원)
  • 설정> 옵션> 데이터 소스> 데이터 소스 처리> postgres 서버 측에서 표현식 실행 에서이 기능을 활성화했습니다
  • 데이터베이스 테이블에서 적절한 인덱스를 사용하면 성능 이점이 최적입니다.

QGIS 3.0을 사용하면 간단하게 수행 할 수도 있습니다

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

1

중복 질문에 대한 답변으로 간주 될 수있는 이 게시물 에서는 레이어에서 모든 속성을 가져 오는 방법에 대해 자세히 설명합니다. 저자는 데이터가 반환되면 수동으로 데이터를 필터링하는 것으로 찾고있는 프로세스를 설명합니다. 꽤 완벽한 참고 자료이며 링크가 실제로 도움이 될 것입니다.


2
이것은 중복 질문이 아닙니다. 레이어에서 모든 속성을 가져오고 싶지 않습니다. 먼저 필터링 한 다음 필터 기준에 맞는 기능을 가져 오려고합니다. 즉 성능이 훨씬 좋습니다.
venkat

1

SQL 쿼리를 사용하면을 사용하여 쉽게 가능합니다 ogr. 예를 들어 QGIS python 콘솔 또는 독립형 스크립트에서이 코드를 실행할 수 있습니다.
:

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

SQL 필터 지정은 버전 1.9부터 QGIS API를 사용하여 아직 지원되지 않습니다.

메일 링리스트 기사 에서 알 수 있듯이 "네이티브 공급자의 SQL"에 대한 지원은 향후 릴리스에서만 제공 될 것입니다.

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