2012-02-09 3 views
4

3gモデムとGPSを使用して私のラップトップに設定されたルートを運転していると仮定します。私はpingとGPSの緯度/経度を相関させましたが、今はこのデータを視覚化したいと思います。3gのカバレッジマップ - 緯度、経度、ピングのデータを視覚化する

私は1日に約80,000ポイントのデータを持っています。私は数ヶ月の価値を表示したいと思います。私は特にpingが一貫してタイムアウトする領域(すなわちping == 1000)を表示することに興味があります。

散布図

私の最初の試みは、データエントリごとに1ポイントで、散布図にしました。タイムアウトだった場合、私はポイントのサイズを5倍大きくしました。そのため、これらのエリアがどこにあるのかは明らかでした。また、オーバーレイドポイントを見るために、アルファを0.1に落としました。

# Colour 
c = pings 
# Size 
s = [2 if ping < 1000 else 10 for ping in pings] 
# Scatter plot 
plt.scatter(longs, lats, s=s, marker='o', c=c, cmap=cm.jet, edgecolors='none', alpha=0.1) 

Scatter plot

これで明白な問題は、それが大量のデータを表示するために非常に悪い方法であるデータ・ポイントごとに1個のマーカーを、表示されていることです。私が同じエリアを2回通過してしまった場合、最初のパスデータは2回目のパスの上に表示されます。でもグリッド

オーバー

補間私はその後も、グリッド上を補間するnumpyのscipyのダウンロードとを使用しての試みを持っていました。 this example

から

# Convert python list to np arrays 
x = np.array(longs, dtype=float) 
y = np.array(lats, dtype=float) 
z = np.array(pings, dtype=float) 

# Make even grid (200 rows/cols) 
xi = np.linspace(min(longs), max(longs), 200) 
yi = np.linspace(min(lats), max(lats), 200) 

# Interpolate data points to grid 
zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='linear', fill_value=0) 

# Plot contour map 
plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k') 
plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet) 

これは面白い(色や形の多くを)見えますが、それは私が調査していない分野を中心にすぎ外挿し。あなたは私が旅行したルートを見ることができません、ちょうど赤/青の斑点。私は大きなカーブで駆動した場合

、それは間の領域のための補間ます(下記参照):

Interpolation problems

補間を私は、持っていた不均一なグリッド

上固定グリッドの代わりにmeshgrid(xi, yi = np.meshgrid(lats, longs))を使用しようとしましたが、配列が大きすぎると言われています。

ポイントからグリッドを作成する簡単な方法はありますか?


私の要件:

  • は、どちらかの平均化することにより、大規模なデータセットの各ポイントについて(8万×60 =〜5メートルのポイント)
  • 表示重複データを扱うには、(私は補間がこれを行いますと仮定します)、または各点に対して最小値をとることによって、
  • 私は散布図(上)との幸せなんだけど、私はそれを表示する前にデータを平均化するためにいくつかの方法が必要になりすぎて、データポイントから

を推定しないでください。

(謝罪危険なmspaint図面のために、私は実際のデータをアップロードすることはできません)


ソリューション:Python APIと関連ユーティリティ、特にgdal_grid含む

# Get sum 
hsum, long_range, lat_range = np.histogram2d(longs, lats, bins=(res_long,res_lat), range=((a,b),(c,d)), weights=pings) 
# Get count 
hcount, ignore1, ignore2 = np.histogram2d(longs, lats, bins=(res_long,res_lat), range=((a,b),(c,d))) 
# Get average 
h = hsum/hcount 
x, y = np.where(h) 
average = h[x, y] 
# Make scatter plot 
scatterplot = ax.scatter(long_range[x], lat_range[y], s=3, c=average, linewidths=0, cmap="jet", vmin=0, vmax=1000) 
+0

私はクラスタ化することをお勧めデータ、すなわちある距離内にある点を結合し、散布図にそれらの平均/最小値を表示する。それは、私はPythonのクラスターアルゴリズムについてはあまり知らないと言われていますが、私はあなたが簡単にGoogleでいくつかのアイデアを見つけることができると確信しています。 –

答えて

2

質問を簡略化するために、2つのポイントがあります.1つはping <、もう1つはping> = 1000です。 ポイントの数が非常に多いので、scatter()で直接プロットすることはできません。私はによっていくつかのサンプルデータを作成しました:

longs = (np.random.rand(60, 1) + np.linspace(-np.pi, np.pi, 80000)).reshape(-1) 
lats = np.sin(longs) + np.random.rand(len(longs)) * 0.1 

bad_index = (longs>0) & (longs<1) 
bad_longs = longs[bad_index] 
bad_lats = lats[bad_index] 

(long型、ラッツ)のping < 1000ポイント、(bad_longs、bad_lats)であるのping> 1000年

あなたはnumpy.histogram2dを使用することができます()のためのポイントポイントを数えよう:

ranges = [[np.min(lats), np.max(lats)], [np.min(longs), np.max(longs)]] 
h, lat_range, long_range = np.histogram2d(lats, longs, bins=(400,400), range=ranges) 
bad_h, lat_range2, long_range2 = np.histogram2d(bad_lats, bad_longs, bins=(400,400), range=ranges) 

hとbad_hはすべての小さなスクエアエリアのポイント数です。

次に、視覚化するためのさまざまな方法を選択できます。たとえば、あなたは)散乱(で、それをプロットすることができます:ここで

y, x = np.where(h) 
count = h[y, x] 
pl.scatter(long_range[x], lat_range[y], s=count/20, c=count, linewidths=0, cmap="Blues") 

count = bad_h[y, x] 
pl.scatter(long_range2[x], lat_range2[y], s=count/20, c=count, linewidths=0, cmap="Reds") 

pl.show() 

は完全なコードは次のとおりです。

import numpy as np 
import pylab as pl 

longs = (np.random.rand(60, 1) + np.linspace(-np.pi, np.pi, 80000)).reshape(-1) 
lats = np.sin(longs) + np.random.rand(len(longs)) * 0.1 

bad_index = (longs>0) & (longs<1) 
bad_longs = longs[bad_index] 
bad_lats = lats[bad_index] 

ranges = [[np.min(lats), np.max(lats)], [np.min(longs), np.max(longs)]] 
h, lat_range, long_range = np.histogram2d(lats, longs, bins=(300,300), range=ranges) 
bad_h, lat_range2, long_range2 = np.histogram2d(bad_lats, bad_longs, bins=(300,300), range=ranges) 

y, x = np.where(h) 
count = h[y, x] 
pl.scatter(long_range[x], lat_range[y], s=count/20, c=count, linewidths=0, cmap="Blues") 

count = bad_h[y, x] 
pl.scatter(long_range2[x], lat_range2[y], s=count/20, c=count, linewidths=0, cmap="Reds") 

pl.show() 

出力図は、次のとおりです。

enter image description here

+0

偉大な答えをありがとう、 'np.histogram2d'は非常に有用です。簡単にサイズ/色をカウントするのではなく、そのポイントで平均/最小のPing値を表す方法を考えることができますか? –

+1

平均を計算するには、weight = pingsでnp.histogram2dを呼び出すことができます。これは、正方形領域内のすべてのpingを合計します。結果をcountで除算します。 – HYRY

+0

pandas(http://pandas.pydata.org/)を使用すると、より多くの集計を行うことができます。 – HYRY

1

GDALライブラリあなたのために働くはずです。これは、散在した点からグリッドデータを生成するための、多数の補間および平均化方法およびオプションを含む。グリッドセルのサイズを操作して、満足のいく解像度を得ることができるはずです。

GDALは多くのデータ形式を処理しますが、座標とpingの値をCSVとして渡すことができ、PNGやJPEGを戻すことができます。

lat/lonデータは平面座標系ではありません。結果を他の地図データに組み込む場合は、使用する地図投影、単位などを把握する必要があります。