2016-02-01 15 views
13

私はジオロケーションに関連するAndroidアプリで作業しています。私はバックエンドとしてParseを使用しています。 ユーザーの現在地に基づいて結果を表示する必要があります。どこのクエリが解析で正常に動作しないようです

ParseQuery<ParseObject> query = ParseQuery.getQuery("Restaurants"); 
ParseGeoPoint sLatlong = new ParseGeoPoint(currentLat, currentLong); 
     query.whereNear("rest_location", sLatlong); 

をしかし、結果は距離が賢明でソートされていません。

私はこのクエリを使用しています。

誰かが私を助けることができますか?

+0

あなたはParseが正しくシャットダウンしていることを知っていますか? 2017年1月にサービスが停止されます。 http://blog.parse.com/announcements/moving-on/ – Dom

+0

ええ、私はそれを知っています。私はこれを3ヶ月間使って、私のアイデアを検証します。 – Anirudh

+0

結果が並べ替えられていないと答えたときの副次的注意は、 'FindCallback.done(...)'メソッドで結果の順序をチェックしているかどうかです。それ以外の場合は、結果の順序をチェックしていますか?結果を処理した後にあなた自身が注文を変更している可能性があります。 –

答えて

4

ParseのAndroid Documentationによると、別のソート順を自分で指定しない限り、既定の並べ替え順序は既に距離(最も近いもの)であるはずです。他のすべてが失敗し、ソート順だけでない場合

また、あなたはなど、あなただけのキロメートル、マイル、一定数の内の場所をしたい

を指定することができるようParseQuery.whereWithin*メソッドに見たいと思うかもしれません返された場所で作業したい場合は、クエリから返されたParseObjectをループし、ParseObject.getParseGeoPoint("rest_location")を使用して、自分で並べ替えることができます。 ParseGeoPointオブジェクトを返します、あなたは、ユーザーの場所までの距離を取得し、その上でソートするには、次の

ParseGeoPoint.distanceInKilometersTo(sLatlong); 

を行うことができます

。ここでは参考のため

は、サンプルComparatorです:あなたが持っている

public class UserLocationComparator implements Comparator<ParseObject> { 

    private final ParseGeoPoint userLoc; 

    public UserLocationComparator(ParseGeoPoint userLoc) { 
     this.userLoc = userLoc; 
    } 

    @Override 
    public int compare(ParseObject po1, ParseObject po2) { 
     ParseGeoPoint loc1 = po1.getParseGeoPoint("rest_location"); 
     ParseGeoPoint loc2 = po2.getParseGeoPoint("rest_location"); 

     return loc1 == null ? 
       (loc2 == null ? 0 : 1) : 
       (loc2 == null ? -1 : Double.compare(userLoc.distanceInKilometersTo(loc1), userLoc.distanceInKilometersTo(loc2))); 
    } 
} 

、その後仮定List<ParseObject> results;単に実行します。

Collections.sort(results, new UserLocationComparator(sLatlong)); 
-1

ステップ1:あなたがいるかどうかを確認するために必要なすべての まず、あなたの列「rest_location」のタイプは「GeoPoint」です。 もしそうなら、あなたが書いたコードで距離によるソート結果を自動的に得るべきです。 "rest_location"がジオポイント型でないか、Parseに何らかの問題があるだけの問題があります。 構文解析のドキュメント: https://www.parse.com/docs/android/guide#geopoints デフォルトでは、userLocationからソートされた順番(最も近い)になります。

動作しない場合は、独自のコンパレータを使用する必要があります。

class DistanceComparator implements Comparator<ParseObject> { 

    ParseGeoPoint userGeoPoint; 

    public DistanceComparator(ParseGeoPoint geoPoint) { 
     userGeoPoint = geoPoint; 
    } 

    @Override 
    public int compare(ParseObject lhs, ParseObject rhs) { 
     double dist1 = lhs.getParseGeoPoint("rest_location").distanceInKilometersTo(userGeoPoint); 
     double dist2 = rhs.getParseGeoPoint("rest_location").distanceInKilometersTo(userGeoPoint); 

     return Double.compare(dist1,dist2); 
    } 
    } 

今、あなたは、単に Collections.sort(locationList、新しいDistanceComparator(sLatLong))を渡すことができます。

関連する問題