Как выбрать объекты, содержащие определенную текстовую строку, используя выражение в QGIS

16

Мне нужно оформить шейп-файл полигона для обследования, основываясь на том, является ли полигон искомым минералом или нет. К сожалению, единственная информация о том, является ли полигон иском-минералом или нет, содержится в поле «НАЗВАНИЕ» таблицы атрибутов, которое дает полное юридическое название исследуемой посылки. Например, «РАЙОН ЛОТ 5639, НЕТ НАГРАДЫ. 2 МИНЕРАЛЬНАЯ ПРЕТЕНЗИЯ, КДЫДЬ. Мне нужно выражение, которое выбирает любую функцию, содержащую текст «МИНЕРАЛЬНАЯ ПРЕТЕНЗИЯ» в поле «НАЗВАНИЕ».

Крис
источник

Ответы:

25

Вы просто должны использовать LIKEоператора.

Например, "TITLE" LIKE '%MINERAL CLAIM%'

%Символ действует как групповой символ.

LIKEчувствителен к регистру, а ILIKEнет.

SaultDon
источник
И имейте в виду, что это медленная операция, вы можете использовать ее один раз для создания нового столбца вместо того, чтобы все время использовать его в качестве выражения.
bugmenot123
Это медленно для большой фигуры, поэтому я просто скопировал / вставил выделение как новый векторный слой.
Крис
@chris Вы можете использовать этот же запрос в других частях QGIS, например, как запрос определения или стилизованный с использованием рендеринга на основе правил - на самом деле это зависит от причины, по которой вам нужно применить запрос (например, анализ, визуализация, экспорт и т. д.). Выборы являются немного интенсивными, но если они применяются как запрос определения, тогда они только отображают эти функции в запросе на холсте или делают их доступными для обработки. По сути, что вы сделали, когда копировали / вставляли выделение как новый векторный слой.
SaultDon
Индексы нельзя использовать с LIKE, поэтому я всегда стараюсь не делать их снова и снова. Но да, это может быть неуместно, определенно с небольшими наборами данных есть другие низко висящие фрукты для скорости.
bugmenot123
1
@ bugmenot123 Я только что узнал, что если у вас есть индекс, когда ваши данные находятся в postgresql, LIKE будет использовать его в определенных условиях (например, где% в запросе) и не будет выполнять последовательное сканирование! blog.cleverelephant.ca/2016/08/pgsql-text-pattern-ops.html
SaultDon
3

У меня была именно эта проблема, и я решил ее с консоли Python с помощью регулярных выражений. Хотя регулярные выражения могут быть хитрыми, они очень мощные. И у вас останется инструмент, который вы можете использовать в более сложных случаях совпадения. Вот документы . и вот хорошая онлайн-машина для тестирования ваших регулярных выражений.

Во-первых, вот быстрый скрипт, который я запускаю, чтобы проверить мои строки регулярных выражений в 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
Отличный совет по изучению регулярных выражений, но излишняя проблема.
алфавитное представление
@ Альфа-бета-суп правда. В таком случае. Тем не менее, ОЧЕНЬ похожие проблемы наверняка найдут это необходимым. номера лотов <6000? или первые 2 минеральных претензии? Это просто еще один (хотя и гораздо более сложный / мощный) ответ. Возможно, это поможет кому-то еще.
Мистер Пурпур
3
Также обратите внимание, что QGIS имеет встроенную функцию сопоставления регулярных выражений - regexp_match.
ndawson
Конечно, более «глубокий» ответ. Немного излишеств за то, что мне нужно, но, тем не менее, ценю это. Это наверняка поможет другим в будущем.
Крис