1

PHP と SQL で構築されたローカル コミュニティ向けの相乗りアプリを構築します。私は通常、php コーディングにうんざりしていますが、リストに必要な数式を探して困惑しています。

  • プライマリ ユーザーの経度/緯度を考慮して、最も近いユーザーから最も遠いユーザーの上位 5 人
  • 一次利用者の経度・緯度500メートル以内の者に限る

SQL データベースには、5 分間隔で更新されるすべてのオンライン ユーザーの経度/緯度が含まれています。

いろいろと調べてみましたが、探し方が間違っているのではないかと思います。どんなガイダンスも大歓迎です。

4

1 に答える 1

0

次の SQL クエリは、球面余弦法則を使用して、テーブル内の座標と座標の間の距離を計算します。

d = acos( sin(lat1).sin(lat2) + cos(lat1).cos(lat2).cos(lng2-lng1) ).R

クエリはSQL 数学関数を使用します

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 ブロックのエコーを削除します。

于 2013-12-07T12:40:03.880 に答える