Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Hợp nhất các điểm dài / vĩ độ trong một hộp giới hạn tùy thuộc vào bán kính trong MySQL

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn SQL trả về tất cả các ngày không được sử dụng trong bảng

  2. Làm cách nào để bạn chọn mọi hàng thứ n từ mysql

  3. Cách tạo cơ sở dữ liệu MySQL bằng API cPanel

  4. trình tạo / tạo trình lặp SqlAlchemy tích hợp hiệu quả bộ nhớ?

  5. mySQL:bộ ký tự utf8 trên bảng chỉ mục và lỗi khóa trùng lặp