Pour se concentrer sur (a) :
Dans le passé, j'ai précalculé des parties, en stockant les lat, long, xaxis, yaxis et zxais, où les x, y et z sont définis comme :
xaxis = cos(radians(Lat)) * cos(radians(Lon))
yaxis = cos(radians(Lat)) * sin(radians(Lon))
zaxis = sin(radians(Lat))
La distance peut ensuite être calculée en utilisant SQL de manière approximative comme (acos( xaxis * $xaxis + yaxis * $yaxis + zaxis * $zaxis ) * 6367.0 / 1.852)
(où ceux commençant par un $ sont précalculés pour le point de départ en question de la même manière que ci-dessus)
Le pré-calcul de cette manière pousse le déclencheur relativement coûteux vers un événement ponctuel et simplifie la requête.