2

これは、自分がやろうとしていることの名前を知っていれば、おそらくそれを調査できる状況の 1 つです。

基本的に、いくつかの領域ではまばらで、他の領域では集中している一連の 2D ポイント (頂点) があります。私がやりたいことは、ポイントをまばらなエリアに残しながら、より集中したエリアからポイントを「インテリジェントに」削除することにより、このセットを単純化することです。たとえば、50,000 ポイントで開始し、10,000 ポイントで終了します (または 10,000 の領域で、100% 正確である必要はありません)。

これを行うためのテクニックを以前に見たことがあると確信していますが、それが何であるかは一生覚えていません。どんな助けでも大歓迎です。

4

6 に答える 6

2

以下は、一連のポイントをグリッド パーティションごとに 1 つのポイントに減らすための疑似コードです (私はあなたの言語を知りません)。ポイントのセットと任意の軸に沿ったパーティションの数を指定します。コードは最初にポイントをウォークスルーして、境界ボックスを形成する最大/最小エンドポイントを見つけます。次に、バウンディング ボックスを X 軸と Y 軸に沿っていくつかのパーティションに分割します。

次に、コードは各グリッド パーティションを通過し、ポイントの配列がグリッド内にあるかどうかを確認します。ポイントがグリッド内にある場合、最初の一致が保持され、残りのポイントが削除されます。コードを変換したり、基準を変更したりして、ポイントを維持してください。

function ReduceGrid( array points, int npartitions )
{
    int max_x = 0, max_y = 0;
    int min_x = MAX_INT, min_y = MAX_INT

    // Find the bounding box of the points
    foreach point in points
    {
        if ( point.X > max_x )
            max_x = point.X;
        if ( point.Y < min_x )
            min_x = point.X;
        if ( point.Y > max_y )
            max_y = point.Y;
        if ( point.Y < min_y )
            min_y = point.Y;
    }

    // Get the X and Y axis lengths of the paritions
    float partition_length_x =  ( ( float ) ( max_x - min_x ) ) / npartitions;
    float partition_length_y =  ( ( float ) ( max_y - min_y ) ) / npartitions;

    // Reduce the points to one in each grid partition
    for ( int n = 0; n < npartitions; n++ )
    {
        // Get the boundary of this grid paritition
        int min_X = min_x + ( n * partition_length_x );
        int min_Y = min_y + ( n * partition_length_y );
        int max_X = min_x + ( ( n + 1 ) * partition_length_x );
        int max_Y = min_y + ( ( n + 1 ) * partition_length_y );

        boolean reduce = false; // set to true after finding the first point in the paritition
        foreach point in points
        {
            // the point is in the grid parition
            if ( point.X >= min_x && point.X < max_x &&
                 point.Y >= min_y && point.X < max_y )
            {
                // first point found
                if ( false == reduce )
                    reduce = true;
                else
                    points.Remove( point ); // remove the point from the list
            }
        }
    }
}

アンドリュー、OpenGeoCode.Org の共同創設者

于 2013-11-06T19:10:42.100 に答える
0

という概念を聞いたことがありdecimationます。

あなたが探している最も単純なバージョンは、「5 ポイントのうち 4 ポイントごとに削除する」ことであり、まばらな領域に試練を乗り切るのに十分なデータがあることを願っています。これにより、密集したエリアからより多くのポイントが自然に取得されます (各エリアから同じ割合で取得されますが、より密集したエリアでは明らかにより多くのポイントが取得されます)。

それを超えて、より詳細な情報を提供する必要があります。まばらな領域をプログラムで見つけることができる場合は、間引きからそれらを無視するか、特定の量を超えないようにするかを選択できます。「デシメートしている間に、その領域にx個以下の数が残っている場合は、次の領域を探す」というような単純なことかもしれません。

于 2013-11-04T22:03:56.213 に答える
0

データセットの周りにボックスを作成し、ボックスをグリッドに分割できます。次に、グリッドの各領域について、その中のポイント数を合計します。2 番目に密度の高い領域と同じ数の点が残るまで、最も密度の高い領域から点をランダムに削除してから、グリッドを再処理します。

于 2013-11-04T22:08:14.990 に答える