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

我正在使用Google Maps API V3和jQuery创建一个Phonegap应用程序。

当检测到坑洞时,应用程序将经度和纬度值分别存储在MySQL数据库中。 我需要做的是选择任何相对较近的值,并且很可能是相同的坑洞。

有没有办法在jQuery / PHP / SQL中获取相对接近的值,找到它们的平均点然后使用该值继续处理其他一些东西?

基本上我需要的是,一旦检测到特定的坑洞5次,它将在谷歌地图上绘制。 但是,只有达到此阈值。 困难在于,根据报告它的设备的准确性,可能在略微不同的经度和纬度值下报告相同的坑洞。

由于您需要识别新的坑洼附近的坑洞,以下代码可以用米来表示。 它使用带有错误检查的POD的MySQL查询中的Haversine公式

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

为了确保此级别的准确性,数据库中的坐标必须至少有4个小数位。 请参阅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('[Ymd H:i:s]').", data2c.php, ". $e->getMessage()."\r\n", FILE_APPEND); } //Close the connection $dbh = null; 

你需要的是Haversine的公式来计算两个给定位置的经度和纬度坐标之间的距离。 基于此,您可以编写一种方法,使用以kms为单位的范围来检查靠近/靠近给定坐标的所有值。

用于计算距离的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); });