sql >> Databáze >  >> RDS >> Mysql

Sloučit dlouhé/šířkové body v rámci ohraničujícího rámečku v závislosti na poloměru v MySQL

Tato operace může být příliš komplikovaná na provedení bez pomoci PHP nebo jiného programovacího jazyka. Zde je návod, jak to můžete udělat v 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>";
    }
?>

Výstup tohoto kódu na vámi poskytnutých datech je:

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

Všimněte si, že to pouze odstraní překrývající se body, neprovádí žádné průměrování pozic. Klidně byste to ale mohli přidat. Doufám, že to pomůže.




  1. python mysqldb err na mém mac:Knihovna není načtena:@rpath/libmysqlclient.21.dylib

  2. Jak používat date_format při použití JPQL/JPA

  3. Konfigurační soubor hibernace (.cfg.xml) pro mapování více tabulek MySQL ve stejné databázi?

  4. Jak mohu uzamknout tabulku při čtení pomocí Entity Framework?