Ok, spulciando in giro sono riuscito a scrivere questa funzione. Ovviamente andrebbe provata anche la tua soluzione e capire magari con stress test quale offre performance migliori!
Codice PHP:
public static function getNearby(float lat, float lng, string Type, int limit = 50, int distance = 50, string unit = 'km')
{
// Raggio della terra
if (unit == 'km') radius = 6371.009; // KM
elseif (unit == 'mi') radius = 3958.761; // MILES
// confine Latitudine
maxLat = lat + RadianToDegree(distance / radius);
minLat = lat - RadianToDegree(distance / radius);
// confine longitudine
maxLng = lng + RadianToDegree(distance / radius / Math.Cos(DegreeToRadian(lat)));
minLng = lng - RadianToDegree(distance / radius / Math.Cos(DegreeToRadian(lat)));
// e la select (Non ho scritto tutta la parte c# per eseguirla in quanto testata direttamente via sql)
var nearby = ('SELECT * FROM table WHERE lat > $minLat AND lat < $maxLat AND lng > $minLng AND lng < $maxLng ORDER BY ABS(lat - $lat) + ABS(lng - $lng) ASC;
return nearby;
}
private double DegreeToRadian(double angle)
{
return Math.PI * angle / 180.0;
}
private double RadianToDegree(double angle)
{
return angle * (180.0 / Math.PI);
}