কিউজিআইএস-এ একটি এক্সপ্রেশন ব্যবহার করে নির্দিষ্ট পাঠ্য স্ট্রিং সহ বৈশিষ্ট্যগুলি কীভাবে নির্বাচন করবেন


16

বহুভুজ খনিজ দাবি কিনা তা ভিত্তিতে আমার একটি সমীক্ষার পার্সেল বহুভুজ আকৃতি ফাইল স্টাইল করা দরকার। দুর্ভাগ্যক্রমে, বহুভুজ খনিজ দাবী কিনা সে সম্পর্কিত একমাত্র তথ্য বৈশিষ্ট্য সারণীর "টিআইটিএল" ক্ষেত্রটিতে নেই, যা সমীক্ষা করা পার্সেলের পুরো আইনী নাম দেয়। উদাহরণস্বরূপ, 'জেলা লট ৫39৯৯, আওয়ার্ড নন। 2 মিনারেল ক্লেইম, কেডিওয়াইডি '। আমার একটি অভিব্যক্তি দরকার যা "TITLE" ক্ষেত্রে "মিনারেল ক্লাইম" পাঠ্যযুক্ত কোনও বৈশিষ্ট্য নির্বাচন করে।

উত্তর:


25

আপনি শুধু LIKEঅপারেটর ব্যবহার করতে হবে ।

উদাহরণ স্বরূপ, "TITLE" LIKE '%MINERAL CLAIM%'

%প্রতীক একটি ওয়াইল্ড কার্ড মত কাজ করে।

LIKEক্ষেত্রে সংবেদনশীল, যদিও ILIKEনা।


এবং সচেতন হন যে এটি একটি ধীর গতি সম্পন্ন অপারেশন, আপনি এটি সর্বদা প্রকাশের পরিবর্তে নতুন কলাম তৈরি করতে একবার ব্যবহার করতে চাইতে পারেন।
বাগম্যানট 123

এটি বড় আকারের জন্য ধীরে ধীরে, তাই আমি নির্বাচনটিকে একটি নতুন ভেক্টর স্তর হিসাবে অনুলিপি করে আটকিয়েছি।
ক্রিস

@ ক্রিস আপনি কিউজিআইএসের অন্যান্য অংশে যেমন একই সংজ্ঞা ব্যবহার করতে পারেন যেমন একটি সংজ্ঞা ক্যোয়ারী বা নিয়ম ভিত্তিক রেন্ডারিং ব্যবহার করে স্টাইল করা - আপনি কীভাবে ক্যোয়ারী প্রয়োগ করতে হবে তার কারণের উপর নির্ভর করে (যেমন, বিশ্লেষণ, দৃশ্যায়ন, রফতানি ইত্যাদি)। নির্বাচনগুলি কিছুটা নিবিড় হয় তবে যদি সংজ্ঞা কোয়েরি হিসাবে প্রয়োগ করা হয় তবে এটি কেবল ক্যানভাসের কোয়েরিতে থাকা সেই বৈশিষ্ট্যগুলি প্রদর্শন করে বা প্রসেসিংয়ের জন্য তাদের উপলব্ধ করে। নতুন ভেক্টর স্তর হিসাবে নির্বাচনটি অনুলিপি / পেস্ট করার সময় আপনি কী করেছিলেন।
সল্টডন

সূচকগুলি লাইকের সাথে ব্যবহার করা যায় না তাই আমি সর্বদা চেষ্টা করি এগুলি বার বার করা থেকে বিরত থাকুন। তবে হ্যাঁ, এটি অপ্রাসঙ্গিক হতে পারে, স্পষ্টতই ছোট ডেটাসেটের সাথে গতির জন্য আরও কম-ঝুলন্ত ফল রয়েছে।
বাগম্যানট 123

1
@ বাগম্যানট 123 আমি কেবল শিখেছি, আপনার ডেটা পোস্টগ্রিস্কল এ থাকা অবস্থায় আপনার যদি একটি সূচক থাকে তবে LIKE নির্দিষ্ট অবস্থার অধীনে এটি ব্যবহার করবে (যেখানে% কোয়েরিতে রয়েছে) এবং অনুক্রমিক স্ক্যান না করে! blog.cleverelephant.ca/2016/08/pgsql-text-pattern-ops.html
সল্টডন

3

আমার এই সঠিক সমস্যাটি ছিল এবং রেজেক্সের সাথে পাইথন কনসোল থেকে এটি সমাধান করেছিলাম। যদিও রেজেক্সটি খুব শক্তিশালী হতে পারে। এবং আপনি এমন একটি সরঞ্জাম রেখে গেছেন যা আপনি আরও কঠিন ম্যাচের ক্ষেত্রে ব্যবহার করতে পারেন। এখানে ডক্স রয়েছে । এবং এখানে আপনার রেগেক্স স্ট্রিং পরীক্ষা করার জন্য একটি দুর্দান্ত অনলাইন মেশিন

প্রথমত এখানে দ্রুত স্ক্রিপ্ট আমি কিগিসে আমার রেজেক্স স্ট্রিংগুলি পরীক্ষা করতে চালাচ্ছি

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 পাইথন আদর্শ থেকে চালানো উচিত।

(অপরিশোধিত তবে বেশ আত্মবিশ্বাসী)


1
রেগেক্স শিখতে দুর্দান্ত পরামর্শ, তবে হাতের সমস্যার জন্য ওভারকিল।
বর্ণমালা

1
@ আলফা-বিটা-স্যুপ সত্য। এক্ষেত্রে. যাইহোক, খুব অনুরূপ সমস্যা অবশ্যই এটি অনিবার্য বলে মনে করবে। লট সংখ্যা <6000? বা প্রথম 2 খনিজ দাবি? এটি কেবল অন্য একটি (আরও জটিল / শক্তিশালী হলেও) উত্তর। সম্ভবত এটি অন্য কাউকে সাহায্য করবে।
মিঃ বেগুনি

3
এছাড়াও খেয়াল করুন যে কিউজিআইএস-এর নিয়মিত এক্সপ্রেশন ম্যাচের ফাংশনটিতে একটি অন্তর্নির্মিত রয়েছে - regexp_match।
ndawson

অবশ্যই আরও "গভীরতায়" উত্তর। আমার যা প্রয়োজন তার জন্য একটু ওভারকিল করুন, তবে এটির প্রশংসা করুন। এটি নিশ্চিতভাবে ভবিষ্যতে অন্যদের সহায়তা করবে।
ক্রিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.