mtl_gis_oo/scrub_mtl_class.py
2024-08-05 18:00:06 -04:00

131 lines
5.1 KiB
Python

"""
scrub_mtl_class module
The workflow of cleaning and updating the Montreal Buildings dataset.
The development of this class has been stopped but the whole workflow
can be found in a module namely handle_mtl_ds_workflow, in the same project.
Project Developer: Alireza Adli alireza.adli@concordia.ca
"""
from scrub_layer_class import *
from basic_functions import *
class ScrubMTL:
def __init__(self, qgis_path, nrcan, geo_index, property_assessment,
montreal_boundary, output_paths_dir):
self.qgis_path = qgis_path
self.nrcan = self.initialize_layer(nrcan, 'NRCan')
self.geo_index = self.initialize_layer(geo_index, 'GeoIndex')
self.property_assessment = \
self.initialize_layer(property_assessment, 'Property Assessment')
self.montreal_boundary = montreal_boundary
self.output_paths_dir = output_paths_dir
self.input_paths = {
'NRCan': nrcan,
'GeoIndex': geo_index,
'Property Assessment': property_assessment,
'Montreal Boundary': montreal_boundary
}
self.output_paths = {
'Fixed NRCan': '',
'Fixed GeoIndex': '',
'Clipped Fixed GeoIndex': '',
'Splitted NRCans': '',
'Pairwise Clipped Property Assessment Partitions': '',
'Pairwise Clipped Merged Property Assessment': '',
'Property Assessment and NRCan': '',
'Property Assessment and NRCan and GeoIndex': '',
'Deleted Duplicates Layer': '',
'Singled Parts Layer': ''
}
@staticmethod
def merge_layers(layers_path, mergeded_layer_path):
merging_layers = find_shp_files(layers_path)
QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())
params = {'LAYERS': merging_layers,
'CRS': None,
'OUTPUT': mergeded_layer_path}
processing.run("native:mergevectorlayers", params)
def generate_output_paths(self):
for path in self.output_paths.keys():
new_folder = path.lower().replace(' ', '_')
output_path = self.output_paths_dir + '/' + new_folder
os.mkdir(output_path)
if path[-1] != 's':
self.output_paths[path] = output_path + f'/{new_folder}.shp'
else:
self.output_paths[path] = output_path
def initialize_layer(self, layer_path, layer_name):
return ScrubLayer(self.qgis_path, layer_path, layer_name)
def process_nrcan(self):
print(f'Data Count of the NRCan layer: {self.nrcan.data_count}')
self.nrcan.create_spatial_index()
self.nrcan.fix_geometries(self.output_paths['Fixed NRCan'])
nrcan_fixed = \
self.initialize_layer(self.output_paths['Fixed NRCan'],
'Fixed NRCan')
nrcan_fixed.create_spatial_index()
print(f'Data Count of the NRCan layer ({nrcan_fixed.layer_name}) '
f'after fixing geometries: {nrcan_fixed.layer.featureCount()}')
def process_geo_index(self):
print(f'Data Count of the GeoIndex layer: {self.geo_index.data_count}')
self.geo_index.create_spatial_index()
self.geo_index.fix_geometries(self.output_paths['Fixed GeoIndex'])
geo_index_fixed = \
self.initialize_layer(self.output_paths['Fixed GeoIndex'],
'Fixed GeoIndex')
geo_index_fixed.create_spatial_index()
print(f'Data Count of the GeoIndex layer ({geo_index_fixed.layer_name}) '
f'after fixing geometries: {geo_index_fixed.layer.featureCount()}')
geo_index_fixed.clip_layer(self.montreal_boundary,
self.output_paths['Clipped Fixed GeoIndex'])
geo_index_clipped = \
self.initialize_layer(self.output_paths['Clipped Fixed GeoIndex'],
'Clipped Fixed GeoIndex')
geo_index_clipped.create_spatial_index()
print(f'Data Count of the {geo_index_fixed.layer_name} '
f'({geo_index_clipped.layer_name}) after clipping it '
f'based on the Montreal Boundary layer: '
f'{geo_index_clipped.layer.featureCount()}')
def process_property_assesment(self):
print(f'Data Count of the Property Assessment layer: '
f'{self.property_assessment.data_count}')
self.property_assessment.create_spatial_index()
def the_cleaning_workflow(self):
"""It carries out all the steps to clean the dataset."""
self.generate_output_paths()
self.process_nrcan()
self.process_geo_index()
self.process_property_assesment()
self.property_assessment.clip_by_multiple(120,
self.output_paths['Fixed NRCan'],
self.output_paths['Splitted NRCans'],
self.output_paths
['Pairwise Clipped Property Assessment Partitions']
)
prop_a = ScrubLayer(self.qgis_path, self.input_paths['Property Assessment'],
'Property Aim')
prop_a.\
clip_by_multiple(120, 'the path',
self.output_paths['Splitted NRCans'])
def refine_heights(self):
pass
def remove_redundant_fields(self):
pass
def remove_records_by_area(self, area_limitation):
"""Area limitation can be assigned in the constructor"""
pass