I have two GeoSeries, consisting of points and polygons. I want to find the polygon in dataframe B that is closest to each point in dataframe A. The polygons are rooftops from https://github.com/Microsoft/USBuildingFootprints, which I already geocoded using https://github.com/Bonsanto/polygon-geohasher. I'm currently computing the 7 digit geohash of each point, and merging on buildings in neighboring 7 digit geohashes using `geotools.expand`. This is better than doing a full outer merge, but relies on `explode`. My general approach was to minimize calls of `distance`, since computing the distance from a point to a polygon is expensive. The code is a bit slow (~20 minutes to match 100k rows), and so I'm trying to make it faster. My searching points to r-trees, but I'm not familiar with those. Code below: ``` import pandas as pd import numpy as np import geopandas import geohash from shapely.geometry import Point def match_func(df): point = Point(df.iloc[0,:][['lat', 'long']]) df.loc[:, 'dist'] = geopandas.GeoSeries(df.geometry).distance(point) df = df.sort_values('dist') return(df.head(1)) def main(file): x = import_points() rooftop_df = import_rooftops() x['id'] = range(1, len(x) + 1) def neighbor_fun(lat,long): return(geohash.encode(lat,long,precision=7)) func1 = np.vectorize(neighbor_fun) x['g7_neighbor'] = func1(x['lat'], x['long']) x = x.explode('g7_neighbor') x = x.merge(rooftop_df, left_on='g7_neighbor', right_on='geo7') xg = x.groupby('id') xout = pd.concat([match_fun2(df_group) for group_name, df_group in xg]) return(xout) ```