2017-09-15 1 views
0

Je veux avoir une distance de mon emplacement actuel à une annotation qui est dans la base de données FireData. .. J'ai essayé de le faire mot, mais je ne peux pas, (je voudrais avoir la distance entre les deux endroits dans un var J'espère que les gars vous pouvez me aiderDistance entre l'emplacement actuel et l'annotation. (Firebase)

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

Voici ma structure: . Structure

Répondre

0

Essayez d'utiliser ce code. N'oubliez pas d'activer votre position actuelle sur la carte

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 
+0

J'ai utilisé votre méthode (regardez le code mis à jour) mais elle ne fonctionne toujours pas. –

+0

@DaniKemper Vous êtes sûr que vous obtenez la bonne coordonnée depuis Firebase, et que la géolocalisation permet d'afficher votre position actuelle sur la carte? Et mieux utiliser ce laisser getLongitude = (itemDict [ "Longitude"] comme? NSString) .doubleValue Son plus précis – maxkoriakin

+0

Oui je suis Positieve! –

0

J'ai utilisé une fonction similaire, ce NOTE était ma fonction il a donc le cavalier et le conducteur .. mais vous peut le changer pour utiliser l'annotation et l'emplacement de base de feu.

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

      }