def intersect_using_spatial_index(source_gdf, source_index, tile):
    """Conduct spatial intersection using spatial index 
        for candidates GeoDataFrame to make queries faster.

    Parameters
    ----------
    source_gdf : GeoDataFrame
        [description]
    source_index : geopandas.sindex.SpatialIndex
        spatial index of the source
    tile : Shapely geometry
        geometry for which intersections with the sources are found

    Returns
    -------
    GeoDataFrame
        intersections between source_gdf and tile geometry
    """
    
    possible_matches_index = []

    bounds = tile.bounds
    c = list(source_index.intersection(bounds))
    possible_matches_index += c
    # Get unique candidates
    unique_candidate_matches = list(set(possible_matches_index))
    possible_matches = source_gdf.iloc[unique_candidate_matches]

    result = possible_matches.loc[possible_matches.intersects(tile)\
         ^ possible_matches.touches(tile)]
    return result