2011-01-10 11 views

risposta

26

Hai solo bisogno di utilizzare seguente query.

Ad esempio, è possibile immettere latitudine e longitudine 37 e -122 in gradi. E si desidera cercare utenti entro 25 miglia dalla latitudine e longitudine correnti.

SELECT item1, item2, 
    (3959 * acos(cos(radians(37)) 
        * cos(radians(lat)) 
        * cos(radians(lng) 
         - radians(-122)) 
        + sin(radians(37)) 
        * sin(radians(lat)) 
       ) 
    ) AS distance 
FROM geocodeTable 
HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20; 

Se si desidera cercare la distanza in km, quindi sostituire 3959 con 6371 nella query precedente.

Si può anche fare questo tipo:

  1. Seleziona tutto latitudine e la longitudine

  2. Poi calcolare la distanza per ogni record.

  3. Il processo precedente può essere eseguito con reindirizzamento multiplo.

Per l'ottimizzazione della query è possibile utilizzare la stored procedure.

E this può anche aiutare.

+1

evviva per questo compagno –

+0

Un piccolo avvertimento in quanto questo potrebbe sfuggire di mano se la tabella con punti aumenta di dimensioni. Finirai per fare i calcoli per ogni punto della tabella per ogni query. –

+0

Per questo può essere utilizzata la procedura memorizzata. – Gaurav

6

È consigliabile scegliere un database abilitato spazialmente come mysql o postgresql e quindi è possibile utilizzare alcune delle funzioni pronte che forniscono. Altrimenti, se si desidera farlo manualmente, controllare this per heads up.

+0

Consiglierei postgresql con l'estensione postgis. È più veloce di MySQL. – 23tux

+0

@ 23tux È più veloce e di gran lunga più completo, ma mysql è ciò che la maggior parte delle persone conosce e le estensioni spaziali mysql sono molto utili –

6

Se stai cercando codice PHP per calcolare la distanza tra due serie di coordinate, ecco una classe che ho adattato che calcolerà la distanza in chilometri. Tuttavia, se stai usando un database ti suggerirei di valutare se il tuo database sia o meno capace di calcoli spaziali (so che SQL Server e MySQL sono fuori di testa).

Ecco un link interessante per una soluzione SQL che potrebbe essere utile verificare. Optimising a haversine formula SQL call in PHP

class Distance 
{ 
    /** 
    * Mean raidus of the earth in kilometers. 
    * @var double 
    */ 
    const RADIUS = 6372.797; 

    /** 
    * Pi divided by 180 degrees. Calculated with PHP Pi constant. 
    * @var double 
    */ 
    const PI180   = 0.017453293; 

    /** 
    * Constant for converting kilometers into miles. 
    * @var double 
    */ 
    const MILES  = 0.621371192; 

    /** 
    * Calculate distance between two points of latitude and longitude. 
    * @param double $lat1 The first point of latitude. 
    * @param double $long1 The first point of longitude. 
    * @param double $lat2 The second point of latitude. 
    * @param double $long2 The second point of longitude. 
    * @param bool $kilometers Set to false to return in miles. 
    * @return double The distance in kilometers or miles, whichever selected. 
    */ 
    public static function getDistance($lat1, $long1, $lat2, $long2, $kilometers = true) 
    { 
     $lat1 *= self::PI180; 
     $long1 *= self::PI180; 
     $lat2 *= self::PI180; 
     $long2 *= self::PI180; 

     $dlat = $lat2 - $lat1; 
     $dlong = $long2 - $long1; 

     $a = sin($dlat/2) * sin($dlat/2) + cos($lat1) * cos($lat2) * sin($dlong/2) * sin($dlong/2); 
     $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); 

     $km = self::RADIUS * $c; 

     if($kilometers) 
     { 
      return $km; 
     } 
     else 
     { 
      return $km * self::MILES; 
     } 
    } 
} 

//example 
echo Distance::getDistance(40.686748, -89.555054, 40.453078, -88.939819); 
+0

quindi ho bisogno del databse per supportare alcune funzioni speciali? Non può essere fatto direttamente usando PHP da solo? se salvo le coordinate lat/lng come 2 campi nel DB –

+0

Il codice che ho postato ti darà la distanza tra due coordinate. –

Problemi correlati