Para centrarse en (a):
En el pasado, precalculé partes, almacenando la latitud, longitud, eje x, eje y y zxais, donde x, y y z se definen como:
xaxis = cos(radians(Lat)) * cos(radians(Lon))
yaxis = cos(radians(Lat)) * sin(radians(Lon))
zaxis = sin(radians(Lat))
Luego, la distancia se puede calcular usando SQL libremente como (acos( xaxis * $xaxis + yaxis * $yaxis + zaxis * $zaxis ) * 6367.0 / 1.852)
(donde los que comienzan con $ se calculan previamente para el punto de inicio en cuestión de la misma manera que arriba)
La precomputación de esta manera lleva la activación relativamente costosa a un evento de una sola vez y simplifica la consulta.