🐍 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()
გამოყენება:
👉 აქ კლასმა შექმნა მეხსიერებაში არსებული ფენა და დაამატა მას ობიექტები.
🔹 მემკვიდრეობა 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-ში. 🚀