QGIS에서 표현식을 사용하여 특정 텍스트 문자열을 포함하는 기능을 선택하는 방법


16

다각형이 광물 주장인지 여부에 따라 측량 구획 다각형 모양 파일의 스타일을 지정해야합니다. 불행하게도, 다각형이 광물 청구인지 아닌지에 대한 유일한 정보는 속성 테이블의 "TITLE"필드에 포함되어 있으며, 이는 측량 된 소포의 법적 이름을 나타냅니다. 예를 들어, '지구 번호 5639, BEING AWARD NO. 2 미네랄 클레임, KDYD '. "TITLE"필드에 'MINERAL CLAIM'텍스트가 포함 된 기능을 선택하는 표현식이 필요합니다.

답변:


25

당신은 LIKE연산자를 사용해야합니다 .

예를 들어 "TITLE" LIKE '%MINERAL CLAIM%'

%기호는 와일드 카드처럼 작동합니다.

LIKE대소 문자를 구분하지만 ILIKE그렇지 않습니다.


그리고 이것은 느린 작업이므로 항상 식으로 사용하지 않고 한 번만 사용하여 새 열을 생성 할 수 있습니다.
bugmenot123

큰 모양의 경우 속도가 느리므로 선택 영역을 새 벡터 레이어로 간단하게 복사 / 붙여 넣기했습니다.
Chris

@ chris 정의 쿼리 나 규칙 기반 렌더링을 사용하여 스타일을 지정하는 등 QGIS의 다른 부분에서 동일한 쿼리를 사용할 수 있습니다. 실제로 쿼리를 적용해야하는 이유 (예 : 분석, 시각화, 내보내기 등)에 따라 다릅니다. 선택은 약간 집중적이지만 정의 쿼리로 적용되는 경우 쿼리의 해당 기능 만 캔버스에 표시하거나 처리 할 수있게합니다. 기본적으로 선택 영역을 새 벡터 레이어로 복사 / 붙여 넣기 할 때 수행 한 작업.
SaultDon

LIKE와 함께 색인을 사용할 수 없으므로 항상 반복해서 색인하지 마십시오. 그러나 그렇습니다. 소규모의 데이터 세트를 사용하면 속도가 느릴 다른 과일이 있습니다.
bugmenot123

1
@ bugmenot123 방금 배웠습니다. 데이터가 postgresql에있을 때 색인이 있으면 LIKE는 특정 조건 (예 : 쿼리가있는 위치)에서 연속 스캔을하지 않습니다! blog.cleverelephant.ca/2016/08/pgsql-text-pattern-ops.html
SaultDon

3

나는이 정확한 문제가 있었고 정규식을 사용하여 파이썬 콘솔에서 해결했습니다. 정규식은 까다로울 수 있지만 매우 강력합니다. 그리고 더 어려운 성냥 케이스에 사용할 수있는 도구가 남게됩니다. 여기 문서가 있습니다. 그리고 여기에 좋은 온라인 기계 정규식 문자열을 테스트.

첫 번째는 qgis에서 정규식 문자열을 확인하기 위해 실행하는 빠른 스크립트입니다.

import re
RES_STRING='MINERAL CLAIM'
REGEX_HAYSTACK='DISTRICT LOT 5639, BEING AWARD NO. 2 MINERAL CLAIM, KDYD'

REGEX_STRING=re.compile(RES_STRING)
print "searching for "+RES_STRING+" in "+REGEX_HAYSTACK
REGEX_MATCH = REGEX_STRING.search(REGEX_HAYSTACK)
if REGEX_MATCH:
    print "found '"+REGEX_MATCH.group()+"'"
else:
    print "No match found"

정규식 일치에 만족하면 함수로 묶어 일치하는 모든 기능을 선택할 수 있습니다. 아래는 바로 그 기능입니다.

def select_by_regex(input_layer,attribute_name,regex_string):
    import re
    RES_STRING=regex_string
    attribute_name_idx = input_layer.fieldNameIndex(attribute_name)
    if attribute_name_idx<0:
        raise valueError("cannot find attribute"+attribute_name)
    else:
        fids=[]
        for feature in input_layer.getFeatures():
            REGEX_HAYSTACK=feature[attribute_name_idx]
            REGEX_STRING=re.compile(RES_STRING)
            REGEX_MATCH = REGEX_STRING.search(REGEX_HAYSTACK)
            if REGEX_MATCH:
                fids.append(feature.id())
            else:
                pass
        input_layer.setSelectedFeatures(fids)


#USAGE BIT
input_layer = QgsVectorLayer('path/to/shape/file.shp','layer name', 'ogr')
QgsMapLayerRegistry.instance().addMapLayer(input_layer)   
regex_string='MINERAL CLAIM'
attribute_name='TITLE'
select_by_regex(input_layer,attribute_name,regex_string)

이것을 파일로 저장하고 qgis python ide에서 실행해야합니다.

(예상하지만 자신감이 있음)


1
정규식을 배우는 데 도움이되는 조언은 있지만 현재 문제에 대해서는 과도합니다.
alphabetasoup

@ alpha-beta-soup true입니다. 이 경우 그러나 매우 유사한 문제는 확실히 없어서는 안될 것입니다. 로트 번호 <6000? 또는 처음 2 광물 청구? 그것은 또 다른 (훨씬 더 복잡하고 강력한) 대답입니다. 아마도 그것은 다른 사람을 도울 것입니다.
Mr Purple

3
또한 QGIS에는 정규 표현식 일치 함수 인 regexp_match가 내장되어 있습니다.
ndawson

확실히 더 깊이있는 답변입니다. 내가 필요한 것에 약간의 과잉이지만 그럼에도 불구하고 감사합니다. 앞으로 다른 사람들을 도울 것입니다.
Chris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.