【问题标题】:whereNear query doesn't seem to work properly in ParsewhereNear 查询似乎在 Parse 中无法正常工作
【发布时间】:2016-02-12 01:02:15
【问题描述】:

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

我正在使用这个查询:

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

但结果不是按距离排序的。

谁能帮帮我。

【问题讨论】:

  • 你知道 Parse 正在关闭对吗? 2017 年 1 月,他们的服务将被关闭。 blog.parse.com/announcements/moving-on
  • 是的,我知道。我将使用它仅 3 个月,以验证我的想法。
  • 当您说结果未按距离排序时,作为我的回答的旁注,您是否在 FindCallback.done(...) 方法中检查结果的顺序?否则你在哪里检查结果的顺序?也许您在处理结果后自己更改顺序。
  • 自己排序结果有什么问题?:)

标签: android parse-platform


【解决方案1】:

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

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

如果所有其他方法都失败并且排序顺序不想在返回的位置上起作用,您始终可以通过循环查询从查询​​返回的 ParseObjects 并使用 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&lt;ParseObject&gt; results;,只需这样做:

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

【讨论】:

    【解决方案2】:

    第一步: 首先,您需要检查您的列“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, new DistanceComparator(sLatLong));

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 2017-09-04
      • 2012-05-06
      • 2013-02-17
      • 2017-10-09
      • 2017-08-03
      • 2014-05-02
      • 2011-09-11
      相关资源
      最近更新 更多