按距离排序Geofire结果

7
我一直在尝试使用Geofire for iOS进行实验,但似乎找不到任何返回圆形查询中距离搜索位置的方法。GFQueryResultBlock仅返回键和位置。我是否正确地认为我必须自己计算距离?
假设我正在使用Firebase制作附近餐厅应用,并希望向用户显示最接近用户的20家餐厅,按照距离排序。我可以创建一个圆形查询,然后通过循环增加搜索半径,直到找到20家餐厅。然后计算每个餐厅的距离并对它们进行排序,然后再将它们显示给用户。考虑到应用程序需要处理数据(计算距离和排序),这种方法合理吗?
我注意到javascript Geofire查询从中心返回距离,但我猜iOS和android版本与此不同。

1
这种方法没有任何危害。如果你使用iOS提供的排序例程之一,速度非常快。我在我的一个应用程序中使用相同的方法,从未遇到过任何问题。由于Geofire逐步返回结果,所有后续插入都发生在log(n)时间内,这非常高效。我猜测您不需要处理数量级为千的对象。 - kdeo
Firebase geofire-js: 如何获取静态(固定)位置附近的关键字列表:http://stackoverflow.com/questions/43632746/firebase-geofire-js-how-to-get-list-of-keys-of-near-by-staticfixed-locations - Ankit Maheshwari
1个回答

5

当您从Geofire查询时,相关结果会自动按升序排列。因此,为了获取距离,我只需使用distanceFromLocation函数:

这是我的代码:

func getGeoFirePlaces(){

    let geofireRef = FIRDatabase.database().reference().child("testForGeofire")
    let geoFire  = GeoFire(firebaseRef: geofireRef)
    //geoFireRef is pointing to a firebase reference where I previously set all  places' location 
    let userPosition = CLLocation(latitude: 32.0776067, longitude: 34.78912)
    let circleQuery = geoFire.queryAtLocation(userPosition, withRadius: 2)

    circleQuery.observeEventType(.KeyEntered, withBlock: { (key: String!, location: CLLocation!) in
        print("Key '\(key)' entered the search area and is at location '\(location)'")

        //getting distance of each Place return with the callBack
        let distanceFromUser = userPosition.distanceFromLocation(location)
        print(distanceFromUser)
    })

}

希望这可以帮到您!

1
我对这个答案的有效性有一些疑问。你能指引我查阅相关文档吗?文档中是否提到相关结果会自动按升序排序?你所说的顺序是指什么?距离吗?谢谢。 - user3144836
不,我正在使用它,但它并没有给出排序后的输出... 它根据附近存储的内容给出结果。 - Ankit Mishra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接