Hay Chcę znaleźć odległość (w milach) między 2 lokalizacjami, używając wartości długich i długich, i sprawdzić, czy są one w promieniu 10 mil od siebie.php mysql porównaj długie i długie, zwrotne poniżej 10 mil
Gdy użytkownik loguje się, ich długość/szerokość geograficzna wartości są zapisywane w sesji
$_SESSION['lat']
$_SESSION['long']
Mam 2 funkcje
Ten odrabia dystans w milach i zwraca wartość zaokrągloną
function distance($lat1, $lng1, $lat2, $lng2){
$pi80 = M_PI/180;
$lat1 *= $pi80;
$lng1 *= $pi80;
$lat2 *= $pi80;
$lng2 *= $pi80;
$r = 6372.797; // mean radius of Earth in km
$dlat = $lat2 - $lat1;
$dlng = $lng2 - $lng1;
$a = sin($dlat/2) * sin($dlat/2) + cos($lat1) * cos($lat2) * sin($dlng/2) * sin($dlng/2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
$km = $r * $c;
return floor($km * 0.621371192);
}
Ten zwraca wartość bool, jeśli odległość między 2 zestawami szerokości i długości jest mniejsza niż 10.
function is_within_10_miles($lat1, $lng1, $lat2, $lng2){
$d = distance($lat1, $lng1, $lat2, $lng2);
if($d <= 10){
return True;
}else{
return False;
}
}
Obie funkcje działają zgodnie z oczekiwaniami, jeśli daję 2 zestawy lat/longów, a odległość między nimi wynosi 20 mil, moja funkcja is_within_10_miles() zwraca wartość false.
Teraz mam bazę danych "lokalizacje" (4 pola - ID, nazwa, lat, długie).
Chcę znaleźć wszystkie lokalizacje w promieniu 10 mil.
Wszelkie pomysły?
Edycja: mogę pętli wszystkich i przeprowadzenia is_within_10_miles() na nich, jak to
$query = "SELECT * FROM `locations`";
$result = mysql_query($query);
while($location = mysql_fetch_assoc($result)){
echo $location['name']." is ";
echo distance($lat2, $lon2, $location['lat'], $location['lon']);
echo " miles form your house, is it with a 10 mile radius? ";
if(is_within_10_miles($lat2, $lon2, $location['lat'], $location['lon'])){
echo "yeah";
}else{
echo "no";
}
echo "<br>";
}
Wynik próbka będzie
goodison park is 7 miles form your house, is it with a 10 mile radius? yeah
potrzebne jakoś wykonać funkcję is_within_10_miles w moim zapytaniu.
edytuj
Ta legenda z http://www.zcentric.com/blog/2007/03/calculate_distance_in_mysql_wi.html wymyślił ten ...
SELECT ((ACOS(SIN($lat * PI()/180) * SIN(lat * PI()/180) + COS($lat * PI()/180) * COS(lat * PI()/180) * COS(($lon - lon) * PI()/180)) * 180/PI()) * 60 * 1.1515) AS distance FROM members HAVING distance<='10' ORDER BY distance ASC
To faktycznie działa. Problem polega na tym, że chcę wybrać * wiersze zamiast wybierać je jeden po drugim. Jak mogę to zrobić?
Zobacz moją zmianę. Jest to funkcja MySQL, która zrobi to, czego potrzebujesz. –