Geodésicos vecinos más cercanos eficientes

Comenzando con los datos de latitud / longitud (en radianes), estoy tratando de encontrar eficientemente los n vecinos más cercanos, idealmente con la distancia geodésica (WGS-84).

En este momento estoy usando BallTree de Sklearn con distancia de línea de largo (KD-Tres solo toma distancia de minkowskian), que es agradable y rápido (3-4 segundos para encontrar los 5 vecinos más cercanos para 1200 ubicaciones en 7500 posibles coincidencias), pero no es tan preciso como Necesito. Código:

tree = BallTree(possible_matches[['x', 'y']], leaf_size=2, metric='haversine') distances, indices = tree.query(locations[['x', 'y']], k=5) 

Cuando sustituyo en una función personalizada la métrica ( metric=lambda u, v: geopy.distance.geodesic(u, v).miles ) lleva un tiempo “irrazonablemente” (4 minutos en el mismo caso que anteriormente). Está documentado que las funciones personalizadas pueden tardar mucho tiempo, pero no me ayudan a resolver mi problema.

Miré el uso de un árbol KD con coordenadas ECEF y distancia euclidiana, pero no estoy seguro de que eso sea más preciso.

¿Cómo puedo mantener la velocidad de mi método actual, pero mejorar la precisión de mi distancia?

La razón principal por la que su métrica es lenta es que está escrita en Python, mientras que otras métricas en sklearn están escritas en Cython / C ++ / C.

Entonces, como se discutió aquí para Random Forests o aquí , tendría que implementar su métrica en Cython, crear su propia versión de BallTree e incluir su métrica personalizada allí.