2009-04-15 3 views
1

モバイルデバイスからGPSデータを受信するアプリケーションと、GSMネットワークからの信号強度を提供する座標データを受信するアプリケーションがあります。 私はマップ上のポイントをプロットして、良好な信号強度と低い信号強度の領域を表示しようとしています。 私はいくつかのポイントをすべてうまくいけば、ポイントはデータベースから取得され、正方形はポイントから約0.5km左上のポイントの周りに構築されます。次に、信号強度の色分けを使用して、VEマップ上に四角形を表示します。 問題は、数千から数千回の読み取りがあり、互いに0.5km未満の読み取り値を平均化する方法が必要な場合、またはSQL Serverで正方形(または円)を作成して平均化する必要がある場合です交差点。 私はこれでどこから始めるべきか分かりませんので、まともな記事やヒントへの参考になる点があれば幸いです。おかげさまで SQL Server 2008に近接しているポイントの平均データ

+0

アベレージングを想像してみてください(いくつかの疑似コードは問題ありません)。また、どのSQL Serverのバージョンを使用していますか? –

+0

正方形を貼り付けると仮定して、連続した、規則的なグリッドがマップを覆うようにしたいのですか? –

+0

こんにちは、あなたの返信ありがとう。基本的には、2つの交差する正方形についての信号の読み取りによって平均化されている領域が重なり合っていることを平均化することを想像しています。それはあまりにも難しいかもしれませんが、正方形が交差するときのエリアの結合の結果を平均するだけかもしれません。 – Phill

答えて

1

これを行うには単純で、やや不正確な方法の1つは、データの細かさを減らすことです。あなたのx、y測定値がどれほど正確であるかによって、それは不正確ではないかもしれません。

のは、我々は次のようなデータを持っているとしましょう:

x y signal_strenth 
10.2 5.1 10 
10.1 5.3 12 
10.3 5.5 8 

私たちは床xとyの値をした場合、我々が得る:

x y signal_strenth  
10 5 10 
10 5 12 
10 5 9 

その後、我々は、床のxとyでそれらの値を平均化することができます矩形(10,5)〜(11,6)に平均信号強度があることを示します。ここで

はSQLです:あなたが理想的な点から点への距離によって、グループのデータポイントにしたいと思います、確かに、今

select 
floor(x) as rectangle_xmin, 
floor(y) as rectangle_ymin, 
floor(x) + 1 as rectangle_xmax, 
floor(y) + 1 as rectangle_ymax, 
avg(signal_strength) as signal_strength 
from table 
group by floor(x), floor(y); 

、および1とをsquare_rootまで変化する最大距離によって、このグループにそれらを(2)=〜1.44、それらを長方形ブロックにフローリングする。だから、理想よりも小さいです。しかし、それはあなたのために十分にうまくいくかもしれません。特に、フローリング/グループ分けがあなたの位置測定の誤差よりも小さい場合、特にそうです。

floor()のサイズが十分でない場合は、floor(x *を多少) /と多少調整して、細かく調整することができます。もちろん、ceil()またはround()を使っても同じことができます。

全体のポイントは、崩壊の近くの測定値を1つの「測定値」に集約し、折りたたみ値の平均値をとっています。

+0

これはまったく悪い考えではありません...理想的な解決策ではありませんが、うまくいくかもしれません。これらはGPS座標であるため、floor(x)は十分に細かくはありませんが、floor(x * 100)はそうかもしれません。私はそれを行って、データがどのように見えるかを見ていきます。 – Phill

+0

さて、それは動作します。確度は失われていますが、デバイスが動いていないときのデータ量を大幅に削減して、Virtual Earthを追い続けることができます。ありがとう!私はそれを少し変更したので、私はここにそれを渡る誰のためにそれを投稿します。 – Phill

0

X、Y、Z座標をグラフにプロットできるDelaunay Triangulationを調べるとよいでしょう。あなたがポイントのために持っているものを正確に知っていなくても、その場所にX、Yを使用してからZを信号強度としてプロットし、スパイクグラフを作成することは可能かもしれません。私はC++の例であるCodePlex sampleを見ただけですが、SQL関数を書くことができるかもしれません。

0
SELECT 
geography::STPointFromText('POINT(' + CONVERT(varchar, AvgSignalReadings.rect_lngmin/100) + ' ' + CONVERT(varchar, AvgSignalReadings.rect_latmin/100) + ')', 4326) as Location, 
AvgSignalReadings.lat/100 as Latitude, 
AvgSignalReadings.lng/100 as Longitude, 
AvgSignalReadings.SignalStrength 
FROM 
(
SELECT 
    FLOOR(l.Latitude * 100) as lat, 
    FLOOR(l.Longitude * 100) as lng, 
    AVG(l.SignalStrength) as SignalStrength, 
    COUNT(*) as NumberOfReadings 
FROM SignalLog l 
WHERE l.SignalStrength IS NOT NULL AND l.SignalStrength <> 0 AND l.Location IS NOT NULL 
AND l.[Timestamp] > DATEADD(month, -1, GETDATE()) 
GROUP BY FLOOR(l.Latitude * 100), FLOOR(l.Longitude * 100)) 
AS AvgSignalReadings 
関連する問題