Як вибрати функції, що містять конкретний текстовий рядок, використовуючи вираз у QGIS


16

Мені потрібно стилізувати форму полігону полігону для опитування, виходячи з того, чи є багатокутник мінеральним твердженням чи ні. На жаль, єдина інформація про те, чи є багатокутник мінеральною претензією чи ні, міститься в полі "НАЗВА" таблиці атрибутів, де дається повна юридична назва обстежуваної посилки. Наприклад, "РАЙОН ЛОТ 5639, БЕЗ НАГОДИ НЕ. 2 МІНЕРАЛЬНЕ ЗАЯВКА, KDYD '. Мені потрібен вираз, який вибирає будь-яку функцію, що містить текст "МІНЕРАЛЬНЕ ПОЛОЖЕННЯ" у полі "НАЗВА".

Відповіді:


25

Вам просто потрібно скористатися LIKEоператором.

Наприклад, "TITLE" LIKE '%MINERAL CLAIM%'

%Символ діє як груповий символ.

LIKEє чутливим до регістру, тоді ILIKEяк ні.


І майте на увазі, що це повільна робота, можливо, ви хочете використовувати її один раз для створення нового стовпця, а не для того, щоб він постійно був виразним.
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
Прекрасна порада вивчити регулярні виразки, але надмірна кількість проблем.
alphabetasoup

1
@ альфа-бета-суп правда. В цьому випадку. Однак ДУЖЕ подібні проблеми, безумовно, вважають його незамінним. числа лотів <6000? або перші 2 мінеральні претензії? Це просто ще одна (хоча і набагато складніша / потужна) відповідь. Можливо, це допоможе комусь іншому.
Містер Пурпла

3
Також зауважте, що QGIS має вбудовану функцію збігу регулярних виразів - regexp_match.
ndawson

Безумовно, чим більше "глибокої" відповіді. Трохи надмірності для того, що мені потрібно, але все-таки ціную це. Це точно допоможе іншим у майбутньому.
Кріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.