Skip to content

Integrations

The Integrations class is the base object to work with integrations to third party libraries. At the moment this class contains methods to work with the geopandas library.

Integrations

Source code in python\engine\integrations.py
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
class Integrations:
    logger = get_logger() 

    ## ##################################
    ## Geopandas import / export
    ## ##################################

    def to_geopandas_df(layer: str):
        """
        Convert a QGIS layer to a Geopandas dataframe for further processing

        Args:
            layer (string): The QGIS layer to be converted to dataframe

        Returns:
            dataframe (dataframe): The GeoPandas dataframe from the input layer
        """

        logger.info(f'Creating Geopandas dataframe from layer  {str(layer)}')
        config = get_config()
        try:
            tmp_path = create_tempfile(layer, 'to_dataframe')
            logger.info('Creating dataframe')
            df = gpd.read_file(tmp_path)
            logger.info('Dataframe creation finished')
            delete_tempfile(tmp_path)
            return df

        except Exception as error:
            logger.error("An error occured exporting layer to Pandas dataframe")
            logger.error(f'{type(error).__name__}{str(error)}')
            logger.critical("Program terminated")
            script_failed()

    def from_geopandas_df(dataframe: str):
        """
        Convert a  a Geopandas dataframe ton QGIS layer

        Args:
            dataframe (dataframe): The dataframe to be converted to QGIS layer

        Returns
            dataframe (dataframe): The QGIS layer from the input dataframe
        """

        logger.info(f'Creating layer from Geopandas dataframe ')
        config = get_config()
        try:
            logger.info(f'Creating temporary layer in Temp folder')
            tmp_path = f'{config["TempFolder"]}Q-ETL_from_dataframe_{str(randrange(1000))}.fgb'
            dataframe.to_file(tmp_path, driver='FlatGeobuf')
            logger.info('Temporary layer created')

            logger.info('Creating QGIS layer')
            tmp_layer =  QgsVectorLayer(tmp_path, f'QgsLayer_ {str(randrange(1000))}', "ogr")
            #layer = tmp_layer.materialize(QgsFeatureRequest().setFilterFids(tmp_layer.allFeatureIds()))

            tmp_layer.selectAll()

            context  = QgsProcessingContext()
            layer = processing.run("native:saveselectedfeatures", {'INPUT': tmp_layer, 'OUTPUT': 'memory:'}, context=context)['OUTPUT']
            layer.removeSelection()
            try:
                QgsProject.instance().removeMapLayer(tmp_layer.id())
                context.temporaryLayerStore().removeAllMapLayers()   
                tmp_layer = None
                del tmp_layer, dataframe
                os.remove(tmp_path)
            except:
                logger.info('Could not delete temporary layer - manual cleanup is required')

            logger.info('Layer creation finished')
            return layer

        except Exception as error:
            logger.error("An error occured exporting layer to Pandas dataframe")
            logger.error(f'{type(error).__name__}{str(error)}')
            logger.critical("Program terminated")
            script_failed()

from_geopandas_df(dataframe)

Convert a a Geopandas dataframe ton QGIS layer

Parameters:

Name Type Description Default
dataframe dataframe

The dataframe to be converted to QGIS layer

required

Returns dataframe (dataframe): The QGIS layer from the input dataframe

Source code in python\engine\integrations.py
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
def from_geopandas_df(dataframe: str):
    """
    Convert a  a Geopandas dataframe ton QGIS layer

    Args:
        dataframe (dataframe): The dataframe to be converted to QGIS layer

    Returns
        dataframe (dataframe): The QGIS layer from the input dataframe
    """

    logger.info(f'Creating layer from Geopandas dataframe ')
    config = get_config()
    try:
        logger.info(f'Creating temporary layer in Temp folder')
        tmp_path = f'{config["TempFolder"]}Q-ETL_from_dataframe_{str(randrange(1000))}.fgb'
        dataframe.to_file(tmp_path, driver='FlatGeobuf')
        logger.info('Temporary layer created')

        logger.info('Creating QGIS layer')
        tmp_layer =  QgsVectorLayer(tmp_path, f'QgsLayer_ {str(randrange(1000))}', "ogr")
        #layer = tmp_layer.materialize(QgsFeatureRequest().setFilterFids(tmp_layer.allFeatureIds()))

        tmp_layer.selectAll()

        context  = QgsProcessingContext()
        layer = processing.run("native:saveselectedfeatures", {'INPUT': tmp_layer, 'OUTPUT': 'memory:'}, context=context)['OUTPUT']
        layer.removeSelection()
        try:
            QgsProject.instance().removeMapLayer(tmp_layer.id())
            context.temporaryLayerStore().removeAllMapLayers()   
            tmp_layer = None
            del tmp_layer, dataframe
            os.remove(tmp_path)
        except:
            logger.info('Could not delete temporary layer - manual cleanup is required')

        logger.info('Layer creation finished')
        return layer

    except Exception as error:
        logger.error("An error occured exporting layer to Pandas dataframe")
        logger.error(f'{type(error).__name__}{str(error)}')
        logger.critical("Program terminated")
        script_failed()

to_geopandas_df(layer)

Convert a QGIS layer to a Geopandas dataframe for further processing

Parameters:

Name Type Description Default
layer string

The QGIS layer to be converted to dataframe

required

Returns:

Name Type Description
dataframe dataframe

The GeoPandas dataframe from the input layer

Source code in python\engine\integrations.py
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
def to_geopandas_df(layer: str):
    """
    Convert a QGIS layer to a Geopandas dataframe for further processing

    Args:
        layer (string): The QGIS layer to be converted to dataframe

    Returns:
        dataframe (dataframe): The GeoPandas dataframe from the input layer
    """

    logger.info(f'Creating Geopandas dataframe from layer  {str(layer)}')
    config = get_config()
    try:
        tmp_path = create_tempfile(layer, 'to_dataframe')
        logger.info('Creating dataframe')
        df = gpd.read_file(tmp_path)
        logger.info('Dataframe creation finished')
        delete_tempfile(tmp_path)
        return df

    except Exception as error:
        logger.error("An error occured exporting layer to Pandas dataframe")
        logger.error(f'{type(error).__name__}{str(error)}')
        logger.critical("Program terminated")
        script_failed()