2013-12-07 4 views
1

Построение приложения для автопокрытия для моего местного сообщества, построенного на PHP и SQL. В то время как я обычно белый с кодированием PHP, я озадачен искал математическую формулу, необходимую для списка:Расчет Haversine: Показать пользователей в наборе

  • Топ 5 близлежащих пользователей, упорядоченный от ближайшей к наиболее удаленном учитывая длинный/лат основного пользователя
  • Ограничено теми, кто находится в пределах 500 метров от основных пользователей long/lat

База данных SQL содержит длинный/лат каждого онлайн-пользователя, который обновляется с интервалом в 5 минут.

Ищите вокруг, но думаю, что я могу искать неправильную вещь. Любые рекомендации приветствуются.

+0

Выполняется какой-либо пример кода? Вы используете карты Google? Как вы получаете координаты GPS. – Edwinner

+0

Нет карт google, на данный момент используя местоположение html5 для получения координат gps. Просто нашел это, поэтому попытаюсь изменить мой код и обновить: http://www.arubin.org/files/geo_search.pdf – Tom

+0

Возможный дубликат [MySQL Great Circle Distance (Формула Хаверсина)] (http: // stackoverflow.com/questions/574691/mysql-great-circle-distance-haversine-formula) –

ответ

0

В следующем SQL-запросе используется Spherical Law of Cosines для расчета расстояния между координатой и координатами в таблице.

д = экоса (син (LAT1) .sin (LAT2) + COS (LAT1) .cos (LAT2) .cos (lng2-lng1)) .R

В запросе используется SQL Math functions

require("dbinfo.php");//database parameters 
&center_lat = primaryLat; 
$center_lng = primarylng; 
$radius = 0.5;//500 meters 

$arr = array(); 
//Connect to database 
$dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
try { 
    // Prepare statement 
    $stmt = $dbh->prepare("SELECT name, lat, lng, (3959 * acos(cos(radians(?)) * cos(radians(lat)) * cos(radians(lng) - radians(?)) + sin(radians(?)) * sin(radians(lat)))) AS distance FROM gbstn HAVING distance < ? ORDER BY distance LIMIT 0 , 5"); 
    // Assign parameters 
    $stmt->bindParam(1,$center_lat); 
    $stmt->bindParam(2,$center_lng); 
    $stmt->bindParam(3,$center_lat); 
    $stmt->bindParam(4,$radius); 
    //Execute query 
    $stmt->setFetchMode(PDO::FETCH_OBJ); 
    $stmt->execute(); 
    //Show the results 
    while($obj = $stmt->fetch()) { 
     $arr[] = $obj; 
    } 
    if (count($arr) >= 1) 
    { 
     echo '{"marker":'.json_encode($arr).'}'; 
    }else{ 
     echo '{"marker":[{"name":"No Results","lat":'.$center_lat.',"lng":'.$center_lng.',"distance":0}]}'; 
    } 

} 


catch(PDOException $e) { 
    echo "I'm sorry I'm afraid you can't do that.". $e->getMessage() ;// Remove or modify after testing 
    file_put_contents('PDOErrors.txt',date('[Y-m-d H:i:s]').", mapSelect.php, ". $e->getMessage()."\r\n", FILE_APPEND); 
} 
//Close the connection 
$dbh = null; 
?> 

Использование PDO вместо устаревших mysql_ функции.

Вам потребуется внести изменения в заявление. Также удалите эхо в блоке catch после отладки.

+0

Отлично - спасибо за это. Попробует реализовать сейчас – Tom

Смежные вопросы