วิธีการเลือกคุณสมบัติที่มีสตริงข้อความเฉพาะโดยใช้นิพจน์ใน QGIS


16

ฉันต้องการสไตล์การสำรวจรูปร่างรูปหลายเหลี่ยมพัสดุพัสดุขึ้นอยู่กับว่ารูปหลายเหลี่ยมที่เป็นสิทธิแร่หรือไม่ น่าเสียดายที่ข้อมูลเดียวว่ารูปหลายเหลี่ยมนั้นเป็นสิทธิ์แร่หรือไม่อยู่ในฟิลด์ "TITLE" ของตารางแอตทริบิวต์ซึ่งให้ชื่อเต็มตามกฎหมายของพัสดุที่สำรวจ ตัวอย่างเช่น 'DISTRICT LOT 5639 ที่ได้รับรางวัลหมายเลข การเรียกร้อง 2 MINERAL, KDYD ' ฉันต้องการนิพจน์ที่เลือกคุณลักษณะใด ๆ ที่มีข้อความ 'MINERAL CLAIM' ในฟิลด์ "TITLE"

คำตอบ:


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 console ด้วย regex ในขณะที่ regex สามารถหากินมันมีประสิทธิภาพมาก และคุณจะเหลือเครื่องมือที่ใช้กับกรณีการจับคู่ที่ยากขึ้น นี่คือเอกสารที่มี และนี่คือเครื่องออนไลน์ที่ดีสำหรับการทดสอบสตริง regex ของคุณ

ประการแรกนี่คือสคริปต์ด่วนที่ฉันเรียกใช้เพื่อตรวจสอบสตริง regex ของฉันใน 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"

เมื่อคุณพอใจกับการจับคู่ regex ของคุณคุณสามารถสรุปมันในฟังก์ชั่นเพื่อให้การเลือกสำหรับคุณสมบัติทั้งหมดที่ตรงกับ ด้านล่างเป็นฟังก์ชั่นที่ต้องทำ

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
คำแนะนำที่ดีในการเรียนรู้ regex แต่ overkill สำหรับปัญหาที่เกิดขึ้นในมือ
alphabetasoup

@ alpha-beta-soup จริง ในกรณีนี้. อย่างไรก็ตามปัญหาที่คล้ายกันอย่างมากแน่นอนจะพบว่ามันขาดไม่ได้ จำนวนมาก <6000 หรือไม่ หรือเรียกร้องแร่ 2 ครั้งแรก? มันเป็นอีกคำตอบหนึ่ง (แม้ว่าจะมีคำตอบที่ซับซ้อน / มีพลังมากขึ้น) อาจช่วยคนอื่นได้
Mr Purple

3
นอกจากนี้โปรดทราบว่า QGIS มีฟังก์ชั่นการจับคู่นิพจน์ทั่วไป - regexp_match
ndawson

แน่นอนคำตอบ "เชิงลึก" เพิ่มเติม overkill เล็กน้อยสำหรับสิ่งที่ฉันต้องการ แต่ขอบคุณมันอย่างไรก็ตาม มันจะช่วยคนอื่นในอนาคตอย่างแน่นอน
คริส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.