whereNear查询似乎在Parse中无法正常工作

时间:2016-02-01 05:49:34

标签: android parse-platform

我正在开发与Geolocations相关的Android应用。我正在使用Parse作为后端。 我需要根据用户的当前位置显示结果。

我正在使用此查询:

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

但结果并没有按距离排序。

有人能帮助我吗?

2 个答案:

答案 0 :(得分:4)

根据解析的Android Documentation,默认排序顺序应该已经是距离(最接近最远),除非您自己指定另一个排序顺序。

此外,您可能需要查看ParseQuery.whereWithin*方法,因为您可以指定只需要在特定英里数,公里数等范围内的位置。

如果所有其他方法都失败并且排序顺序不想处理返回的位置,您可以通过循环查询返回的ParseObject并使用{{1}来自行排序。 }。

这将返回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;

答案 1 :(得分:-1)

<强>步骤1: 首先,你需要检查你的列&#34; rest_location&#34;属于&#34; GeoPoint&#34;。 如果是,那么您应该使用您编写的代码自动按距离排序结果。唯一的问题可能是&#34; rest_location&#34;不是地理点类型,或者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,new DistanceComparator(sLatLong));