Hay ben enlem ve uzun değerlerini kullanarak 2 konum arasında (mil olarak) mesafeyi bulmak ve birbirlerine bir 10 kilometre yarıçapı içinde olup olmadığını kontrol etmek istiyorum.
Bir kullanıcı oturum açtığında, enlem / boylam değerleri oturumda kaydedilir
$_SESSION['lat']
$_SESSION['long']
Ben 2 işlevleri
Bu bir km mesafeyi dışarı çalışır ve bir yuvarlak değeri döndürür
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);
}
Lat ve uzun yılların 2 takım arasındaki mesafe 10 altında ise bu bir bool döndürür.
function is_within_10_miles($lat1, $lng1, $lat2, $lng2){
$d = distance($lat1, $lng1, $lat2, $lng2);
if( $d <= 10 ){
return True;
}else{
return False;
}
}
Beklendiği gibi i lat / uzun ürün 2 set vermek ve aralarındaki mesafe benim is_within_10_miles () fonksiyonu false döndürürse, 20 mil demek ise her iki işlevi çalışır.
Şimdi, 'yerleri' (- kimliği, adı, enlem, uzun 4 alanlar) bir veritabanı var.
Ben bir 10 kilometre yarıçapı içindeki tüm yerleri bulmak istiyorum.
Herhangi bir fikir?
EDIT: I can loop through ALL the and perform the is_within_10_miles() on them like this
$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>";
}
Örnek bir sonuç olurdu
goodison park is 7 miles form your house, is it with a 10 mile radius? yeah
Ben nasılsa benim sorgu içinde is_within_10_miles işlevi gerçekleştirmek gerekir.
EDIT EDIT
Bu efsane http://www.zcentric.com/blog/2007/03/calculate_distance_in_mysql_wi.html bu ile geldi ...
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
Bu aslında çalışır. Sorun i * satırları yerine, bunları tek tek seçerek seçmek istiyor. Ben bunu nasıl yapacağız?