我正在使用googlemapsapiv3和jquery创建一个phonegap应用程序。
当检测到坑洞时,应用程序将经度和纬度值分别存储在mysql数据库中。我需要做的是选择任何比较接近的值,并且很可能是同一个坑。
在jquery/php/sql中,是否有任何方法可以获得相对接近的值,找到它们的平均点,然后使用该值继续处理其他一些事情?
基本上,我需要的是,一旦一个特定的坑洞被探测到5次,它将被绘制在谷歌地图上。不过,只有在达到这一阈值之后。困难在于,同一个坑洞可能在经纬度值稍有不同的情况下报告,这取决于报告坑洞的设备的准确性。

最佳答案

由于需要识别新坑附近的坑洞,下面的代码可以以米为单位执行此操作。它使用带有错误检查的pod在mysql查询中使用Haversine Formula
$lat和$lng是新坑洞的坐标,$radius是以米为单位的搜索半径。6378160是地球赤道的半径,单位为米。
为确保此级别的精度,数据库中的坐标必须至少有4个小数位See Wiki
编辑

    try {
    // Prepare search statement
    $stmt1 = $dbh->prepare("SELECT id, lat, lng, cnt, ( 6378160 * acos( cos( radians(?) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS  distance FROM potholes  HAVING distance <  ? ORDER BY distance LIMIT 0,10");
    // Assign parameters
    $stmt1->bindParam(1,$lat);
    $stmt1->bindParam(2,$lng);
    $stmt1->bindParam(3,$lat);
    $stmt1->bindParam(4,$radius);
    //Execute query
    $stmt1->setFetchMode(PDO::FETCH_ASSOC);
    $stmt1->execute();
    if ($stmt1->rowCount()>0) {//Existing pothole
        // fetch row
        $row = $stmt1->fetch();
        $id = $row['id'];
        $lat1 = $row['lat'];
        $lng1 = $row['lng'];
        $cnt = $row['cnt'];
        $meanLat = (($lat1*$cnt)+$lat)/($cnt+1);
        $meanLng = (($lng1*$cnt)+$lng)/($cnt+1);
        ++$cnt;
        // Prepare UPDATE statement existing pothole
        $stmt2 = $dbh->prepare("UPDATE  `potholes` SET  `lat` = ?,`cnt` =  ? WHERE  `potholes`.`id` = ? LIMIT 1");
        // Assign parameters
        $stmt2->bindParam(1,$meanLat);
        $stmt2->bindParam(2,$cnt);
        $stmt2->bindParam(3,$id);
        $stmt2->execute();
    //  }
    }else{//New pothole
        // Prepare INSERT statement new pothole
        $stmt3 = $dbh->prepare("INSERT INTO `potholes` (`id`, `lat`, `lng`, `cnt`) VALUES (NULL, ?, ?, '1')");
        // Assign parameters
        $stmt3->bindParam(1,$lat);
        $stmt3->bindParam(2,$lng);
        $stmt3->execute();

    }
echo json_encode($data);//Echo to calling page if required
}



catch(PDOException $e) {
    echo "Error Message.". $e->getMessage() ;// Remove or modify after testing
    file_put_contents('PDOErrors.txt',date('[Y-m-d H:i:s]').", data2c.php, ". $e->getMessage()."\r\n", FILE_APPEND);
 }
//Close the connection
$dbh = null;

关于php - 选择不同的经度和纬度值并找到它们的中位数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13997385/

10-12 02:20