Come selezionare le funzioni che contengono una stringa di testo specifica usando un'espressione in QGIS


15

Ho bisogno di modellare uno shapefile del poligono del pacco di rilevamento, basato sul fatto che il poligono sia un reclamo minerale o meno. Sfortunatamente, le uniche informazioni sul fatto che un poligono sia un reclamo minerale o meno sono contenute nel campo "TITOLO" della tabella degli attributi, che fornisce il nome legale completo del pacco esaminato. Ad esempio, "DISTRICT LOT 5639, BEING AWARD NO. 2 RECLAMI MINERALI, KDYD '. Ho bisogno di un'espressione che selezioni qualsiasi funzione contenente il testo "RECLAMI MINERALI" nel campo "TITOLO".

Risposte:


24

Devi solo usare l' LIKEoperatore.

Per esempio, "TITLE" LIKE '%MINERAL CLAIM%'

Il %simbolo si comporta come un jolly.

LIKEè sensibile al maiuscolo / minuscolo, mentre ILIKEnon lo è.


E tieni presente che si tratta di un'operazione lenta, potresti volerla usare una volta per generare una nuova colonna invece di averla sempre come espressione.
bugmenot123

È lento per una forma grande, quindi ho semplicemente copiato / incollato la selezione come nuovo livello vettoriale.
Chris,

@chris È possibile utilizzare la stessa query in altre parti di QGIS come una query di definizione o in stile utilizzando il rendering basato su regole - dipende in realtà dal motivo per cui è necessario applicare la query (ad esempio, analisi, visualizzazione, esportazione, ecc.). Le selezioni sono un po 'intense, ma se applicate come query di definizione, visualizzano solo quelle funzionalità nella query nell'area di disegno o le rendono disponibili per l'elaborazione. Essenzialmente quello che hai fatto quando hai copiato / incollato la selezione come nuovo livello vettoriale.
SaultDon

Gli indici non possono essere usati con LIKE, quindi cerco sempre di evitare di farlo più e più volte. Ma sì, potrebbe essere irrilevante, sicuramente con piccoli set di dati ci sono altri frutti a bassa pendenza per la velocità.
bugmenot123

1
@ bugmenot123 Ho appena appreso che se hai un indice quando i tuoi dati sono in postgresql, LIKE li utilizzerà in condizioni specifiche (come dove si trova la% nella query) e non esegue una scansione sequenziale! blog.cleverelephant.ca/2016/08/pgsql-text-pattern-ops.html
SaultDon

3

Ho avuto questo esatto problema e l'ho risolto dalla console Python con regex. Mentre regex può essere complicato, è molto potente. E ti verrà lasciato uno strumento che puoi usare con casi di match più difficili. Ecco i documenti . ed ecco una bella macchina online per testare le tue stringhe regex.

Innanzitutto ecco lo script rapido che eseguo per controllare le mie stringhe regex in 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"

Una volta che sei soddisfatto della tua corrispondenza regex, puoi racchiuderlo in una funzione per fornire una selezione per tutte le funzionalità corrispondenti. Di seguito è una funzione per fare proprio questo.

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)

Dovrai salvarlo in un file ed eseguirlo dall'ide python di qgis.

(non testato ma abbastanza sicuro)


1
Ottimo consiglio per imparare regex, ma eccessivo per il problema a portata di mano.
alphabetasoup,

@ alpha-beta-soup true. In questo caso. Tuttavia, problemi MOLTO simili sarebbero certamente indispensabili. numeri di lotto <6000? o prime 2 affermazioni minerali? È solo un'altra risposta (anche se molto più complessa / potente). Forse aiuterà qualcun altro.
Mr Purple,

3
Si noti inoltre che QGIS ha una funzione di corrispondenza delle espressioni regolari incorporata: regexp_match.
ndawson,

Certamente la risposta più "approfondita". Un po 'eccessivo per quello che mi serve, ma lo apprezzo comunque. Sicuramente aiuterà gli altri in futuro.
Chris,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.