Как только координаты сохранены как String в Firebase, как они выбираются в CLLLoationDegrees для вычисления расстояния между пользователями? - PullRequest
0 голосов
/ 09 июля 2019

Вот как я думаю, что это должно быть сделано:

1 Сделайте снимок всех записей о долготе и широте всех пользователей в Firebase - распечатайте их в поле вывода, чтобы проверить этот шаг.

2.1 Назовите функцию для расчета расстояния между вошедшим в систему пользователем и всеми другими пользователями

2.2 Внутри этой функции make let координата₀ = зарегистрированные в системе координаты пользователя.База данных имеет строковое значение координат, так что каким-то образом это нужно сделать в CLLLoationDegrees.

2.3 Сделать цикл для координаты1 до координаты X (т.е. всех пользователей в базе данных) для их координат

2.4. Использовать let distanceInMeters = координата₀.distance (от: координата₁) и цикл для всех расстояний до координаты X (последней в базе данных)

2.5 Вывести все расстояния в поле вывода.(Мне не нужно, чтобы они печатались в приложении, я просто получаю расстояния, чтобы я мог ранжировать пользователей по расстоянию)

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" : "jackmaster1091@aol.com"
    },


///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

/// Часть 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)
        }
    }

})

/// Часть 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 …

/////// Код, основанный на ответе от Джея

 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)
    }
})

/// 2-й обновленный код:

    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)")
    }
})

//// Это код, который теперь дает две напечатанные координаты:

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)")
    }

Я рассчитываю ранжировать пользователей по местоположению после всего этого.

1 Ответ

0 голосов
/ 10 июля 2019

Есть несколько способов прочитать данные, о которых вы спрашиваете. Вот краткое изложение каждого

Вариант 1)

Если у вас есть ряд узлов, которые хранят данные координат непосредственно внутри узла

people
   uid_0
      Latitude: xxxxxxxx
      Longitude: yyyyyyy
   uid_1
      Latitude: aaaaaaaa
      Longitude: bbbbbbbb

и вы хотите выполнить итерацию по каждому узлу и создать объект CoreLocation для каждого узла местоположения (loc_0, loc_1 или uid_0 uid_1 и т. Д.), Вот код для этого.

let ref = self.ref.child("people")
ref.observeSingleEvent(of: .value, with: { snapshot in
    let allUsers = snapshot.children.allObjects as! [DataSnapshot]
    for user in allUsers {
        let lat = user.childSnapshot(forPath: "Latitude").value as! CLLocationDegrees
        let lon = user.childSnapshot(forPath: "Longitude").value as! CLLocationDegrees
        let userId = user.key
        let locCoord = CLLocationCoordinate2DMake(lat, lon)
        let coordinates  = CLLocationCoordinate2D(latitude: lat, longitude: lon)
    }
})

обратите внимание, что self.ref указывает на мой корень Firebase.

Вариант 2)

Если ваша структура Firebase содержит данные координат, хранящиеся в узле Coordinates под каждым родительским узлом, тогда обрабатывайте узел Coordinates как его собственный снимок, который позволит вам получить доступ к его двум дочерним координатам, lat и lon.

people
   uid_0
      name: "some user"
      coordinates:
         Latitude: 1
         Longitude: 2
   uid_1
      name: "another user"
      coordinates:
         Latitude: 3
         Longitude: 4

Примечание. Я добавил дочерний узел имени, чтобы вы могли видеть, как это читать.

let ref = self.ref.child("people")
ref.observeSingleEvent(of: .value, with: { snapshot in
    let allUsers = snapshot.children.allObjects as! [DataSnapshot]
    for user in allUsers {
        let userName = user.childSnapshot(forPath: "name").value as! String
        let userId = user.key
        let coordSnap = user.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("uid: \(userId)  name: \(userName)")
        print("   coords: \(lat)  \(lon)")
    }
})
}

и вывод будет выглядеть так

uid: uid_0  name: some name
   coords: 1.0  2.0
uid: uid_1  name: another name
   coords: 3.0  4.0

Вариант 3)

Если вы хотите прочитать один конкретный узел и не выполнять итерацию по всем узлам, вот код. Вам нужно будет знать путь к родительскому узлу, который в данном случае является идентификатором текущего пользователя.

func readThisUsersCoordinates() {
    let uid = Auth.auth().currentUser!.uid
    let peopleRef = Database.database().reference().child("people");
    let thisPersonRef = peopleRef.child(uid)
    let thisPersonCoordsRef = thisPersonRef.child("Coordinates")
    thisPersonCoordsRef.observeSingleEvent(of: .value, with: { snapshot in
        let lat = snapshot.childSnapshot(forPath: "latitude").value as! CLLocationDegrees
        let lon = snapshot.childSnapshot(forPath: "longitude").value as! CLLocationDegrees
        print("   coords: \(lat)  \(lon)")
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...