def add_edges(self): new_key_count = 0 f_count = 1 for f in self.layer.getFeatures(): self.progress.emit(3 * f_count / self.feat_count) f_count += 1 if self.killed is True: break geom_type = f.geometry().wkbType() if geom_type not in [5,2,1] and f.geometry().geometry().is3D(): f.geometry().geometry().dropZValue() geom_type = f.geometry().wkbType() if geom_type == 5: if self.errors: self.errors_features[f.id()] = ('multipart', f.geometry().exportToWkt()) for multipart in f.geometry().asGeometryCollection(): new_key_count += 1 attr = f.attributes() new_feat = QgsFeature() new_feat.setAttributes(attr) new_feat.setFeatureId(new_key_count) if self.tolerance: snapped_wkt = make_snapped_wkt(multipart.exportToWkt(), self.tolerance) else: snapped_wkt = multipart.exportToWkt() snapped_geom = QgsGeometry.fromWkt(snapped_wkt) new_feat.setGeometry(snapped_geom) self.features.append(new_feat) self.attributes[new_key_count] = attr self.geometries[new_key_count] = new_feat.geometryAndOwnership() self.geometries_wkt[new_key_count] = snapped_wkt self.geometries_vertices[new_key_count] = [vertex for vertex in vertices_from_wkt_2(snapped_wkt)] # insert features to index self.spIndex.insertFeature(new_feat) self.ml_keys[new_key_count] = f.id() elif geom_type == 1: if self.errors: self.errors_features[f.id()] = ('point', QgsGeometry().exportToWkt()) elif not f.geometry().isGeosValid(): if self.errors: self.errors_features[f.id()] = ('invalid', QgsGeometry().exportToWkt()) elif geom_type == 2: attr = f.attributes() if self.tolerance: snapped_wkt = make_snapped_wkt(f.geometry().exportToWkt(), self.tolerance) else: snapped_wkt = f.geometry().exportToWkt() snapped_geom = QgsGeometry.fromWkt(snapped_wkt) f.setGeometry(snapped_geom) new_key_count += 1 f.setFeatureId(new_key_count) self.features.append(f) self.attributes[f.id()] = attr self.geometries[f.id()] = f.geometryAndOwnership() self.geometries_wkt[f.id()] = snapped_wkt self.geometries_vertices[f.id()] = [vertex for vertex in vertices_from_wkt_2(snapped_wkt)] # insert features to index self.spIndex.insertFeature(f) self.ml_keys[new_key_count] = f.id()
def __init__(self, layer, tolerance, uid, errors): QObject.__init__(self) self.layer = layer self.feat_count = self.layer.featureCount() self.tolerance = tolerance self.uid = uid self.errors = errors self.multiparts = [] self.points = [] self.invalids = [] self.features = [] self.attributes = {} self.geometries = {} self.geometries_wkt = {} self.geometries_vertices = {} # create spatial index object self.spIndex = QgsSpatialIndex() self.layer_fields = [ QgsField(i.name(), i.type()) for i in self.layer.dataProvider().fields() ] if self.uid is not None: self.uid_index = [ index for index, field in enumerate(self.layer_fields) if field.name() == self.uid ].pop() self.fid_to_uid = {} self.uid_to_fid = {} new_key_count = 0 f_count = 1 for f in self.layer.getFeatures(): self.progress.emit(45 * f_count / self.feat_count) f_count += 1 attr = f.attributes() if f.geometry().wkbType() == 5: attr = f.attributes() if self.errors and self.uid is not None: self.multiparts.append(attr[self.uid_index]) self.uid_to_fid[attr[self.uid_index]] = f.id() for multipart in f.geometry().asGeometryCollection(): new_key_count += 1 if self.uid is not None: self.fid_to_uid[new_key_count] = attr[self.uid_index] attr = f.attributes() new_feat = QgsFeature() new_feat.setAttributes(attr) new_feat.setFeatureId(new_key_count) if self.tolerance: snapped_wkt = make_snapped_wkt(multipart.exportToWkt(), self.tolerance) else: snapped_wkt = multipart.exportToWkt() snapped_geom = QgsGeometry.fromWkt(snapped_wkt) new_feat.setGeometry(snapped_geom) self.features.append(new_feat) self.attributes[new_key_count] = attr self.geometries[ new_key_count] = new_feat.geometryAndOwnership() self.geometries_wkt[new_key_count] = snapped_wkt self.geometries_vertices[new_key_count] = [ vertex for vertex in vertices_from_wkt_2(snapped_wkt) ] # insert features to index self.spIndex.insertFeature(new_feat) elif f.geometry().wkbType() == 1: if self.errors and self.uid is not None: self.points.append(attr[self.uid_index]) elif not f.geometry().isGeosValid(): if self.errors and self.uid is not None: self.invalids.append(attr[self.uid_index]) elif f.geometry().wkbType() == 2: attr = f.attributes() if self.tolerance: snapped_wkt = make_snapped_wkt(f.geometry().exportToWkt(), self.tolerance) else: snapped_wkt = f.geometry().exportToWkt() snapped_geom = QgsGeometry.fromWkt(snapped_wkt) f.setGeometry(snapped_geom) new_key_count += 1 f.setFeatureId(new_key_count) self.features.append(f) self.attributes[f.id()] = attr self.geometries[f.id()] = f.geometryAndOwnership() self.geometries_wkt[f.id()] = snapped_wkt self.geometries_vertices[f.id()] = [ vertex for vertex in vertices_from_wkt_2(snapped_wkt) ] # insert features to index self.spIndex.insertFeature(f) if self.uid is not None: self.fid_to_uid[f.id()] = attr[self.uid_index] self.uid_to_fid[attr[self.uid_index]] = f.id()
def add_edges(self): new_key_count = 0 f_count = 1 for f in self.layer.getFeatures(): self.progress.emit(3 * f_count / self.feat_count) f_count += 1 if self.killed is True: break geom_type = f.geometry().wkbType() if geom_type not in [5, 2, 1] and f.geometry().geometry().is3D(): f.geometry().geometry().dropZValue() geom_type = f.geometry().wkbType() if geom_type == 5: if self.errors: self.errors_features[f.id()] = ('multipart', f.geometry().exportToWkt()) for multipart in f.geometry().asGeometryCollection(): new_key_count += 1 attr = f.attributes() new_feat = QgsFeature() new_feat.setAttributes(attr) new_feat.setFeatureId(new_key_count) if self.tolerance: snapped_wkt = make_snapped_wkt(multipart.exportToWkt(), self.tolerance) else: snapped_wkt = multipart.exportToWkt() snapped_geom = QgsGeometry.fromWkt(snapped_wkt) new_feat.setGeometry(snapped_geom) self.features.append(new_feat) self.attributes[new_key_count] = attr self.geometries[ new_key_count] = new_feat.geometryAndOwnership() self.geometries_wkt[new_key_count] = snapped_wkt self.geometries_vertices[new_key_count] = [ vertex for vertex in vertices_from_wkt_2(snapped_wkt) ] # insert features to index self.spIndex.insertFeature(new_feat) self.ml_keys[new_key_count] = f.id() elif geom_type == 1: if self.errors: self.errors_features[f.id()] = ( 'point', QgsGeometry().exportToWkt()) elif not f.geometry().isGeosValid(): if self.errors: self.errors_features[f.id()] = ( 'invalid', QgsGeometry().exportToWkt()) elif geom_type == 2: attr = f.attributes() if self.tolerance: snapped_wkt = make_snapped_wkt(f.geometry().exportToWkt(), self.tolerance) else: snapped_wkt = f.geometry().exportToWkt() snapped_geom = QgsGeometry.fromWkt(snapped_wkt) f.setGeometry(snapped_geom) new_key_count += 1 f.setFeatureId(new_key_count) self.features.append(f) self.attributes[f.id()] = attr self.geometries[f.id()] = f.geometryAndOwnership() self.geometries_wkt[f.id()] = snapped_wkt self.geometries_vertices[f.id()] = [ vertex for vertex in vertices_from_wkt_2(snapped_wkt) ] # insert features to index self.spIndex.insertFeature(f) self.ml_keys[new_key_count] = f.id()
def __init__(self,layer, tolerance, uid, errors): QObject.__init__(self) self.layer = layer self.feat_count = self.layer.featureCount() self.tolerance = tolerance self.uid = uid self.errors = errors self.multiparts = [] self.points = [] self.invalids = [] self.features = [] self.attributes = {} self.geometries = {} self.geometries_wkt = {} self.geometries_vertices = {} # create spatial index object self.spIndex = QgsSpatialIndex() self.layer_fields = [QgsField(i.name(), i.type()) for i in self.layer.dataProvider().fields()] if self.uid is not None: self.uid_index = [index for index,field in enumerate(self.layer_fields) if field.name() == self.uid].pop() self.fid_to_uid = {} self.uid_to_fid = {} new_key_count = 0 f_count = 1 for f in self.layer.getFeatures(): self.progress.emit(45 * f_count / self.feat_count) f_count += 1 attr = f.attributes() if f.geometry().wkbType() == 5 : attr = f.attributes() if self.errors and self.uid is not None: self.multiparts.append(attr[self.uid_index]) self.uid_to_fid[attr[self.uid_index]] = f.id() for multipart in f.geometry().asGeometryCollection(): new_key_count += 1 if self.uid is not None: self.fid_to_uid[new_key_count] = attr[self.uid_index] attr = f.attributes() new_feat = QgsFeature() new_feat.setAttributes(attr) new_feat.setFeatureId(new_key_count) if self.tolerance: snapped_wkt = make_snapped_wkt(multipart.exportToWkt(), self.tolerance) else: snapped_wkt = multipart.exportToWkt() snapped_geom = QgsGeometry.fromWkt(snapped_wkt) new_feat.setGeometry(snapped_geom) self.features.append(new_feat) self.attributes[new_key_count] = attr self.geometries[new_key_count] = new_feat.geometryAndOwnership() self.geometries_wkt[new_key_count] = snapped_wkt self.geometries_vertices[new_key_count] = [vertex for vertex in vertices_from_wkt_2(snapped_wkt)] # insert features to index self.spIndex.insertFeature(new_feat) elif f.geometry().wkbType() == 1: if self.errors and self.uid is not None: self.points.append(attr[self.uid_index]) elif not f.geometry().isGeosValid(): if self.errors and self.uid is not None: self.invalids.append(attr[self.uid_index]) elif f.geometry().wkbType() == 2: attr = f.attributes() if self.tolerance: snapped_wkt = make_snapped_wkt(f.geometry().exportToWkt(), self.tolerance) else: snapped_wkt = f.geometry().exportToWkt() snapped_geom = QgsGeometry.fromWkt(snapped_wkt) f.setGeometry(snapped_geom) new_key_count += 1 f.setFeatureId(new_key_count) self.features.append(f) self.attributes[f.id()] = attr self.geometries[f.id()] = f.geometryAndOwnership() self.geometries_wkt[f.id()] = snapped_wkt self.geometries_vertices[f.id()] = [vertex for vertex in vertices_from_wkt_2(snapped_wkt)] # insert features to index self.spIndex.insertFeature(f) if self.uid is not None: self.fid_to_uid[f.id()] = attr[self.uid_index] self.uid_to_fid[attr[self.uid_index]] = f.id()