2011-01-10 5 views

Odpowiedz

26

Wystarczy użyć następującego zapytania.

Na przykład szerokość i długość geograficzna 37 i -122 są wprowadzane w stopniach. I chcesz wyszukać użytkowników w promieniu 25 mil od aktualnej podanej szerokości i długości geograficznej.

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; 

Jeśli chcesz przeszukać odległość w km, zastąp 3959 6371 w powyższym zapytaniu.

Można również zrobić to tak:

  1. Zaznacz wszystkie szerokości i długości geograficznej

  2. Następnie obliczyć odległość dla każdego rekordu.

  3. Powyższy proces można wykonać za pomocą wielokrotnego przekierowania.

Aby zoptymalizować zapytanie, można skorzystać z procedury zapisanej.

Pomocne może też być this.

+1

Pozdrowienia dla tego partnera –

+0

Trochę ostrzeżenia, ponieważ to wymknie się spod kontroli, jeśli tabela z punktami zwiększy swój rozmiar. Kończysz wykonywanie obliczeń dla każdego punktu w tabeli dla każdego zapytania. –

+0

Do tego można użyć procedury zapisanej w pamięci. – Gaurav

6

Należy wybrać bazę danych, która jest włączona przestrzennie, jak mysql lub postgresql, a następnie można korzystać z niektórych funkcji gotowych, które udostępniają. Jeśli chcesz zrobić to ręcznie, sprawdź, czy this dla heads up.

+0

Polecam postgresql z rozszerzeniem postgis. Jest o wiele szybszy niż MySQL. – 23tux

+0

@ 23tux Jest szybszy i zdecydowanie bardziej kompletny, ale mysql to, co większość ludzi zna, a rozszerzenia przestrzenne mysql są bardzo przydatne –

6

Jeśli szukasz kodu PHP do obliczenia odległości między dwoma zestawami współrzędnych, to klasa, którą dostosowałem, będzie obliczać odległość w kilometrach. Jednakże, jeśli korzystasz z bazy danych, sugerowałbym, abyś sprawdził, czy twoja baza danych jest zdolna do obliczeń przestrzennych (wiem, że SQL Server i MySQL są, z mojej strony).

Oto interesujące łącze do rozwiązania SQL, które możesz chcieć sprawdzić. 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

, więc czy potrzebuję databse do obsługi niektórych specjalnych funkcji? Czy można to zrobić bezpośrednio za pomocą samego PHP? jeśli zapiszę współrzędne lat/lng jako 2 pola w DB –

+0

Opublikowany kod da ci odległość między dwiema współrzędnymi. –

Powiązane problemy