კონტენტზე გადასვლა

🐍 PyQGIS-ში კლასების გამოყენება

🔹 შესავალი

PyQGIS არის QGIS-ის Python API, რომელიც საშუალებას გვაძლევს დავწეროთ სკრიპტები და პლაგინები GIS მონაცემების დამუშავებისა და ვიზუალიზაციისთვის.
პითონის კლასების გამოყენება PyQGIS-ში უზრუნველყოფს:
- კოდის სტრუქტურირებას
- ფუნქციონალის ხელახლა გამოყენებას
- რთული GIS პროცესების მოდელირებას

👉 ეს სახელმძღვანელო განკუთვნილია სტუდენტებისთვის და დეველოპერებისთვის, რომელთაც სურთ გაიგონ, როგორ გამოიყენონ OOP (ობიექტზე ორიენტირებული პროგრამირება) PyQGIS-ში.


🔹 რატომ გამოვიყენოთ კლასები PyQGIS-ში?

  • მოდულარობა – კოდი იყოფა მცირე, მართვად ნაწილებად
  • ხელახლა გამოყენება – ერთი და იგივე ლოგიკა გამოიყენება სხვადასხვა პროექტში
  • სიცხადე – დიდი QGIS სკრიპტები უფრო გასაგები ხდება
  • პლაგინების განვითარება – QGIS პლაგინები ძირითადად კლასებზეა დაფუძნებული

🔹 PyQGIS გარემოს მომზადება

from qgis.core import (
    QgsProject, QgsVectorLayer, QgsGeometry, QgsPointXY,
    QgsFeature, QgsField, QgsFields, QgsVectorFileWriter
)
from PyQt5.QtCore import QVariant
import os

👉 ეს ბიბლიოთეკები გვაძლევს წვდომას QGIS ობიექტებზე (layers, features, geometry).


🔹 კლასის შექმნა: მარტივი მაგალითი

შევქმნათ კლასი, რომელიც მუშაობს წერტილებთან (Point).

class MyPoint:
    def __init__(self, x, y, name=""):
        self.x = x
        self.y = y
        self.name = name

    def to_qgspoint(self):
        return QgsPointXY(self.x, self.y)

    def describe(self):
        return f"წერტილი {self.name} ({self.x}, {self.y})"

გამოყენება:

tbilisi = MyPoint(44.8, 41.7, "თბილისი")
print(tbilisi.describe())  
# შედეგი: წერტილი თბილისი (44.8, 41.7)

👉 აქ კლასმა უზრუნველყო ატრიბუტები (x,y,name) და მეთოდები (to_qgspoint, describe).


🔹 PyQGIS კლასის გამოყენება ფენაში წერტილის დასამატებლად

class PointLayerManager:
    def __init__(self, layer_name="MyPoints"):
        self.layer = QgsVectorLayer("Point?crs=EPSG:4326", layer_name, "memory")
        provider = self.layer.dataProvider()
        provider.addAttributes([QgsField("Name", QVariant.String)])
        self.layer.updateFields()
        QgsProject.instance().addMapLayer(self.layer)

    def add_point(self, my_point: MyPoint):
        feat = QgsFeature()
        feat.setGeometry(QgsGeometry.fromPointXY(my_point.to_qgspoint()))
        feat.setAttributes([my_point.name])
        self.layer.dataProvider().addFeature(feat)
        self.layer.updateExtents()

გამოყენება:

manager = PointLayerManager()
tbilisi = MyPoint(44.8, 41.7, "თბილისი")
manager.add_point(tbilisi)

👉 აქ კლასმა შექმნა მეხსიერებაში არსებული ფენა და დაამატა მას ობიექტები.


🔹 მემკვიდრეობა PyQGIS-ში

შეგვიძლია შევქმნათ ზოგადი GeometryObject კლასი და მისგან წარმოვქმნათ PointObject, LineObject, PolygonObject.

class GeometryObject:
    def __init__(self, name):
        self.name = name

    def describe(self):
        return f"Geometry: {self.name}"

class PointObject(GeometryObject):
    def __init__(self, x, y, name=""):
        super().__init__(name)
        self.point = QgsPointXY(x, y)

    def get_geometry(self):
        return QgsGeometry.fromPointXY(self.point)

class LineObject(GeometryObject):
    def __init__(self, points, name=""):
        super().__init__(name)
        self.points = [QgsPointXY(x, y) for x, y in points]

    def get_geometry(self):
        return QgsGeometry.fromPolylineXY(self.points)

👉 ეს მიდგომა საშუალებას გვაძლევს მარტივად დავამატოთ სხვადასხვა ტიპის ობიექტები.


🔹 ფენაში მრავალგვარი ობიექტის დამატება

class LayerManager:
    def __init__(self, geom_type="Point", layer_name="MyLayer"):
        self.layer = QgsVectorLayer(f"{geom_type}?crs=EPSG:4326", layer_name, "memory")
        self.provider = self.layer.dataProvider()
        self.provider.addAttributes([QgsField("Name", QVariant.String)])
        self.layer.updateFields()
        QgsProject.instance().addMapLayer(self.layer)

    def add_geometry(self, geom_object: GeometryObject):
        feat = QgsFeature()
        feat.setGeometry(geom_object.get_geometry())
        feat.setAttributes([geom_object.name])
        self.provider.addFeature(feat)
        self.layer.updateExtents()

გამოყენება:

point = PointObject(44.8, 41.7, "თბილისი")
line = LineObject([(44.8, 41.7), (41.6, 41.6)], "თბილისი-ბათუმი")

manager = LayerManager("Point", "Cities")
manager.add_geometry(point)

line_manager = LayerManager("LineString", "Roads")
line_manager.add_geometry(line)

👉 ახლა გვაქვს ზოგადი კლასი, რომელიც მუშაობს როგორც წერტილებთან, ასევე ხაზებთან.


🔹 PyQGIS კლასები პლაგინებში

QGIS პლაგინები ძირითადად იყენებენ:
- მთავარ კლასს (მაგ., MyPlugin)
- GUI კლასებს (ფორმები PyQt-ით)
- მონაცემთა კლასებს (სივრცითი ობიექტები)

👉 ამიტომ PyQGIS დეველოპმენტში კლასების ცოდნა სავალდებულოა.


🔹 საუკეთესო პრაქტიკა PyQGIS კლასებისთვის

  • გამოიყენეთ მოდულარობა (ერთ კლასი = ერთი პასუხისმგებლობა)
  • კლასის სახელები უნდა იყოს აღწერითი (PointLayerManager, RoadLine)
  • გამოიყენეთ მემკვიდრეობა ზოგადი თვისებების გასაზიარებლად
  • დაამატეთ docstring-ები და კომენტარები
  • ტესტირება გაამარტივეთ მცირე კლასებით

🔹 დასკვნა

პითონის კლასები PyQGIS-ში:
- ინარჩუნებს კოდს ორგანიზებულად
- ამარტივებს ფენებთან, ობიექტებთან და ატრიბუტებთან მუშაობას
- აუცილებელია პლაგინების შექმნისთვის

👉 დაიწყეთ მარტივი კლასებით (მაგ., Point + Layer Manager) და ეტაპობრივად შექმენით უფრო რთული სტრუქტურები. ასე შეძლებთ პროფესიონალური GIS ინსტრუმენტების შექმნას QGIS-ში. 🚀