sql >> Databasteknik >  >> RDS >> Mysql

Slå samman långa/lat punkter inom en begränsningsram beroende på en radie i MySQL

Denna operation kan vara för komplicerad att utföra utan hjälp av PHP eller annat programmeringsspråk. Så här kan du göra det i 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>";
    }
?>

Utdata från den här koden på data du angav är:

    Removing point id:1
    Removing point id:2
    Remaining points:
    id=3
    id=4

Observera att detta bara tar bort de överlappande punkterna, det gör ingen medelvärde av positioner. Det kan du dock enkelt lägga till. Hoppas detta hjälper.




  1. mysqldump gör en partiell backup - ofullständig tabelldump

  2. ORA-04091:tabellen [blah] muterar, trigger/funktion kanske inte ser den

  3. Hur man skapar en blogg i PHP och MySQL databas - DB design

  4. Köra SQL-databasunderhållsuppgifter med SQLCMD