sql >> Database teknologi >  >> RDS >> Mysql

Flet lange/lat-punkter inden for en afgrænsningsramme afhængigt af en radius i MySQL

Denne operation kan være for kompliceret at udføre uden hjælp fra PHP eller et andet programmeringssprog. Sådan kan du gøre 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>"; } ?>

Outputtet af denne kode på de data, du har angivet, er:

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

Bemærk, at dette blot fjerner de overlappende punkter, det foretager ikke nogen midling af positioner. Det kan du dog sagtens tilføje. Håber dette hjælper.




  1. Aktiver udførelse af flere sætninger under udførelse via sqlalchemy

  2. Mysql datatype eller php-kode til at stige med 1 hver gang en side i min database indlæses i en browser

  3. MySQL trigger 'opdatering på kolonne' syntaks

  4. Hukommelseslækage i MySQL C++-stik