Here is how I think it should be done:
1 Make a snapshot of all users’ coordinate Longitude and Latitude entries in Firebase - Print those out in output box to check this step.
2.1 Name a func for the purpose of calculating the distance between the logged in user and all other users
2.2 Inside that function make let coordinate? = the logged in user’s coordinates. The database has the String Value of the Coordinates so somehow this needs to be made to CLLLoationDegrees.
2.3 Make a loop for coordinate1 until coordinateX (ie all users in the database) for their coordinates
2.4 Use let distanceInMeters = coordinate?.distance(from: coordinate?) and loop for all distances until coordinateX (last one in database)
2.5 Print all the distances in output box. (I don’t need them printed on the app, I am simply getting the distances so that I can rank users by distance)
The Database looks like this for each kid:
"people" : {
"2jWm6rUfZVYAGkSST0fvVvwolY92" : {
"Coordinates" : {
"latitude" : 45.785834,
"longitude" : -100.406417
},
"Education" : "BA Arts",
"PhotoPosts" : "https://firebasestorage.googleapis.com/v0/b/westpluto1.appspot.com/o/images%2FPhotoPosts?alt=media&token=ccd5a139-b3e1-4ac9-965c-2f09c149fc74",
"users" : "[email protected]"
},
///Part A
var refArtists : DatabaseReference!
var people = [Userx]()
var latestLocation: [String: Double]? ////this double was added to get coordinates into firebase under longitude and latitude
///Part B
let thisUsersUid = Auth.auth().currentUser?.uid //Mr. Dunn's uid
refArtists = Database.database().reference().child("people");
refArtists.observe(DataEventType.value, with: {snapshot in
if snapshot.childrenCount>0{
self.people.removeAll()
for people in snapshot.children.allObjects as! [DataSnapshot] {
if people.key != thisUsersUid { //do not add this users info to the array
let peopleObject = people.value as? [String: AnyObject]
let peopleCoordinates = peopleObject?["Coordinates"] as? String
let peopl = Userx(Coordinates: peopleCoordinates)
self.people.append(peopl)
}
self.table.reloadData()
print(snapshot)
}
}
})
///Part C
func distance (){
let databaseRef = Database.database().reference()
let uid = Auth.auth().currentUser!.uid
let coordinate? = CLLocation(latitude: databaseRef.child("people").child(uid).child("Coordinates").child("latitude"), longitude: databaseRef.child("people").child(uid).child("Coordinates").child("longitude")) //////I think this is incorrect even w/o string to CLL conversion because I don’t think longitude and latitude and technically children of Coordinates
…..
let distanceInMeters = coordinate?.distance(from: coordinate?)
let distanceInMeters2 = coordinate?.distance(from: coordinate2)
….
Print …
Print …
///////Code based on answer from Jay
let uid = Auth.auth().currentUser!.uid
let ref = Database.database().reference().child("people").child(uid).child("Coordinates")
ref.observeSingleEvent(of: .value, with: { snapshot in
let allCoordinates = snapshot.children.allObjects as! [DataSnapshot]
for Coordinates in allCoordinates {
let lat = Coordinates.childSnapshot(forPath: "latitude").value as! CLLocationDegrees
let lon = Coordinates.childSnapshot(forPath: "longitude").value as! CLLocationDegrees
let userId = Coordinates.key
let locCoord = CLLocationCoordinate2DMake(lat, lon)
let bcoordinates = CLLocationCoordinate2D(latitude: lat, longitude: lon)
}
})
///2nd updated code:
let uid = Auth.auth().currentUser!.uid
refArtists = Database.database().reference().child("people");
let ref = self.refArtists.child(uid).child("Coordinates")
ref.observeSingleEvent(of: .value, with: { snapshot in
let allLocations = snapshot.children.allObjects as! [DataSnapshot]
for location in allLocations {
let userId = location.key
let coordSnap = location.childSnapshot(forPath: "Coordinates")
let lat = coordSnap.childSnapshot(forPath: "latitude").value as! CLLocationDegrees
let lon = coordSnap.childSnapshot(forPath: "longitude").value as! CLLocationDegrees
let locCoord = CLLocationCoordinate2DMake(lat, lon)
let coordinates = CLLocationCoordinate2D(latitude: lat, longitude: lon)
print(" coords: (lat) (lon)")
}
})
////This is the code that now gives two coords printed:
let ref = self.refArtists.child(uid).child("Coordinates")
ref.observeSingleEvent(of: .value, with: { snapshot in
let allLocations = snapshot.children.allObjects as! [DataSnapshot]
for location in allLocations {
let userId = location.key
let lat = snapshot.childSnapshot(forPath: "latitude").value as! CLLocationDegrees
let lon = snapshot.childSnapshot(forPath: "longitude").value as! CLLocationDegrees
let locCoord = CLLocationCoordinate2DMake(lat, lon)
let coordinates = CLLocationCoordinate2D(latitude: lat, longitude: lon)
print(" coords: (lat) (lon)")
}
I expect to rank the users based on location after all this.
See Question&Answers more detail:
os