def tile_generator(self, src, tile_bounds, tile_bounds_crs=None, geom_type='Polygon', split_multi_geoms=True, min_partial_perc=0.0, obj_id_col=None):
    'Generate `src` vector data tiles bounded by `tile_bounds`.\n\n        Arguments\n        ---------\n        src : `str` or :class:`geopandas.GeoDataFrame`\n            The source vector data to tile. Must either be a path to a GeoJSON\n            or a :class:`geopandas.GeoDataFrame`.\n        tile_bounds : list\n            A :class:`list` made up of ``[left, top, right, bottom] `` sublists\n            (this can be extracted from\n            :class:`solaris.tile.raster_tile.RasterTiler` after tiling imagery)\n        tile_bounds_crs : int, optional\n            The EPSG code for the CRS that the tile bounds are in. If not\n            provided, it\'s assumed that the CRS is the same as in `src`. This\n            argument must be provided if the bound coordinates and `src` are\n            not in the same CRS, otherwise tiling will not occur correctly.\n        geom_type : str, optional (default: "Polygon")\n            The type of geometries contained within `src`. Defaults to\n            ``"Polygon"``, can also be ``"LineString"``.\n        split_multi_geoms : bool, optional (default: True)\n            Should multi-polygons or multi-linestrings generated by clipping\n            a geometry into discontinuous pieces be separated? Defaults to yes\n            (``True``).\n        min_partial_perc : float, optional (default: 0.0)\n            The minimum percentage of a :class:`shapely.geometry.Polygon` \'s\n            area or :class:`shapely.geometry.LineString` \'s length that must\n            be retained within a tile\'s bounds to be included in the output.\n            Defaults to ``0.0``, meaning that the contained portion of a\n            clipped geometry will be included, no matter how small.\n        obj_id_col : str, optional (default: None)\n            If ``split_multi_geoms=True``, the name of a column that specifies\n            a unique identifier for each geometry (e.g. the ``"BuildingId"``\n            column in many SpaceNet datasets.) See\n            :func:`solaris.utils.geo.split_multi_geometries` for more.\n\n        Yields\n        ------\n        tile_gdf : :class:`geopandas.GeoDataFrame`\n            A tile geodataframe.\n        tb : list\n            A list with ``[left, top, right, bottom] `` coordinates for the\n            boundaries contained by `tile_gdf`.\n        '
    self.src = _check_gdf_load(src)
    if self.verbose:
        print('Num tiles:', len(tile_bounds))
    self.src_crs = _check_crs(self.src.crs)
    if (tile_bounds_crs is not None):
        tile_bounds_crs = _check_crs(tile_bounds_crs)
    else:
        tile_bounds_crs = self.src_crs
    if (self.src_crs != tile_bounds_crs):
        reproject_bounds = True
    else:
        reproject_bounds = False
    self.proj_unit = self.src_crs.linear_units
    if (getattr(self, 'dest_crs', None) is None):
        self.dest_crs = self.src_crs
    for (i, tb) in enumerate(tile_bounds):
        if self.super_verbose:
            print('\n', i, '/', len(tile_bounds))
        if reproject_bounds:
            tile_gdf = clip_gdf(self.src, reproject_geometry(box(*tb), tile_bounds_crs, self.src_crs), min_partial_perc, geom_type, verbose=self.super_verbose)
        else:
            tile_gdf = clip_gdf(self.src, tb, min_partial_perc, geom_type, verbose=self.super_verbose)
        if (self.src_crs != self.dest_crs):
            tile_gdf = tile_gdf.to_crs(crs=self.dest_crs.to_wkt())
        if split_multi_geoms:
            split_multi_geometries(tile_gdf, obj_id_col=obj_id_col)
        (yield (tile_gdf, tb))
Generate `src` vector data tiles bounded by `tile_bounds`.

Arguments
---------
src : `str` or :class:`geopandas.GeoDataFrame`
    The source vector data to tile. Must either be a path to a GeoJSON
    or a :class:`geopandas.GeoDataFrame`.
tile_bounds : list
    A :class:`list` made up of ``[left, top, right, bottom] `` sublists
    (this can be extracted from
    :class:`solaris.tile.raster_tile.RasterTiler` after tiling imagery)
tile_bounds_crs : int, optional
    The EPSG code for the CRS that the tile bounds are in. If not
    provided, it's assumed that the CRS is the same as in `src`. This
    argument must be provided if the bound coordinates and `src` are
    not in the same CRS, otherwise tiling will not occur correctly.
geom_type : str, optional (default: "Polygon")
    The type of geometries contained within `src`. Defaults to
    ``"Polygon"``, can also be ``"LineString"``.
split_multi_geoms : bool, optional (default: True)
    Should multi-polygons or multi-linestrings generated by clipping
    a geometry into discontinuous pieces be separated? Defaults to yes
    (``True``).
min_partial_perc : float, optional (default: 0.0)
    The minimum percentage of a :class:`shapely.geometry.Polygon` 's
    area or :class:`shapely.geometry.LineString` 's length that must
    be retained within a tile's bounds to be included in the output.
    Defaults to ``0.0``, meaning that the contained portion of a
    clipped geometry will be included, no matter how small.
obj_id_col : str, optional (default: None)
    If ``split_multi_geoms=True``, the name of a column that specifies
    a unique identifier for each geometry (e.g. the ``"BuildingId"``
    column in many SpaceNet datasets.) See
    :func:`solaris.utils.geo.split_multi_geometries` for more.

Yields
------
tile_gdf : :class:`geopandas.GeoDataFrame`
    A tile geodataframe.
tb : list
    A list with ``[left, top, right, bottom] `` coordinates for the
    boundaries contained by `tile_gdf`.
def tile_generator(self, src, tile_bounds, tile_bounds_crs=None, geom_type='Polygon', split_multi_geoms=True, min_partial_perc=0.0, obj_id_col=None):
    'Generate `src` vector data tiles bounded by `tile_bounds`.\n\n        Arguments\n        ---------\n        src : `str` or :class:`geopandas.GeoDataFrame`\n            The source vector data to tile. Must either be a path to a GeoJSON\n            or a :class:`geopandas.GeoDataFrame`.\n        tile_bounds : list\n            A :class:`list` made up of ``[left, top, right, bottom] `` sublists\n            (this can be extracted from\n            :class:`solaris.tile.raster_tile.RasterTiler` after tiling imagery)\n        tile_bounds_crs : int, optional\n            The EPSG code for the CRS that the tile bounds are in. If not\n            provided, it\'s assumed that the CRS is the same as in `src`. This\n            argument must be provided if the bound coordinates and `src` are\n            not in the same CRS, otherwise tiling will not occur correctly.\n        geom_type : str, optional (default: "Polygon")\n            The type of geometries contained within `src`. Defaults to\n            ``"Polygon"``, can also be ``"LineString"``.\n        split_multi_geoms : bool, optional (default: True)\n            Should multi-polygons or multi-linestrings generated by clipping\n            a geometry into discontinuous pieces be separated? Defaults to yes\n            (``True``).\n        min_partial_perc : float, optional (default: 0.0)\n            The minimum percentage of a :class:`shapely.geometry.Polygon` \'s\n            area or :class:`shapely.geometry.LineString` \'s length that must\n            be retained within a tile\'s bounds to be included in the output.\n            Defaults to ``0.0``, meaning that the contained portion of a\n            clipped geometry will be included, no matter how small.\n        obj_id_col : str, optional (default: None)\n            If ``split_multi_geoms=True``, the name of a column that specifies\n            a unique identifier for each geometry (e.g. the ``"BuildingId"``\n            column in many SpaceNet datasets.) See\n            :func:`solaris.utils.geo.split_multi_geometries` for more.\n\n        Yields\n        ------\n        tile_gdf : :class:`geopandas.GeoDataFrame`\n            A tile geodataframe.\n        tb : list\n            A list with ``[left, top, right, bottom] `` coordinates for the\n            boundaries contained by `tile_gdf`.\n        '
    self.src = _check_gdf_load(src)
    if self.verbose:
        print('Num tiles:', len(tile_bounds))
    self.src_crs = _check_crs(self.src.crs)
    if (tile_bounds_crs is not None):
        tile_bounds_crs = _check_crs(tile_bounds_crs)
    else:
        tile_bounds_crs = self.src_crs
    if (self.src_crs != tile_bounds_crs):
        reproject_bounds = True
    else:
        reproject_bounds = False
    self.proj_unit = self.src_crs.linear_units
    if (getattr(self, 'dest_crs', None) is None):
        self.dest_crs = self.src_crs
    for (i, tb) in enumerate(tile_bounds):
        if self.super_verbose:
            print('\n', i, '/', len(tile_bounds))
        if reproject_bounds:
            tile_gdf = clip_gdf(self.src, reproject_geometry(box(*tb), tile_bounds_crs, self.src_crs), min_partial_perc, geom_type, verbose=self.super_verbose)
        else:
            tile_gdf = clip_gdf(self.src, tb, min_partial_perc, geom_type, verbose=self.super_verbose)
        if (self.src_crs != self.dest_crs):
            tile_gdf = tile_gdf.to_crs(crs=self.dest_crs.to_wkt())
        if split_multi_geoms:
            split_multi_geometries(tile_gdf, obj_id_col=obj_id_col)
        (yield (tile_gdf, tb))