Add new methods

This commit is contained in:
Alireza Adli 2024-03-26 16:04:43 -04:00
parent 514ef94567
commit 41e8924938

View File

@ -1,6 +1,7 @@
from qgis.core import QgsApplication, QgsField, QgsProject, \ from qgis.core import QgsApplication, QgsField, QgsProject, \
QgsProcessingFeedback, QgsVectorLayer, QgsVectorDataProvider, \ QgsProcessingFeedback, QgsVectorLayer, QgsVectorDataProvider, \
QgsExpressionContext, QgsExpressionContextUtils QgsExpressionContext, QgsExpressionContextUtils, edit
from qgis.PyQt.QtCore import QVariant
from qgis.analysis import QgsNativeAlgorithms from qgis.analysis import QgsNativeAlgorithms
import processing import processing
@ -43,9 +44,25 @@ class ScrubLayer:
'OUTPUT': 'Output' 'OUTPUT': 'Output'
} }
processing.run("native:createspatialindex", create_spatial_index_params) processing.run("native:createspatialindex", create_spatial_index_params)
print(f'Creating spatial index for {self.layer_name} is completed.') print(f'Creating Spatial index for {self.layer_name} is completed.')
def spatial_join(self, joining_layer_path, joined_layer_path):
"""In QGIS, it is called 'Join attributes by Location'"""
params = {'INPUT': self.layer,
'PREDICATE': [0],
'JOIN': joining_layer_path,
'JOIN_FIELDS': [],
'METHOD': 0,
'DISCARD_NONMATCHING': False,
'PREFIX': '',
'OUTPUT': joined_layer_path}
feedback = QgsProcessingFeedback()
processing.run('native:joinattributesbylocation', params, feedback=feedback)
print(f'Spatial Join with input layer {self.layer_name} is completed.')
def clip_layer(self, overlay_layer, clipped_layer): def clip_layer(self, overlay_layer, clipped_layer):
"""This must be tested"""
QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms()) QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())
clip_layer_params = { clip_layer_params = {
'INPUT': self.layer_path, 'INPUT': self.layer_path,
@ -57,6 +74,55 @@ class ScrubLayer:
processing.run("native:clip", clip_layer_params) processing.run("native:clip", clip_layer_params)
print(f'Clipping of {self.layer_name} is completed.') print(f'Clipping of {self.layer_name} is completed.')
def merge_layers(self, layers_path, mered_layer_path):
pass
def multipart_to_singleparts(self):
pass
def split_layer(self):
pass
def delete_duplicates(self, deleted_duplicates_layer):
QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())
params = {'INPUT': self.layer_path,
'OUTPUT': deleted_duplicates_layer}
processing.run("native:deleteduplicategeometries", params)
def delete_field(self, field_name):
QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())
with edit(self.layer):
# Get the index of the column to delete
idx = self.layer.fields().indexFromName(field_name)
# Delete the field
self.layer.deleteAttribute(idx)
# Update layer fields
self.layer.updateFields()
def add_field(self, new_field_name):
functionalities = self.layer.dataProvider().capabilities()
if functionalities & QgsVectorDataProvider.AddAttributes:
new_field = QgsField(new_field_name, QVariant.Double)
self.layer.dataProvider().addAttributes([new_field])
self.layer.updateFields()
def assign_area(self, field_name):
self.layer.startEditing()
idx = self.layer.fields().indexFromName(field_name)
context = QgsExpressionContext()
context.appendScopes(QgsExpressionContextUtils.globalProjectLayerScopes(self.layer))
for feature in self.layer.getFeatures():
area = feature.geometry().area()
feature[idx] = area
self.layer.updateFeature(feature)
self.layer.commitChanges()
def __str__(self): def __str__(self):
return f'The {self.layer_name} has {self.data_count} records.' return f'The {self.layer_name} has {self.data_count} records.'