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

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top