PDA

Visualizza la versione completa : Ricerca Latitudine e Longitudine per raggio


xxstefanoxx
19-01-2015, 11:43
Salve a tutti, provo a spiegare il problema che ho da risolvere. Ho una tabella composta da due campi:
-Lat
-Long
Devo scrivere una query che data una Long e Lat in input mi restituisca tutte le Lat e Long salvate a db in un determinato raggio anch'esso dato in in input, è possibile ?
Grazie a tutti in anticipo

supermac
21-01-2015, 11:28
forse puoi farlo anche in sql ma devi cheiderlo nel forum adeguato

da codice devi ciclare un datareader di tutti i punti, ad ogni giro devi calcolarti la distanza di ogni punto dal punto che fornisci in input e selezionare il record che ha questa distanza inferiore al raggio dato in input.

Distanza tra due punti A(x1,y1) e B(x2,y2) si calcola con radice quadrata di [(x2- x1)2 + (y2- y1)2]

buon divertimento

xxstefanoxx
21-01-2015, 11:46
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!



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);
}

supermac
21-01-2015, 12:45
Non so perchè corregga le distanze con la curvatura terrestre (sono geograficamente ignorante) ma sarà sicuramente più precisa quella che hai postato. E' sicuramente più performante questa piuttosto che un ciclo su un datareader.

Loading