すべてのレコードは、アセットが実際にあり得る重心(精度によって定義されたファズのそのサイズの周りに位置し、ファジー空間)を規定します。高度が無視できるのは、それがはるかにあいまいであり、一般的に正確さは水平精度だけです。
最初のポイントを取って、それをクラスター(領域/ボリューム)に割り当てます。 2番目のポイントを取得し、クラスター内にあるかどうかを確認します。もしそうなら、あなたはセントロイド(古い点と新しい点の平均値)を精密化しようとするか、あるいは2点目を破棄することができます。セントロイドを洗練させることは非常に魅力的ですが、資産の動きを遅くすることはできません。あなたの次のポイントがセントロイドの外側に落ちたら、新しいセントロイドを立ち上げてください。
あなたの報告された精度が実際の精度より優れていることがあります。この場合、愚かな乗数または定数を入れて重心を実際よりもぼやけさせることができます。
[編集]
OPはこれをSQLで行う方法を尋ねました。まあ、私はSQLの教祖です。私が抱えている問題は、その場所にあったすべてのマッチではなく、時間的に連続しているマッチを提供するだけで、外部結合を制限できないということです。したがって、私のソリューションでは、たくさんの余分なSQLループを使用することになりました。
$curid = 0;
while ($hash = `select id,timestamp,position,accuracy from locations
where id > $curid
order by idlimit 1`)
{
print "Was at $hash{'position'} at $hash{'timestamp'} ";
$curid = $hash{'id'} + 1;
$seenone = 0;
while ($hash2 = `select id,timestamp from locations where id=$cur_id and
distance($hash{'position'},position) < (accuracy+$hash{'accuracy'})`)
{
$curid = $hash2{'id'}+1;
$seenone = 1;
}
print "until $hash2{'timestamp'}\n" if ($seenone);
print "\n" unless ($seenone);
}
これはidによってテーブルの場所を通過します。最初のクエリは次の(最初の)位置情報を取得し、2番目のクエリは同じ位置にクラスタ化されたすべてのIDをスキップします。すすぎ、繰り返します。 1つのポリゴンに
私はあなたの言うことを理解しています。私の特定の目的のために、より簡単なアプローチ(精緻化セントオイド)は必要ありません。私のussueは私が使う必要のあるアルゴリズムです。 SQL Serverデータベース内のこのデータ。私はレコードをループしないで使用できるSETベースのアルゴリズムがあるのだろうかと思います。 – katit
@katit:使用できる擬似コードアルゴリズムで答えが更新されました。 –