计算NSPredicate中两个PFGeopoints之间的距离以进行解析查询

时间:2015-02-07 22:14:58

标签: objective-c swift parse-platform pfquery

当我想做

之类的事情时,我有一个特例
let predicate = NSPredicate(format:"
    DISTANCE(\(UserLocation),photoLocation) <= visibleRadius AND
    DISTANCE(\(UserLocation),photoLocation" <= 10)"
var query = PFQuery(className:"Photo", predicate:predicate)

基本上,我想要get all photos that are taken within 10km around my current location if my current location is also within the photo's visible radius

此外,photoLocationvisibleRadius是数据库中的两列,我将提供UserLocation作为PFGeoPoint。

有可能实现这一目标吗?在我看来,我不认为我可以调用photoLocation.latitude来获取特定的坐标值。我可以吗?

如果可以实现,我会非常感激你!!

2 个答案:

答案 0 :(得分:0)

我在这里的pares.com文档中发现这是link

let swOfSF = PFGeoPoint(latitude:37.708813, longitude:-122.526398)
let neOfSF = PFGeoPoint(latitude:37.822802, longitude:-122.373962)
var query = PFQuery(className:"PizzaPlaceObject")
query.whereKey("location", withinGeoBoxFromSouthwest:swOfSF, toNortheast:neOfSF)
var pizzaPlacesInSF = query.findObjects()

此代码将获取swOfSF&amp;所定义的矩形区域中的所有对象。 neOfSF objectc,其中seOfSF位于西南角,neOfSF位于东北角。

您可以对代码进行一些更改,并获取对象位于中间的矩形区域中的所有对象

我建议您不要使用半径,因为这需要大量的计算。而是使用矩形区域(就像我给你的代码一样)。

计算最大/最小经度和最大值从您的位置获取最大/最小纬度并获取其间的所有对象。你可以阅读有关如何罚款最小/最大经度和纬度在这里Link

答案 1 :(得分:0)

我设法使用Parse Cloud Code解决它,这里是the quick tutorial

Parse.Cloud.define("latestPosts", function(request, response) {
    var limit = 20;
    var query = new Parse.Query("Post");
    var userLocation = request.params.userLocation;
    var searchScope = request.params.searchScope;
    var afterDate = request.params.afterDate;
    var senderUserName = request.params.senderUserName;
    query.withinKilometers("Location", userLocation, searchScope);
    query.greaterThan("createdAt", afterDate);
    query.notEqualTo("senderUserName",senderUserName);
    query.ascending("createdAt");
    query.find({
        success: function(results) {
            var finalResults = results.filter(function(el) {
                var visibleRadius = el.get("VisibleRadius");
                var postLocation = el.get("Location");
                return postLocation.kilometersTo(userLocation) <= visibleRadius;
            });
            if (finalResults.length > limit) {
                var slicedFinalResults = results.slice(0, 20);
                response.success(slicedFinalResults);
            } else {
                response.success(finalResults);
            }
        },
        error: function() {
            response.error("no new post");
        }
    }); 
});

上面的代码说明了如何使用Cloud Code的基本示例。除此之外,我必须确保所有返回的图像都在用户的搜索范围和照片的可见圆圈的组合中。还有更多技术,例如Promises。但就我的目的而言,上面的代码就足够了。