QGIS'te ifade kullanarak belirli metin dizesi içeren özellikler nasıl seçilir


16

Çokgen bir mineral iddiası olup olmadığına bağlı olarak bir anket parsel poligon şekil dosyası stil vermeliyim. Ne yazık ki, bir çokgenin maden iddiası olup olmadığına dair tek bilgi, incelenen parselin tam yasal adını veren nitelik tablosunun "TITLE" alanında yer almaktadır. Örneğin, 'BÖLGE LOT 5639, ÖDÜL NO. 2 MİNERAL İDDİA, KDYD '. "TITLE" alanında 'MINERAL CLAIM' metnini içeren herhangi bir özelliği seçen bir ifadeye ihtiyacım var.

Yanıtlar:


25

Sadece LIKEoperatörü kullanmalısın .

Örneğin, "TITLE" LIKE '%MINERAL CLAIM%'

%Sembol joker gibi davranır.

LIKEbüyük / küçük harf duyarlıdır, oysa duyarlı ILIKEdeğildir.


Ve bunun yavaş bir işlem olduğunu unutmayın, her zaman ifade olarak yeni bir sütun oluşturmak için bir kez kullanmak isteyebilirsiniz.
Bugmenot123

Büyük bir şekil için yavaş, bu yüzden seçimi yeni bir vektör katmanı olarak basit bir şekilde kopyaladım / yapıştırdım.
Chris

@chris Aynı sorguyu QGIS'nin diğer bölümlerinde tanım sorgusu gibi kullanabilir veya kural tabanlı oluşturma kullanarak stil uygulayabilirsiniz - gerçekten sorguyu uygulamanızın nedenine (yani, analiz, görselleştirme, dışa aktarma vb.) bağlıdır. Seçimler biraz yoğundur, ancak bir tanım sorgusu olarak uygulanırsa, yalnızca tuval üzerindeki sorguda bu özellikleri görüntüler veya bunları işlenebilir hale getirir. Esasen, seçimi yeni bir vektör katmanı olarak kopyalarken / yapıştırırken yaptığınız şey.
SaultDon

Dizinler LIKE ile kullanılamaz, bu yüzden her zaman tekrar tekrar yapmaktan kaçınmaya çalışırım. Ancak evet, ilgisiz olabilir, kesinlikle küçük veri kümeleriyle hız için düşük asılı başka meyveler vardır.
Bugmenot123

1
@ bugmenot123 Az önce öğrendim ki, verileriniz postgresql'deyken bir indeksiniz varsa, LIKE bunu belirli koşullar altında kullanacaktır (%, sorguda olduğu gibi) ve sıralı bir tarama yapmaz! blog.cleverelephant.ca/2016/08/pgsql-text-pattern-ops.html
SaultDon

3

Bu kesin sorunu yaşadım ve regex ile python konsolundan çözdüm. Normal ifade zor olsa da çok güçlü. Ve daha zor eşleşme durumlarında kullanabileceğiniz bir araç bırakacaksınız. İşte dokümanlar . ve regex dizelerinizi test etmek için güzel bir çevrimiçi makine .

Birincisi, qge'de regex dizelerimi kontrol etmek için çalıştırdığım hızlı komut dosyası

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"

Normal ifade eşlemenizden memnun olduğunuzda, eşleşen tüm özellikler için bir seçim sağlamak için bir işlevde tamamlayabilirsiniz. Aşağıda bunu yapmak için bir işlev var.

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)

Bunu bir dosyaya kaydetmeniz ve qgis python ide'den çalıştırmanız gerekir.

(denenmemiş ama kendinden emin)


1
Regex öğrenmek için büyük tavsiye, ama eldeki sorun için overkill.
alphabetasoup

1
@ alfa-beta-çorba doğru. Bu durumda. Ancak, ÇOK benzer sorunlar kesinlikle vazgeçilmez bulur. parti numaraları <6000? ya da ilk 2 mineral iddiası? Bu sadece başka (daha karmaşık / güçlü olsa da) bir cevap. Belki de başka birine yardımcı olacaktır.
Bay Purple

3
Ayrıca, QGIS'in normal ifade eşleme işlevi olan regexp_match olduğuna dikkat edin.
ndawson

Kesinlikle daha "derin" cevap. İhtiyacım olan şey için biraz abartılı ama yine de takdir ediyorum. Kesinlikle gelecekte başkalarına yardımcı olacaktır.
Chris
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.