web-dev-qa-db-ja.com

アンドロイドで歩きながら距離を計算する方法は?

アプリのデモを開発しています。このデモでは、「START」と「STOP」という2つのボタンがあります。ユーザーが「開始」をタップすると、歩き始めます。私がやりたいのは、ユーザーが「STOP」をタップすると、デモが「START」と「STOP」の間の距離を計算するようにすることです。ユーザーが「START」を押し、1ステップも踏まずに「STOP」を押した場合、0kmまたは0mを表示する必要があります。私はこれをどのように始めるべきか全く分かりません。提案してください。

21
rahul

これを実行する1つの方法は、加速度計データを使用することです。ユーザーが[スタート]ボタンを押した後、アプリは加速度計データを継続的に記録する必要があります。ユーザーが一歩を踏み出すたびに、データのピークが観察されます。このデータにフィルターを適用すると、適切な精度で実行されたステップ数を検出できるようになります。それにステップ長を掛けると、移動距離の近似値が得られます。ユーザーの身長を入力引数として取ります。ステップ長は約0.45 *人の身長です。このアプローチはGPSに依存しないため、屋内でも機能します。編集:デバイスの向きにほとんど依存しないように、3つの軸すべてに加速度計の値を使用する必要があります。x^ 2 + y ^ 2 + z ^ 2で移動できます

13
Navjot Singh

これを行うにはさまざまな方法があります。

  1. [〜#〜] gps [〜#〜]:X秒(たとえば10秒)ごとに2ポイント間のGPS距離を追加し続けます。 Check Android Location.distanceTo またはdistanceBetween。Check My Tracks アプリ、オープンソースです。GPSは屋内では利用できず、エラーが発生しますユーザーが頻繁に方向を変えている場合(1〜2秒ごとに読む)
  2. 加速度計:加速度計を使用したステップ検出用のコード/ライブラリを探します。距離は、加速の二重統合から得られます。ここでは、エラーが非常に急速に増加します。
  3. ステップ検出器:組み込みの Nexus 5 。 Googleは、可能な限り加速度計のエラーを処理しなければなりません。これはハードウェアベースの計算であり、バッテリーの消費は少なくなりますが、現在のほとんどの携帯電話では使用できません。

歩行者推測航法 も確認できます

19
Sangharsh

アプリでGPSの許可を求めます。スタートをタップしたら、GPS座標を記録します。停止のためにも同様に行います。これで2つの座標ができました。その後、距離の式を適用して、移動した合計距離を取得できます。

編集:

コメントで明確にされたケースに関しては、Androidの モーションセンサー を調べる必要があると思います。実際に使用する前に、多くの仮定を行うか、ユーザーにアプリの調整を依頼する必要がある場合があります。

ユーザーのペースファクターを知っていると仮定します。モーションセンサーを使用して、ユーザーが「歩いている」時間を測定します(明らかに、ユーザーが実際に歩いているのか、単に電話を振っているのかを判断する簡単な方法はありません)。これにユーザーのペースファクターを掛けると、ユーザーがどれだけ歩行したかについてかなり大雑把に把握できます。

6
skytreader

「このソリューションには問題が1つあります。一定の速度で移動している場合、加速度は0であるため、加速度計は読み取り値を取得しません。– jnovacho 16秒前」直接)

加速するときは、加速を保存してから、歩いている速度を計算します。加速度が変化するたびに速度の計算を停止し、最初からやり直してください。停止すると、負の加速度を受け取るはずです。その後、減速したか完全に停止したかを計算する必要があります。しかし、それは単に数学です:)

3
swiknaba

Gpsメソッドを使用していました。次の手順を実行します。開始ボタンをクリックすると、開始点の緯度と経度が取得され、適切なTripIdでdtoに保存されます。

停止ボタンをクリックすると:

TripDto dto = service.GetStartLatLong(TripIdA);
double lat = Double.valueOf(dto.getStartLati());
double lon = Double.valueOf(dto.getStartLongi());
Location locationa = new Location("point A");
locationa.setLatitude(lat);
locationa.setLongitude(lon);
double distance = location.distanceTo(locationa);

Location.distanceTo()メソッドによって返される距離はメートル単位です。

3
Nishit Joshi
public double getDistance(double lat1, double lon1, double lat2, double lon2) 
{ 
    double latA = Math.toRadians(lat1); 
    double lonA = Math.toRadians(lon1);
    double latB = Math.toRadians(lat2); 
    double lonB = Math.toRadians(lon2);
    double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) +
        (Math.sin(latA) * Math.sin(latB));
    double ang = Math.acos(cosAng);
    double dist = ang *6371;
    return dist;
}
2
Dinesh Bagvan

これにはセンサーを使用してみてください。GPSはそれほど正確ではないため、使用しないでください。あなたが話していることについては、次のオープンソース歩数計プロジェクトを参照してください。

歩数計ライブラリ

センサーを使用したい場合は、指定されたコードでこの回答を更新します。

1
Harshal Benake