Thao tác này có thể quá phức tạp để thực thi nếu không có sự hỗ trợ của PHP hoặc ngôn ngữ lập trình khác. Đây là cách bạn có thể làm điều đó trong PHP:
<?
$link = mysqli_connect("host", "user", "pass", "database");
// Grab all the points from the db and push them into an array
$sql = "SELECT * FROM data";
$res = $link->query($sql);
$arr = array();
for($i = 0; $i < mysqli_num_rows($res); $i++){
array_push($arr, mysqli_fetch_assoc($res));
}
// Cycle through the point array, eliminating those points that "touch"
$rad = 1000; //radius in KM
for($i = 0; $i < count($arr); ++$i){
$lat1 = $arr[$i]['lat'];
$lon1 = $arr[$i]['long'];
for($j = 0; $j<count($arr); ++$j){
if($i != $j && isset($arr[$i]) && isset($arr[$j])){ // do not compare a point to itself
$lat2 = $arr[$j]['lat'];
$lon2 = $arr[$j]['long'];
// get the distance between each pair of points using the haversine formula
$dist = acos( sin($lat1*pi()/180)*sin($lat2*pi()/180) + cos($lat1*pi()/180)*cos($lat2*pi()/180)*cos($lon2*PI()/180-$lon1*pi()/180) ) * 6371;
if($dist < $rad){
echo "Removing point id:".$arr[$i]['id']."<br>";
unset($arr[$i]);
}
}
}
}
//display results
echo "Remaining points:<br>";
foreach($arr as $val){
echo "id=".$val['id']."<br>";
}
?>
Đầu ra của mã này trên dữ liệu bạn đã cung cấp là:
Removing point id:1
Removing point id:2
Remaining points:
id=3
id=4
Lưu ý rằng điều này chỉ loại bỏ các điểm chồng chéo, nó không thực hiện bất kỳ giá trị trung bình nào của các vị trí. Bạn có thể dễ dàng thêm điều đó mặc dù. Hy vọng điều này sẽ hữu ích.