Generate Well Known Binary via SQL. Must be used on a PostGIS database as it relies on several PostGIS
        database functions.
        :param session: SQLAlchemy session object bound to a PostGIS enabled database
        :param height: Height of the raster (or number of rows)
        :param width: Width of the raster (or number of columns)
        :param upperLeftX: Raster upper left corner X coordinate
        :param upperLeftY: Raster upper left corner Y coordinate
        :param cellSizeX: Raster cell size in X direction
        :param cellSizeY: Raster cell size in Y direction
        :param skewX: Skew in X direction
        :param skewY: Skew in Y direction
        :param srid: SRID of the raster
        :param initialValue: Initial / default value of the raster cells
        :param noDataValue: Value of cells to be considered as cells containing no cells
        :param dataArray: 2-dimensional list of values or a string representation of a 2-dimensional list that will be used to populate the raster values

def makeSingleBandWKBRaster(cls, session, width, height, upperLeftX, upperLeftY, cellSizeX, cellSizeY, skewX, skewY, srid, dataArray, initialValue=None, noDataValue=None):
        """
        Generate Well Known Binary via SQL. Must be used on a PostGIS database as it relies on several PostGIS
        database functions.
        :param session: SQLAlchemy session object bound to a PostGIS enabled database
        :param height: Height of the raster (or number of rows)
        :param width: Width of the raster (or number of columns)
        :param upperLeftX: Raster upper left corner X coordinate
        :param upperLeftY: Raster upper left corner Y coordinate
        :param cellSizeX: Raster cell size in X direction
        :param cellSizeY: Raster cell size in Y direction
        :param skewX: Skew in X direction
        :param skewY: Skew in Y direction
        :param srid: SRID of the raster
        :param initialValue: Initial / default value of the raster cells
        :param noDataValue: Value of cells to be considered as cells containing no cells
        :param dataArray: 2-dimensional list of values or a string representation of a 2-dimensional list that will be used to populate the raster values
        """
        # Stringify the data array
        if isinstance(dataArray, str):
            dataArrayString = dataArray
        else:
            dataArrayString = json.dumps(dataArray)

        # Validate
        if initialValue is None:
            initialValue = 'NULL'

        if noDataValue is None:
            noDataValue = 'NULL'

        # Cell size in the Y direction must be negative
        if cellSizeY > 0:
            print('RASTER LOADER WARNING: cellSizeY should be defined as negative.')
            cellSizeY = -1 * cellSizeY

        # Create the SQL statement
        statement = '''
                    SELECT ST_SetValues(
                        ST_AddBand(
                            ST_MakeEmptyRaster({0}::integer, {1}::integer, {2}, {3}, {4}, {5}, {6}, {7}, {8}::integer),
                            1::integer, '32BF'::text, {9}::double precision, {10}::double precision
                        ),
                        1, 1, 1, ARRAY{11}::double precision[][]
                    );
                    '''.format(width,
                               height,
                               upperLeftX,
                               upperLeftY,
                               cellSizeX,
                               cellSizeY,
                               skewX,
                               skewY,
                               srid,
                               initialValue,
                               noDataValue,
                               dataArrayString)

        result = session.execute(statement)

        # Extract result
        wellKnownBinary = ''

        for row in result:
            wellKnownBinary = row[0]

        return wellKnownBinary