Я создаю приложение Phonegap, используя Google Maps API V3 и jQuery.
Приложение хранит значения долготы и широты отдельно в базе данных MySQL при обнаружении выбоины. Мне нужно выбрать любые значения, которые относительно близки и, скорее всего, были бы одной и той же выбоиной.
Есть ли способ в jQuery / PHP / SQL получить значения, которые относительно близки, найти их среднюю точку, а затем использовать значение для продолжения обработки некоторых других вещей?
В основном, что мне нужно, так это то, что, как только определенная выбоина будет обнаружена 5 раз, она будет отображаться на карте Google. Однако только после выполнения этого порога. Трудность состоит в том, что о том же выбоине можно сообщать при немного разных значениях долготы и широты в зависимости от точности устройства, сообщающего об этом.
Поскольку вам необходимо идентифицировать выбоины рядом с новым, следующий код может сделать это в метрах. Он использует Формулу Хаверсина в запросе MySQL, используя POD с проверкой ошибок.
$ lat & $ lng – координаты нового pothole & $ 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;
Вам нужна Формула Хаверсина, чтобы рассчитать расстояние между координатами долготы и широты двух заданных мест. На основе которого вы можете написать метод для проверки всех значений, близких / близких к заданной координате с использованием диапазона в км.
$('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); });