sql >> データベース >  >> RDS >> Mysql

MySQLの半径に応じて、バウンディングボックス内の長い/緯度のポイントをマージします

    この操作は、PHPまたは他のプログラミング言語を使用せずに実行するには複雑すぎる可能性があります。 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>";
        }
    ?>
    

    提供したデータに対するこのコードの出力は次のとおりです。

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

    これは重複するポイントを削除するだけであり、位置の平均化は行わないことに注意してください。ただし、簡単に追加できます。これがお役に立てば幸いです。




    1. OracleDatabaseで有効なタイムゾーンのリストを返す方法

    2. SQLServerのチェック制約とは-SQLServer/TSQLチュートリアルパート82

    3. MariaDbSQLインジェクション

    4. Azureのギャップを埋める:マネージドインスタンス