Cách chọn các tính năng chứa chuỗi văn bản cụ thể bằng cách sử dụng biểu thức trong QGIS


15

Tôi cần tạo kiểu cho một shapefile đa giác khảo sát, dựa trên việc đa giác có phải là một yêu cầu khoáng sản hay không. Thật không may, thông tin duy nhất về việc đa giác có phải là một yêu cầu khoáng sản hay không được chứa trong trường "TITLE" của bảng thuộc tính, cung cấp tên pháp lý đầy đủ của lô đất được khảo sát. Chẳng hạn, 'QUẬN 5639, ĐƯỢC GIẢI THƯỞNG SỐ. 2 YÊU CẦU KHOÁNG SẢN, KDYD '. Tôi cần một biểu thức chọn bất kỳ tính năng nào chứa văn bản 'YÊU CẦU KHOÁNG SẢN' trong trường "TITLE".

Câu trả lời:


24

Bạn chỉ cần sử dụng các LIKEtoán tử.

Ví dụ, "TITLE" LIKE '%MINERAL CLAIM%'

Các %biểu tượng hoạt động như một ký tự đại diện.

LIKElà trường hợp nhạy cảm, trong khi ILIKEkhông.


Và lưu ý rằng đây là một hoạt động chậm, bạn có thể muốn sử dụng nó một lần để tạo một cột mới thay vì luôn luôn là biểu thức.
bugmenot123

Nó là chậm cho một hình dạng lớn, vì vậy tôi đơn giản sao chép / dán lựa chọn như một lớp vector mới.
Chris

@chris Bạn có thể sử dụng cùng một truy vấn đó trong các phần khác của QGIS như truy vấn định nghĩa hoặc được tạo kiểu bằng cách sử dụng kết xuất dựa trên quy tắc - thực sự phụ thuộc vào lý do tại sao bạn cần áp dụng truy vấn (ví dụ: phân tích, trực quan hóa, xuất, v.v.). Các lựa chọn hơi chuyên sâu nhưng nếu được áp dụng như một truy vấn định nghĩa thì nó chỉ hiển thị các tính năng đó trong truy vấn trên khung vẽ hoặc làm cho chúng có sẵn để xử lý. Về cơ bản những gì bạn đã làm khi sao chép / dán lựa chọn dưới dạng một lớp vectơ mới.
SaultDon

Chỉ mục không thể được sử dụng với THÍCH vì vậy tôi luôn cố gắng tránh làm đi làm lại nhiều lần. Nhưng vâng, nó có thể không liên quan, chắc chắn với các bộ dữ liệu nhỏ có các loại trái cây treo thấp khác cho tốc độ.
bugmenot123

1
@ bugmenot123 Tôi mới biết rằng, nếu bạn có một chỉ mục khi dữ liệu của bạn ở dạng postgresql, thì THÍCH sẽ sử dụng nó trong các điều kiện cụ thể (như% nằm trong truy vấn) và không thực hiện quét tuần tự! blog.cleverelephant.ca/2016/08/pgsql-text-potype-ops.html
SaultDon

3

Tôi đã có vấn đề chính xác này và giải quyết nó từ bảng điều khiển python bằng regex. Trong khi regex có thể khó, nó rất mạnh. Và bạn sẽ được để lại một công cụ bạn có thể sử dụng với các trường hợp khớp khó hơn. Dưới đây là các tài liệu . và đây là một máy trực tuyến tốt để kiểm tra chuỗi regex của bạn.

Đầu tiên ở đây là tập lệnh nhanh tôi chạy để kiểm tra chuỗi regex của tôi trong 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"

Khi bạn hài lòng với kết hợp regex của mình, bạn có thể kết hợp nó trong một hàm để cung cấp lựa chọn cho tất cả các tính năng phù hợp. Dưới đây là một chức năng để làm điều đó.

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)

Bạn sẽ cần lưu tệp này vào một tệp và chạy nó từ ide python của qgis.

(chưa được kiểm tra nhưng khá tự tin)


1
Lời khuyên tuyệt vời để học regex, nhưng quá mức cho vấn đề trong tầm tay.
alphabetasoup

@ alpha-beta-súp đúng. Trong trường hợp này. Tuy nhiên, những vấn đề tương tự RẤT chắc chắn sẽ tìm thấy nó không thể thiếu. số lô <6000? hoặc 2 yêu cầu khoáng sản đầu tiên? Đó chỉ là một câu trả lời khác (mặc dù phức tạp / mạnh mẽ hơn nhiều). Có lẽ nó sẽ giúp người khác.
Mr Purple

3
Cũng lưu ý rằng QGIS có chức năng đối sánh biểu thức chính quy được xây dựng - regapi_match.
ndawson

Chắc chắn câu trả lời "sâu hơn". Một chút quá mức cho những gì tôi cần, nhưng dù sao cũng đánh giá cao nó. Nó chắc chắn sẽ giúp đỡ người khác trong tương lai.
Chris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.