def bbox_from_gdf(gdf, buffer_value = 0.001):
    """
    Obtain bbox from the whole GeoDataFrame
    bbox --> (South, West, North, East) or (# minlat, minlon, maxlat, maxlon)

    Parameters
    ----------
    gdf : GeoDataFrame
    buffer_value : float
        buffer variable, see more in GeoDataFrame.Geometry.buffer()

    Returns
    -------
    Tuple
    """

    # the whole geometry
    gdf_boundary =gdf.cascaded_union.convex_hull.buffer(buffer_value)
    # get the bounds
    (West, South, East, North) =  gdf_boundary.bounds    
    # create the bbox
    bbox = (South, West, North, East)

    return bbox