示例#1
0
    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()
示例#3
0
    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()