2017-06-09 14 views
0

私はLocation Managerを使用しており、過去60秒間のユーザーの平均速度を計算しようとしています。ユーザーの平均速度を計算する最も簡単な方法は?

didUpdateLocationsが呼び出されると、毎秒ロケーションマネージャからユーザの速度が得られます。私はその速度を配列に追加します。

私の計画は、didUpdateLocationsに記録されたこの速度の配列からの平均速度を計算することです。

ただし、最初は配列が空です。 1秒ごとにデータが取り込まれますが、アレイにまだ60の速度がないのに、平均速度を計算したいと考えています。この場合、5秒後と5秒後などに記録された値を使用するだけで、平均速度はそれらの値を使用して計算されます。時間が経過すると、配列に値が設定され、最新の速度値が追加されると、最も古いものが配列から削除されます。

これを達成する簡単な方法はありますか?

答えて

1

現在の説明が正しいと思います。配列が一杯にならずに平均速度を得ることができます。あなたはそのようなセットアップあなたの速度の配列を可能性があります

let max = 60 
var speeds = Array<Float>() 

その後、didUpdateLocationsメソッドが呼び出されるたびに、あなたはこのspeeds配列に、ユーザのスピードを追加することができます。に、

// In didUpdateLocations():  

if speeds.count == max { 
    speeds.remove(at: 0) 
} 

speeds.append(newSpeed) 

を次に:あなたは、配列は60の項目よりも長くしたくないので、あなたはあなたがそうのようにこれを実装するかもしれない60の長さを保つために、古い速度を最大に設定し、削除することができます彼らの平均速度を計算するだけで、スピード配列からアイテムを取り出し、それらの合計をカウントで除算して平均します。

var total: Float = 0.0 
speeds.forEach { speed in 
    total += speed 
} 

var averageSpeed = total/Float(speeds.count) 
print(averageSpeed) 
+0

宣言場所{ minLat =分(minLat、location.latitude) minLng =分(minLng、位置における 'VAR速度= アレイ()'ブレーク位置のための私の他のクラス 'に何かを.Longitude) maxLat = max(maxLat、location.latitude) maxLng = max(maxLng、location.longitude) ' 最後の2行でエラーが発生しました:"非関数型の値 'int'を呼び出すことはできません – user2265192

+0

@ user2265192あなたはおそらく 'max'と呼ばれる関数を持っています。' max'変数を 'maxSpeed'のようなものに変更してください。 – brimstone

関連する問題