Para focar em (a):
No passado, eu pré-calculei partes, armazenando o lat, long, xaxis, yaxis e zxais, onde x, y &z são definidos como:
xaxis = cos(radians(Lat)) * cos(radians(Lon))
yaxis = cos(radians(Lat)) * sin(radians(Lon))
zaxis = sin(radians(Lat))
A distância pode ser calculada usando SQL vagamente como
(acos( xaxis * $xaxis + yaxis * $yaxis + zaxis * $zaxis ) * 6367.0 / 1.852)
(onde aqueles que começam com $ são pré-calculados para o ponto inicial em questão da mesma maneira que acima) A pré-computação dessa maneira empurra o trigonômetro relativamente caro para um evento único e simplifica a consulta.