lookupField() PyQGIS-ში¶
lookupField() — ვექტორული ფენის (QgsVectorLayer) ატრიბუტების ცხრილში კონკრეტული სვეტის (ველის) ინდექსის მოსაძებნად გამოიყენება მისი სახელის მიხედვით.
🔑 ძირითადი იდეა¶
QGIS-ის ფუნქციების უმეტესობა ველთან მუშაობისას ითხოვს არა მის სახელს (მაგ: "population"), არამედ მის რიგით ნომერს (მაგ: 0, 1, 2...). lookupField() კი სახელიდან ინდექსზე გადამყვანი "ხიდია":
⚙️ ძირითადი მახასიათებლები¶
| მახასიათებელი | აღწერა |
|---|---|
| რას აბრუნებს | მთელ რიცხვს (int) — ველის ინდექსს |
| თუ ველი ვერ მოიძებნა | აბრუნებს -1-ს |
| რეგისტრის მიმართ | არ არის მგრძნობიარე (case-insensitive) |
| სად არის განსაზღვრული | QgsVectorLayer და QgsFields კლასებში |
▶️ მარტივი გამოყენება¶
წარმოვიდგინოთ, რომ გვაქვს ფენა და გვინდა გავიგოთ, რა ინდექსი აქვს სვეტს სახელად "population", რათა შემდეგ ამ სვეტში მონაცემები შევცვალოთ.
# დავუშვათ, layer არის შენი აქტიური ვექტორული ფენა
layer = iface.activeLayer()
# ვეძებთ ველის ინდექსს სახელის მიხედვით
field_name = "population"
field_index = layer.lookupField(field_name)
if field_index != -1:
print(f"ველის '{field_name}' ინდექსია: {field_index}")
# მაგალითად, პირველი ობიექტის ამ მნიშვნელობის წაკითხვა:
feature = next(layer.getFeatures())
print(f"მნიშვნელობა: {feature[field_index]}")
else:
print(f"❌ ველი სახელწოდებით '{field_name}' ვერ მოიძებნა!")
💡 რატომ ვიყენებთ?¶
თუ პირდაპირ დაწერ feature[2], შენი კოდი გაფუჭდება იმ შემთხვევაში, თუ ვინმე ცხრილში ახალ სვეტს ჩაამატებს ან წაშლის. lookupField() კი ყოველთვის სწორ ინდექსს მოგცემს, მიუხედავად იმისა, თუ მერამდენეა ის სვეტი სიაში.
❌ არასაიმედო ✅ საიმედო
────────────── ──────────────
value = feature[2] idx = layer.lookupField("population")
│ value = feature[idx]
▼ │
სვეტის რიგითობის ▼
ცვლილებისას — ბაგი ყოველთვის სწორი, სქემის
ცვლილებების მიუხედავად
📌 წესი: ყოველთვის გამოიყენე
lookupField()— არასოდეს არ დაუწერო ინდექსი "მყარად" (hardcoded).
🛠 პრაქტიკული მაგალითი — changeAttributeValues-თან ერთად¶
lookupField() განსაკუთრებით სასარგებლოა ატრიბუტების მასიური განახლებისას:
from qgis.core import QgsVectorLayer
layer = iface.activeLayer()
# ვიღებთ ინდექსს სახელის მიხედვით
pop_idx = layer.lookupField("population")
if pop_idx == -1:
print("❌ ველი 'population' ვერ მოიძებნა")
else:
# რედაქტირების რეჟიმი
layer.startEditing()
# მასიური განახლება changeAttributeValues-ით
updates = {}
for feat in layer.getFeatures():
# ორჯერ ვზრდით ყოველი ობიექტის მოსახლეობას
updates[feat.id()] = {pop_idx: feat[pop_idx] * 2}
layer.dataProvider().changeAttributeValues(updates)
layer.commitChanges()
print(f"✅ {len(updates)} ობიექტი განახლდა")
🔍 შემოწმებითი პატერნი (Defensive pattern)¶
def get_field_index(layer, field_name):
"""უსაფრთხოდ აბრუნებს ველის ინდექსს — ან აყენებს შეცდომას."""
idx = layer.lookupField(field_name)
if idx == -1:
available = [f.name() for f in layer.fields()]
raise ValueError(
f"ველი '{field_name}' ვერ მოიძებნა. "
f"ხელმისაწვდომი ველები: {available}"
)
return idx
# გამოყენება
try:
idx = get_field_index(layer, "population")
print(f"✅ ინდექსი: {idx}")
except ValueError as e:
print(f"❌ {e}")
📌 შეჯამება¶
lookupField(field_name)— ველის ინდექსს ბრუნდება სახელის მიხედვით- აბრუნებს
-1-ს, თუ ველი ვერ მოიძებნა — ყოველთვის შეამოწმე! - ხდის კოდს საიმედოს — ატრიბუტების სქემის ცვლილებისას არ ფუჭდება
- გამოიყენება
changeAttributeValues(),updateFeature()და სხვა ინდექსზე დაფუძნებულ ოპერაციებთან ერთად - საუკეთესო პრაქტიკა: არასდროს გამოიყენო hardcoded ინდექსი — ყოველთვის გადაიყვანე სახელიდან
👉 წესი: სანამ ატრიბუტს ინდექსით შეეხები — პირველი ნაბიჯი ყოველთვის lookupField().