Como selecionar recursos que contêm uma sequência de texto específica usando uma expressão no QGIS

15

Preciso estilizar um shapefile de parcela de pesquisa, com base em se o polígono é uma reivindicação mineral ou não. Infelizmente, as únicas informações sobre se um polígono é uma reivindicação mineral ou não estão contidas no campo "TITLE" da tabela de atributos, que fornece o nome legal completo da parcela pesquisada. Por exemplo, 'DISTRITO LOTE 5639, SER PRÊMIO NO. 2 RECLAMAÇÃO MINERAL, KDYD '. Preciso de uma expressão que selecione qualquer recurso que contenha o texto 'MINERAL PLAIM' no campo "TITLE".

Chris
fonte

Respostas:

24

Você só precisa usar o LIKEoperador.

Por exemplo, "TITLE" LIKE '%MINERAL CLAIM%'

O %símbolo atua como um curinga.

LIKEé sensível a maiúsculas e minúsculas ILIKE.

SaultDon
fonte
E lembre-se de que essa é uma operação lenta; convém usá-la uma vez para gerar uma nova coluna em vez de tê-la como expressão o tempo todo.
bugmenot123
É lento para uma forma grande, então eu simplesmente copiei / colei a seleção como uma nova camada vetorial.
Chris
@chris Você pode usar a mesma consulta em outras partes do QGIS, como uma consulta de definição ou com estilo usando renderização baseada em regras - realmente depende do motivo pelo qual você precisa aplicar a consulta (ou seja, análise, visualização, exportação, etc.). As seleções são um pouco intensivas, mas se aplicadas como uma consulta de definição, elas exibem apenas esses recursos na consulta na tela ou os disponibilizam para processamento. Essencialmente, o que você fez ao copiar / colar a seleção como uma nova camada vetorial.
precisa saber é o seguinte
Os índices não podem ser usados ​​com o LIKE, então eu sempre tento evitar repeti-los. Mas sim, pode ser irrelevante. Definitivamente, com pequenos conjuntos de dados, há outras frutas fracas para velocidade.
bugmenot123
1
@ bugmenot123 Acabei de aprender que, se você tiver um índice quando seus dados estiverem no postgresql, o LIKE o usará em condições específicas (como onde% está na consulta) e não fará uma varredura seqüencial! blog.cleverelephant.ca/2016/08/pgsql-text-pattern-ops.html
SaultDon
3

Eu tive esse problema exato e o resolvi no console python com regex. Embora o regex possa ser complicado, é muito poderoso. E você ficará com uma ferramenta que poderá usar em casos de correspondência mais difíceis. Aqui estão os documentos . e aqui está uma boa máquina on-line para testar suas seqüências de caracteres regex.

Primeiramente, aqui está o script rápido que corro para verificar minhas seqüências de caracteres regex no 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"

Quando estiver satisfeito com a correspondência de regex, você poderá agrupá-la em uma função para fornecer uma seleção para todos os recursos correspondentes. Abaixo está uma função para fazer exatamente isso.

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)

Você precisará salvar isso em um arquivo e executá-lo a partir do qgis python ide.

(não testado, mas bastante confiante)

Mr Purple
fonte
1
Um ótimo conselho para aprender regex, mas exagerar no problema em questão.
alphabetasoup
@ alfa-beta-sopa verdade. Nesse caso. No entanto, problemas MUITO semelhantes certamente o considerariam indispensável. números de lote <6000? ou duas primeiras reivindicações minerais? É apenas mais uma resposta (embora muito mais complexa / poderosa). Talvez isso ajude outra pessoa.
Mr Purple
3
Observe também que o QGIS possui uma função de correspondência de expressão regular incorporada - regexp_match.
Ndawson
Certamente, a resposta mais "profunda". Um pouco de exagero pelo que eu preciso, mas agradeço mesmo assim. Com certeza ajudará outras pessoas no futuro.
Chris