2

20 分ごとにユーザーの位置データを収集しているとしましょう。一日の終わりには、フィールドやその他のデータArrayListを含むオブジェクトがあります。latlong

私が直面していて理解しようとしている2つの問題があります。

  1. 一部の場所は建物の内部から取得されているため、あまり正確ではなく、ユーザーがその時点でいた実際の場所に分散している可能性があります.

  2. ユーザーが移動していないため、一部の場所は異なる時間に撮影されていますが、同じ場所から撮影されています。

私が達成したいのは、互いに近いすべての場所を見つけることです。たとえば、70 メートルとしましょう。これらすべての場所の平均的な場所を見つけて、この 1 つの平均的な場所だけに置き換えます。

だから私は2つの重要な質問に来ています:

  1. 距離が70メートル未満のすべての近くの場所を見つけるための最良の方法は何でしょう(配列には場所の有効な変更が含まれていることに注意してください。したがって、近くのグループを見つけて、他のグループをそのままにしておく必要があります)。

  2. 多くの近くのものの平均位置を見つける方法または方法はありますか?

4

3 に答える 3

4

近くの位置については、以前にここで同様の質問に答えました: Android Maps v2 - ほとんどのマーカーを含むようにカメラをアニメーション化する

具体的には、次のコードを使用できると思います。

private List<Marker> getSurroundingMarkers(List<Marker> markers,
        LatLng origin, int maxDistanceMeters) {
    List<Marker> surroundingMarkers = surroundingMarkers = new ArrayList<Marker>();
    if (markers == null) return surroundingMarkers ;


        for (Marker marker : markers) {

            double dist = distBetween(origin, marker.getPosition());

            if (dist < maxDistanceMeters) {
                surroundingMarkers.add(marker);
            }
        }


    return surroundingMarkers;
}

private float distBetween(LatLng pos1, LatLng pos2) {
    return distBetween(pos1.latitude, pos1.longitude, pos2.latitude,
            pos2.longitude);
}

/** distance in meters **/
private float distBetween(double lat1, double lng1, double lat2, double lng2) {
    double earthRadius = 3958.75;
    double dLat = Math.toRadians(lat2 - lat1);
    double dLng = Math.toRadians(lng2 - lng1);
    double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
            + Math.cos(Math.toRadians(lat1))
            * Math.cos(Math.toRadians(lat2)) * Math.sin(dLng / 2)
            * Math.sin(dLng / 2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    double dist = earthRadius * c;

    int meterConversion = 1609;

    return (float) (dist * meterConversion);
}

マーカー部分を書き換えて、代わりに LatLng を使用する可能性があります。

平均化に関しては、次の単純な問題である必要があります(LatLngがn個あるとします):

lat_avg = (lat1+lat2+...+latn)/n 
lng_avg = (lng1+lng2+...+lngn)/n 

latlng_avg = new LatLng(lat_avg, lat_lng)
于 2013-10-29T19:29:20.327 に答える
1

ユーザーの位置情報を取得する方法がわかりません。従来のサービスを使用しているか、LocationManagerプレイ サービスを使用しているかにかかわらずです。私は常に、Android 開発者ブログに記載されているこのアプローチに基づいて自分の場所をモデル化してきました。場所の収集方法を柔軟に切り替えることができる場合は、その人が屋内にいるか屋外にいるかはそれほど重要ではありません。いつでも可能な限り最高の場所を取得する必要があります。

十分なタイムスケジュールで場所を取得していると仮定します(いつ更新をチェックしているのかわかりませんが、半径70m以内のすべてが必要なため、距離の変更ではなくタイムスケジュールに従っていると想定しています)基本的な方法平均点を見つけるには:

(1) 各緯度/経度のペアを単位長の 3D ベクトルに変換します。(2) これらのベクトルをそれぞれ合計します (3) 結果のベクトルを正規化します (4) 球座標に変換します

そのアプローチは、角度のセットの平均の計算に関する以前の SO 投稿と同様に、ここで文書化されています。

サンプル コードは非常に簡単に理解できます。ロケーション グラブから取得した緯度経度値を差し込むだけで問題ありません。

于 2013-10-29T19:46:51.460 に答える