根据位置半径过滤Firebase数据库

时间:2016-09-30 12:55:37

标签: swift firebase filter location firebase-realtime-database

我有以下Firebase数据库结构

"-KSupX7CppMD1zbqIy0y" : {
  "addedByUser" : "zQpb7o18VzYsSoTQtT9DNhOqTUn2",
  "content" : "Post 1",
  "cost" : "20",
  "duration" : "Weekly",
  "latitude" : "40.7594479995956",
  "longitude" : "-73.9838934062393",
  "timestamp" : "Fri 30 Sep"
},
"-KSuphuqO6a0lnrJYUkt" : {
  "addedByUser" : "zQpb7o18VzYsSoTQtT9DNhOqTUn2",
  "content" : "Post 2",
  "cost" : "10",
  "duration" : "Daily",
  "latitude" : "40.7594329996462",
  "longitude" : "-73.9846261181847",
  "timestamp" : "Fri 30 Sep"
}

我需要在一定距离参数(小于50米,100米,150米和200米)内过滤帖子。我可以从经度"经度获得坐标。 &安培; "纬度"但是我很难过滤这些帖子。任何帮助将不胜感激。

非常感谢提前。新手到Firebase&迅速的。

2 个答案:

答案 0 :(得分:0)

以下是您可以尝试的解决方案。这假设您已将所有帖子从Firebase下载到应用程序并存储在数组中。你也可以考虑使用我没有亲自使用的GeoFire(但我想)。我相信它允许您按位置查询Firebase,因此您不必首先将所有帖子下载到用户的设备并在客户端进行过滤。

// assumes you have set up the app to get the user's current location
var currentLocation: CLLocation?

// Your array of posts downloaded from Firebase
var postArray = [post]()

let metersInTwentyFiveMiles = 40233.6

// You could put this in viewDidAppear after you load the post array from Firebase
for post in postArray {

    var distanceInMeters: CLLocationDistance = 0

    let postLocation = CLLocation(latitude: post.latitude, longitude: post.longitude)


    if let currentLocation = self.currentLocation {
         // Set distanceInMeters to the distance between the user's current location and the location of the post.
         distanceInMeters = currentLocation.distanceFromLocation(postLocation)
         // If this distance is not within 25 miles, remove this post from the array
         if self.metersInTwentyFiveMiles < distanceInMeters {
            self.posts = self.posts.filter{ $0 != post }
       }
    }
}

答案 1 :(得分:0)

对于像这样的JSON: -

 UsersLocation :{
     autoID1 : {....},
     autoID2 : {.....}
           }

试试这个: -

    FIRDatabase.database().reference().child("UsersLocation").queryOrdered(byChild: "lat").queryStarting(atValue: 30).queryEnding(atValue: 60).observeSingleEvent(of: .value, with: {(snap) in

        print(snap)


        if let snapDict = snap.value as? [String:AnyObject]{

            for each in snapDict{

                print(each)

            }
        }
    })
}

这将为所有用户提供autoID密钥,其纬度在30到60之间。您检索数据的顺序将是随机的,因此要按升序迭代它们,您可以对你收到的字典。