选择不同的经度和纬度值并找到它们的中位数

3
我正在使用Google Maps API V3和jQuery创建一个Phonegap应用程序。
当检测到路面坑洞时,该应用程序会将经度和纬度值分别存储在MySQL数据库中。我需要做的是选择相对接近的任何值,并且很可能是同一个路面坑洞。
有没有一种方法可以在jQuery/PHP/SQL中获取相对接近的值,找到它们的平均点,然后使用该值继续处理其他事情?
基本上,我需要的是一旦检测到特定的路面坑洞5次,就会在Google地图上绘制出来。但是只有在达到此阈值后才会这样做。困难在于相同的路面坑洞可能会根据报告设备的精度略有不同的经度和纬度值。
2个回答

2
你需要使用Haversine公式来计算两个给定地点的经纬度坐标之间的距离。基于此,你可以编写一个方法,使用公里范围来检查所有接近/附近给定坐标的值。

Haversine公式计算距离

$('some_element').click(function(){
    var location1 = [lat, lon] // Specify Longitude and latitude
    var location2 = [lat, lon] // Specify Longitude and latitude

    var lat1 = location1[0], lon1 = location1[1];
    var lat2 = location2[0], lon2 = location2[1];
    var earth = 6371 // Earth's Radius in Kms

    var dLat = (lat2-lat1) * Math.PI / 180;
    var dLon = (lon2-lon1) * Math.PI / 180;
    var nlat1 = (lat1) * Math.PI / 180;
    var nlat2 = (lat2) * Math.PI / 180;
    // Calculation
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(nlat1) * Math.cos(nlat2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = earth * c;
    var distance = Math.round(d*Math.pow(10,2)) / Math.pow(10,2); //Round off to 2 decimal places
    alert(distance);
});

1

由于您需要在新的坑洞附近识别坑洞,以下代码可以以米为单位完成此操作。它在使用POD进行错误检查的MySQL查询中使用Haversine公式

$lat和$lng是新坑洞的坐标,$radius是以米为单位的搜索半径。 6378160是赤道上地球的半径(以米为单位)。

为确保在此级别上的准确性,数据库中的坐标必须至少有4个小数位{{link2:请参见维基百科}}

编辑

    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; 

这段代码将用于将新的坑洞细节输入到数据库中,我的理解是否正确?如果我理解正确的话,它会获取新发现的坑洞的详细信息,将其纬度和经度与已经在数据库中的坑洞进行比较,如果附近没有坑洞,则将该坑洞的详细信息插入到数据库中。我的理解正确吗? - user1809790
@user1809790 再次阅读您的问题后,发现它不符合5倍标准。如果需要,请告知我。 - david strachan
如果你有时间/经验,我会非常高兴。我本人并不熟悉JavaScript/PHP,但正在尝试构建我的第一个移动应用:/ - user1809790
我假设你会有后端MySQL/PHP来完成繁重的工作。 - david strachan
我有一个MySQL数据库和一些PHP文件,它们将作为Web服务,Phonegap应用程序将连接到它们。 - user1809790

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接