MySQL funzione per determinare CAP di prossimità / Range
Domanda
Sono stato in grado di creare la funzione php per determinare un elenco di codici di avviamento postale entro un certo intervallo di un dato codice di avviamento postale. Tuttavia, il mio prossimo compito è un po 'più complesso.
Consente di dire che la tabella contiene le seguenti colonne:
id,
username
info
latitude
longitude
range
Ogni record ha un ID univoco fila, alcune informazioni, una latitudine, longitudine, e una portata massima da quelle coordinate che la persona vuole questa voce per essere trovato per. Quindi, se creo una voce con le coordinate -20, 50 con una serie di 15, il che significa che voglio solo persone all'interno di 15 miglia delle coordinate -20, 50 per essere in grado di vedere il mio ingresso. Capire la latitudine e la longitudine dell'utente che esegue la ricerca è cosa da poco.
Quando un utente sta cercando attraverso il database, tutti i record devono essere recuperate per la latitudine e longitudine coordinate entro il valore del campo da parte degli utenti latitudine / longitudine.
Così, un esempio non funzionale di codice utilizzando la formula della distanza per illustrare questo sarebbe
$userLat
= La latitudine dell'utente che esegue la ricerca
$userLong
= La longitudine dell'utente che esegue la ricerca
SELECT info FROM table
WHERE sqrt(($userLat - lat)^2 - ($userLong - long)^2) <= range
ORDER BY username ASC
che sarebbe l'ideale, ma non è valida dal punto di vista di codifica. C'è un modo per eseguire i confronti precedenti utilizzando PHP e MySQL in una query? Ciò comporterebbe la possibilità di eseguire operazioni utilizzando più valori di colonna da una data riga.
UPDATE + SOLUTION
Ho creato un'altra voce domanda che risolve questo problema e ha una funzione molto compatto a fare ciò che voleva questa domanda. La funzione data dal coderpros servito da ispirazione per esso (la sua funzione ha molto meglio di movimentazione per determinate situazioni). Tuttavia, dal momento che sto usando la mia funzione con un elevato grado di controllo sul ingresso, ho creato una funzione separata. Lo si può trovare al link qui sotto:
MySQL User Defined Function per Latitudine Longitudine Sintassi
Soluzione
Questa elegante funzione lil mySQL che ho scritto dovrebbe sicuramente fare il trucco per voi.
BEGIN
DECLARE x decimal(18,15);
DECLARE EarthRadius decimal(7,3);
DECLARE distInSelectedUnit decimal(18, 10);
IF originLatitude = relativeLatitude AND originLongitude = relativeLongitude THEN
RETURN 0; -- same lat/lon points, 0 distance
END IF;
-- default unit of measurement will be miles
IF measure != 'Miles' AND measure != 'Kilometers' THEN
SET measure = 'Miles';
END IF;
-- lat and lon values must be within -180 and 180.
IF originLatitude < -180 OR relativeLatitude < -180 OR originLongitude < -180 OR relativeLongitude < -180 THEN
RETURN 0;
END IF;
IF originLatitude > 180 OR relativeLatitude > 180 OR originLongitude > 180 OR relativeLongitude > 180 THEN
RETURN 0;
END IF;
SET x = 0.0;
-- convert from degrees to radians
SET originLatitude = originLatitude * PI() / 180.0,
originLongitude = originLongitude * PI() / 180.0,
relativeLatitude = relativeLatitude * PI() / 180.0,
relativeLongitude = relativeLongitude * PI() / 180.0;
-- distance formula, accurate to within 30 feet
SET x = Sin(originLatitude) * Sin(relativeLatitude) + Cos(originLatitude) * Cos(relativeLatitude) * Cos(relativeLongitude - originLongitude);
IF 1 = x THEN
SET distInSelectedUnit = 0; -- same lat/long points
-- not enough precision in MySQL to detect this earlier in the function
END IF;
SET EarthRadius = 3963.189;
SET distInSelectedUnit = EarthRadius * (-1 * Atan(x / Sqrt(1 - x * x)) + PI() / 2);
-- convert the result to kilometers if desired
IF measure = 'Kilometers' THEN
SET distInSelectedUnit = MilesToKilometers(distInSelectedUnit);
END IF;
RETURN distInSelectedUnit;
END
Si impiegano originLatitude, originLongitude, relativeLatitude, relativeLongitude, e misura come parametri. Misura può essere semplicemente Miles
o Kilometers
Speranza che aiuta!