def generate_tile_coordinates(roi, num_tiles):
    # type: (GeoVector, Tuple[int, int]) -> Iterator[GeoVector]
    """Yields N x M rectangular tiles for a region of interest.

    Parameters
    ----------
    roi : GeoVector
        Region of interest
    num_tiles : tuple
        Tuple (horizontal_tiles, vertical_tiles)

    Yields
    ------
    ~telluric.vectors.GeoVector

    """
    bounds = roi.get_shape(roi.crs).bounds

    x_range = np.linspace(bounds[0], bounds[2], int(num_tiles[0]) + 1)
    y_range = np.linspace(bounds[1], bounds[3], int(num_tiles[1]) + 1)

    for y_start, y_end in zip(y_range[:-1], y_range[1:]):
        for x_start, x_end in zip(x_range[:-1], x_range[1:]):
            new_roi = GeoVector(
                Polygon.from_bounds(x_start, y_start, x_end, y_end),
                roi.crs
            )

            yield new_roi
Yields N x M rectangular tiles for a region of interest.

    Parameters
    ----------
    roi : GeoVector
        Region of interest
    num_tiles : tuple
        Tuple (horizontal_tiles, vertical_tiles)

    Yields
    ------
    ~telluric.vectors.GeoVector