Расстояние от текущего местоположения до аннотации. (База огня)

Я хочу иметь расстояние от моего текущего местоположения до аннотации, которая находится в базе данных FireData. Я пытался сделать это словом, но я не могу ;(. Я хотел бы иметь расстояние между двумя местоположениями в варе. Надеюсь, вы, ребята, можете мне помочь.

func reload(){
    //get data
    Database.database().reference().child("Rollerbanken").observe(.value, with: { (snapshot) in



        for item in snapshot.children{

            if let value = snapshot.value as? Dictionary<String, Any> {

                for key in value.keys {
                    if let itemDict = value[key] as? Dictionary<String, AnyObject> {

                        let annotation = MKPointAnnotation()
                        annotation.title = itemDict["TypeControle"] as! String
                        let tijd = itemDict["Tijd"] as! String
                        annotation.subtitle = "Geplaatst om \(tijd)"

                        let getLatitude = itemDict["Latitude"] as? String
                        let getLongitude = itemDict["Longitude"] as? String
                        if let lat = getLatitude, let long = getLongitude {
                            annotation.coordinate = CLLocationCoordinate2D(latitude: Double(lat)!, longitude: Double(long)!)

                            self.map.addAnnotation(annotation)

                            let directionRequest = MKDirectionsRequest()
                            directionRequest.source = MKMapItem.forCurrentLocation()
                            if #available(iOS 10.0, *) {
                                directionRequest.destination = MKMapItem(placemark: MKPlacemark.init(coordinate: CLLocationCoordinate2DMake(Double(lat)!, Double(long)!)))
                            } else {
                                // Fallback on earlier versions
                            }
                            directionRequest.transportType = .walking
                            let direction = MKDirections(request: directionRequest)
                            direction.calculate(completionHandler: { (response, error) in
                                if error != nil {
                                    print("Error while build route")
                                } else {
                                    let route = response?.routes.last
                                    let distance = route?.distance
                                    print(distance)
                                }
                            })
                        }
                    }
                }
            }
        }
    })
}

Вот моя структура: Структура


person Dani Kemper    schedule 15.09.2017    source источник


Ответы (2)


Попробуйте использовать этот код. Не забудьте включить ваше текущее местоположение на карте

let directionRequest = MKDirectionsRequest()
        directionRequest.source = MKMapItem.forCurrentLocation()
        directionRequest.destination = MKMapItem(placemark: MKPlacemark.init(coordinate: CLLocationCoordinate2DMake(YOURPOINTLATITUDE, YOURPOINTLONGITUDE)))
        directionRequest.transportType = .walking
        let direction = MKDirections(request: directionRequest)
        direction.calculate(completionHandler: { (response, error) in
            if error != nil {
                print("Error while build route")
            } else {
                let route = response?.routes.last
                let distance = route?.distance
person maxkoriakin    schedule 15.09.2017
comment
Я использовал ваш метод (посмотрите на обновленный код), но он все еще не работает. - person Dani Kemper; 15.09.2017
comment
@DaniKemper Вы уверены, что получаете правильные координаты от firebase и включаете геолокацию, чтобы показать ваше текущее место на карте? И лучше используйте это пусть getLongitude = (itemDict[Longitude] as? NSString).doubleValue Это более точно - person maxkoriakin; 15.09.2017
comment
Да я позитивный! - person Dani Kemper; 15.09.2017
comment
@DaniKemper правильно ли эта строка добавила аннотацию на карту? self.map.addAnnotation(annotation) Попробуйте поставить точки останова и посмотреть в консоли значение, шаг за шагом - person maxkoriakin; 15.09.2017
comment
Аннотация правильная. Я загрузил места, и они отлично отображаются на карте. Единственное, что не будет работать, это расстояние между этими аннотациями. Кстати, есть более 1 аннотации, так что, может быть, это все? - person Dani Kemper; 15.09.2017
comment
@DaniKemper Выводит ноль на консоль? - person maxkoriakin; 15.09.2017

Я использовал аналогичную функцию, ПРИМЕЧАНИЕ. Это была моя функция, поэтому у нее есть наездник и драйвер ... однако вы можете изменить ее, чтобы использовать аннотацию и местоположение из firebase.

if let rideRequestDictionary = snapshot.value as? [String:AnyObject] {

            // Getting the rider location and email
            if let email = rideRequestDictionary["email"] as? String {
                if let lat = rideRequestDictionary["lat"] as? Double{
                    if let lon = rideRequestDictionary["lon"] as? Double{

                        // Getting the Driver location and email
                        let driverCLLocation = CLLocation(latitude: driverLocation.latitude, longitude: driverLocation.longitude)
                        let riderCLLocation = CLLocation(latitude: lat, longitude: lon)

                        // getting the distance between the two people
                        let distance = driverCLLocation.distance(from: riderCLLocation) / 1000

                        // rounding the distances 
                        let roundedDistance = round(distance * 100) / 100

                        // putting the rounded distance and email in label
                        cell.textLabel?.text = "\(email) - \(roundedDistance)km away"
                    }
                }

            }
person chirag90    schedule 15.09.2017