Cómo seleccionar características que contienen una cadena de texto específica usando una expresión en QGIS

13

Necesito diseñar un archivo de forma de polígono de parcela de encuesta, en función de si el polígono es un reclamo mineral o no. Desafortunadamente, la única información sobre si un polígono es un reclamo mineral está contenida en el campo "TÍTULO" de la tabla de atributos, que proporciona el nombre legal completo de la parcela inspeccionada. Por ejemplo, 'DISTRICT LOT 5639, BEING AWARD NO. 2 RECLAMACIONES MINERALES, KDYD '. Necesito una expresión que seleccione cualquier característica que contenga el texto 'RECLAMACIÓN MINERAL' en el campo "TÍTULO".

    
pregunta Chris 08.07.2015 - 03:22

2 respuestas

20

Solo tienes que usar el operador LIKE .

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

El símbolo % actúa como un comodín.

LIKE distingue entre mayúsculas y minúsculas, mientras que ILIKE no lo es.

    
respondido por el SaultDon 08.07.2015 - 03:37
3

Tuve este problema exacto y lo resolví desde la consola de python con expresiones regulares. Si bien la expresión regular puede ser complicada es muy poderosa. Y te quedará con una herramienta que puedes usar con casos de coincidencia más difíciles. Aquí están los documentos . y aquí hay una buena máquina en línea para probar sus cadenas de expresiones regulares.

Primero, aquí está el script rápido que corro para revisar mis cadenas de expresiones regulares en 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 vez que esté satisfecho con su coincidencia de expresiones regulares, puede envolverlo en una función para proporcionar una selección de todas las características que coincidan. A continuación hay una función para hacer precisamente eso.

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)

Necesitará guardar esto en un archivo y ejecutarlo desde el idg de python qgis.

(no probado pero bastante seguro)

    
respondido por el Mr Purple 08.07.2015 - 04:16

Lea otras preguntas en las etiquetas