Ejemplo n.º 1
0
    def get_transformed_layers(self):
        transformed_layers = []
        for background_layer in self.layers_to_transform:
            _t = QgsWkbTypes.displayString(background_layer.wkbType())

            result_layer = QgsVectorLayer(
                "{}?crs={}".format(_t,
                                   background_layer.crs().authid()),
                "result_cartogram", "memory")
            features_to_add = []
            result_layer.setCrs(background_layer.crs())
            pr_result_layer = result_layer.dataProvider()
            pr_result_layer.addAttributes(background_layer.fields().toList())
            result_layer.updateFields()

            for ix, ft in enumerate(background_layer.getFeatures()):
                ref_geom = ft.geometry()
                ref_coords = ref_geom.__geo_interface__['coordinates']
                if ref_geom.__geo_interface__['type'] == 'LineString':
                    new_geom = QgsGeometry.fromPolyLineXY([
                        QgsPointXY(*self.g._interp_point(
                            *ref_coords[ix_coords]))
                        for ix_coords in range(len(ref_coords))
                    ])
                elif ref_geom.__geo_interface__['type'] == 'MultiLineString':
                    lines = []
                    for ix_line in range(len(ref_coords)):
                        lines.append([
                            QgsPointXY(*self.g._interp_point(
                                *ref_coords[ix_line][ix_coords]))
                            for ix_coords in range(len(ref_coords[ix_line]))
                        ])
                    new_geom = QgsGeometry.fromMultiPolylineXY(lines)
                elif ref_geom.__geo_interface__['type'] == 'Polygon':
                    rings = []
                    for ix_ring in range(len(ref_coords)):
                        rings.append([
                            QgsPointXY(*self.g._interp_point(
                                *ref_coords[ix_ring][ix_coords]))
                            for ix_coords in range(len(ref_coords[ix_ring]))
                        ])
                    new_geom = QgsGeometry.fromPolygonXY(rings)

                elif ref_geom.__geo_interface__['type'] == 'MultiPolygon':
                    polys = []
                    for ix_poly in range(len(ref_coords)):
                        rings = []
                        for ix_ring in range(len(ref_coords[ix_poly])):
                            rings.append([
                                QgsPointXY(*self.g._interp_point(
                                    *ref_coords[ix_poly][ix_ring][ix_coords]))
                                for ix_coords in range(
                                    len(ref_coords[ix_poly][ix_ring]))
                            ])
                        polys.append(rings)
                    new_geom = QgsGeometry.fromMultiPolygonXY(polys)
                else:
                    self.status.emit('Geometry type error')
                    continue
                feature = QgsFeature()
                feature.setGeometry(new_geom)
                feature.setAttributes(ft.attributes())
                features_to_add.append(feature)
                self.progress.emit(1)
            pr_result_layer.addFeatures(features_to_add)
            result_layer.updateExtents()
            transformed_layers.append(result_layer)
        return transformed_layers