我正在开发与Geolocations相关的Android应用。我正在使用Parse作为后端。 我需要根据用户的当前位置显示结果。
我正在使用此查询:
ParseQuery<ParseObject> query = ParseQuery.getQuery("Restaurants");
ParseGeoPoint sLatlong = new ParseGeoPoint(currentLat, currentLong);
query.whereNear("rest_location", sLatlong);
但结果并没有按距离排序。
有人能帮助我吗?
答案 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));