2012-05-27 10 views
9

Mam tabelę MySQL w usłudze PHP zawierającą długość i szerokość geograficzną. Chcę wysłać użytkownikowi tylko, powiedzmy, 5 najbliższych współrzędnych. Napisałem metodę, która oblicza odległość od współrzędnych do tych, które użytkownik wysłał w żądaniu POST, ale nie jestem pewien, jak ją posortować i tylko odesłać kilka.PHP Sortowanie najbliższych współrzędnych

Oto metoda odległość:

function distance($longToCompare,$latToCompare) { 
    $dlong = $request_long - $longToCompare; 
    $dlat = $request_lat - $latToCompare; 
    $a = pow(sin($dlat/2)) + cos($latToCompare)*cos($request_lat)*pow(sin($dlong/2)); 
    $c = 2*atan2(sqrt($a),sqrt(1-$a)); 
    return 6373*$c; 
} 

a użytkownik aktualnie dostaje cały DB (na razie, jednocześnie rozwijając to małe, ale w przyszłości może to być dość duża)

$q = mysql_query("SELECT * FROM Coordinates"); 
$coordinates = array(); 
while ($e = mysql_fetch_assoc($q)) { 
    $coordinates[] = $e; 
} 
print (json_encode($coordinates)); 

Czy ktoś może wskazać mi właściwy kierunek? Jestem raczej nowy w PHP, wiem, że mogę utworzyć niestandardowe sortowanie za pomocą uasort, ale nie jestem całkiem pewien, jak go używać, korzystając z tej funkcji odległości.

EDIT: Stosując rozwiązanie @Norse „s, bieżące zapytanie brzmi:

$request_long = $_POST['longitude']; 
$request_lat = $_POST['latitude']; 
    $km = 0.5; 
     $query = "SELECT *, 
    (6373 * acos(cos(radians('$request_lat')) * 
    cos(radians(latitude)) * 
    cos(radians(longitude) - 
    radians('$request_long')) + 
    sin(radians('$request_lat')) * 
    sin(radians(latitude)))) 
    AS distance FROM Coordinates HAVING distance < '$km' ORDER BY distance ASC LIMIT 0, 5"; 
     $coordinates = array(); 
     while ($e = mysql_fetch_assoc($query)) { 
      $coordinates[] = $e; 
     } 
     print (json_encode($coordinates)); 
+0

Czy rozważałeś napisanie funkcji mysql i skorzystałeś z niej w zapytaniu sql? – WojtekT

+0

Jestem całkiem nowy w tej całej sprawie DB. czy możesz uszczegółowić? –

+0

czy jest to platforma Junaio AR? – HamZa

Odpowiedz

22

Stosując algorytm Google:

$lon = //your longitude 
$lat = //your latitude 
$miles = //your search radius 

$query = "SELECT *, 
(3959 * acos(cos(radians('$lat')) * 
cos(radians(latitude)) * 
cos(radians(longitude) - 
radians('$lon')) + 
sin(radians('$lat')) * 
sin(radians(latitude)))) 
AS distance FROM yourtable HAVING distance < '$miles' ORDER BY distance ASC LIMIT 0, 5" 

latitude i longitude w tego zapytania będą swoją lat/nazwa kolumny.

+0

Dzięki, Otrzymuję błąd: mysql_fetch_assoc(): podany argument nie jest prawidłowym wynikiem MySQL $ lon i $ lat są odbierane z urządzenia GPS, w postaci 35.21371 na przykład –

+0

Hmm. Nie widzę, skąd mógłby pochodzić błąd. Właśnie uruchomiłem to zapytanie, aby się upewnić, że wszystko działa dobrze. – Norse

+0

Edytował pytanie, aby dołączyć bieżący kod. czy możesz sprawdzić, czy są jakieś problemy? –

3

Napotkałem sam problem ostatnio. Postanowiłem napisać funkcję mysql, aby obliczyć odległość, a następnie użyć jej w zapytaniu sql. Mysql funkcja:

CREATE FUNCTION distance(lat1 float, lon1 float, lat2 float, lon2 float) 
RETURNS float 
RETURN ACOS(SIN(RADIANS(lat1))*SIN(RADIANS(lat2))+COS(RADIANS(lat1))*COS(RADIANS(lat2))*COS(RADIANS(lon2-lon1)))*6371 

Jeśli tabela zawiera kolumny F. E. Coordinateslatitude i longitude wówczas kod może wyglądać następująco:

$q = mysql_query("SELECT * FROM Coordinates ORDER BY 
    distance(latitude, longitude, $lat, $lon) LIMIT 5"; 

Gdzie $lat i $lon zawierają warunkiem lokalizację.

+0

Gdzie działa FUNKCJA CREATE? w skrypcie PHP, czy używając kwerendy wewnątrz zarządzania MySQL? –

+1

Musisz wykonać to raz używając dowolnego narzędzia, którego używasz do zarządzania bazą danych mysql. – WojtekT

+0

Dzięki, otrzymuję komunikat o błędzie, że dostęp jest zabroniony przy użyciu metody wewnątrz SQLBuddy .. –

Powiązane problemy