2017-03-21 7 views
0

내 firebase 데이터베이스에서 모든 주석 위치를 검색하고 있습니다. 그때 사용자의 위치를 ​​아래모든 CLlocations CLLocationCoordinate2D를 배열에 저장하는 방법

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     let location = locations[0] 
     let myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 
     ILocation = myLocation 
     self.map.showsTraffic = true 
     self.map.isZoomEnabled = true 
     self.map.showsUserLocation = true 

     let span:MKCoordinateSpan = MKCoordinateSpanMake(0.1, 0.1) 
     let region:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span) 
     map.setRegion(region, animated: true) 

     geoCoder.reverseGeocodeLocation(location, completionHandler: { placemarks, error in 
      guard let addressDict = placemarks?[0].addressDictionary else { 
       return 
      } 

      if let city = addressDict["City"] as? String { 
       self.CityLocation.text = "\(city)" 
//    print("City is: \(city)") 
      } 
     }) 

코드를 얻기 위해이을 locationManager를 사용

var ILocation = CLLocationCoordinate2D() 
let manager = CLLocationManager() 
var UserName = String() 
var C1 = CLLocation() 

func allLocationAnnotations() { 
     let databaseRef = FIRDatabase.database().reference() 

     databaseRef.child("Locations").queryOrderedByKey().observe(.childAdded, with: { (snapshot) in 
      let value = snapshot.value as? NSDictionary 
      let longitude = value?["Longitude"] as! String 
      let latitude = value?["Latitude"] as! String 
      let name = value?["Location Shared By"] as! String 
      let annotationCityName = value?["Annotation_City"] as! String 

      self.allAnnotationLocations.insert(annotationStruct(Longitude: longitude, Latitude: latitude), at: 0) 
//   print("\(name) - Location of Longitude \(longitude), Latitude: \(latitude)") 

      let annotation = MKPointAnnotation() 

      annotation.title = "\(name)" 
      annotation.subtitle = "around this location" 

      annotation.coordinate.latitude = Double(latitude)! 
      annotation.coordinate.longitude = Double(longitude)! 
      self.map.addAnnotation(annotation) 
      self.addRadiusCircle(location: annotation) 

      self.TotalInUserCity += 1 
      self.SpottedNum.text = "\(self.TotalInUserCity)" 

      self.C1 = CLLocation(latitude: Double(latitude)!, longitude: Double(longitude)!) 
     }) 
    } 

(새로운 아이가 데이터베이스에 추가 된 후에 만 ​​실행) 아래의 코드는 동일을 locationManager 기능에 - 바로 그때 이 코드 아래에서 모든 사용자의 현재 위치가 얼마나 많은지에 관계없이 모든 위치에 있는지 확인하기 위해 모든 위치를 파악하려고합니다. 하지만 그 대신에 단 하나의 주석 위치를 얻는 이유는 위의 C1 변수에 저장할 때 하나의 값만 가질 수 있기 때문입니다. 그러나 배열을 만들고 내부에서 잡으려고 할 때 ' 난 단지 이전 한 주석 위치를 얻을 I 추가 할 때 t이

var ILocation = CLLocationCoordinate2D() 
    let manager = CLLocationManager() 
    var UserName = String() 
    var C1 = CLLocation() 

    func allLocationAnnotations() { 
      let databaseRef = FIRDatabase.database().reference() 

      databaseRef.child("Locations").queryOrderedByKey().observe(.childAdded, with: { (snapshot) in 
       let value = snapshot.value as? NSDictionary 
       let longitude = value?["Longitude"] as! String 
       let latitude = value?["Latitude"] as! String 
       let name = value?["Location Shared By"] as! String 
       let annotationCityName = value?["Annotation_City"] as! String 

       self.allAnnotationLocations.insert(annotationStruct(Longitude: longitude, Latitude: latitude), at: 0) 
    //   print("\(name) - Location of Longitude \(longitude), Latitude: \(latitude)") 

       let annotation = MKPointAnnotation() 

       annotation.title = "\(name)" 
       annotation.subtitle = "around this location" 

       annotation.coordinate.latitude = Double(latitude)! 
       annotation.coordinate.longitude = Double(longitude)! 
       self.map.addAnnotation(annotation) 
       self.addRadiusCircle(location: annotation) 

       self.TotalInUserCity += 1 
       self.SpottedNum.text = "\(self.TotalInUserCity)" 

       self.C1 = CLLocation(latitude: Double(latitude)!, longitude: Double(longitude)!) 
      }) 
     } 

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
      let location = locations[0] 
      let myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 
      ILocation = myLocation 
      self.map.showsTraffic = true 
      self.map.isZoomEnabled = true 
      self.map.showsUserLocation = true 

      let span:MKCoordinateSpan = MKCoordinateSpanMake(0.1, 0.1) 
      let region:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span) 
      map.setRegion(region, animated: true) 

      geoCoder.reverseGeocodeLocation(location, completionHandler: { placemarks, error in 
       guard let addressDict = placemarks?[0].addressDictionary else { 
        return 
       } 

       if let city = addressDict["City"] as? String { 
        self.CityLocation.text = "\(city)" 
    //    print("City is: \(city)") 
       } 
      }) 

     let C2 = CLLocation(latitude: Double(self.ILocation.latitude), longitude: Double(self.ILocation.longitude)) 

     let distanceInMeters = C1.distance(from: C2) // result is in meters 

     if(distanceInMeters <= 1609) 
     { 
      print("Your are close to a Location Shared by:---------------") 
     } 
     else 
     { 
      // out of 1 mile 
     } 
    } 

또한 한 조각에

let C2 = CLLocation(latitude: Double(self.ILocation.latitude), longitude: Double(self.ILocation.longitude)) 

    let distanceInMeters = C1.distance(from: C2) // result is in meters 

    if(distanceInMeters <= 1609) 
    { 
     print("Your are close to a Location Shared by:---------------") 
    } 
    else 
    { 
     // out of 1 mile 
    } 
} 
여기

입니다 코드 사전에 도움을 CLLocationCoordinate2D :(덕분에 Cllocation을 변환합니다. 감사 다시 당신을 도울 수 있기를 바랍니다 :)

답변

0

당신은 Annotation을 하나만 가져 오는 이유는 메소드 allLocationAnnotations()이 한 번만 호출되기 때문입니다.

위치가 매번 호출하는 유일한 방법을 업데이트

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

} 

그래서 그냥 위의 방법에 당신의 방법 allLocationAnnotations()를 호출합니다. 최고입니다.

+0

그 조언을 해주셔서 감사합니다 :)하지만, 데이터베이스베이스 (MemoryRef.child)에서 데이터를 가져 오는 코드부터 queryOrderedByKey(). observe (.childAdded, with : {(snapshot) is 이 함수는 루프로 작동하며, firebase 데이터베이스에있는 모든 자식 수만큼 실행됩니다. 새로운 자식이 데이터베이스에 추가 될 때마다 실행됩니다. Firebase는 실시간 데이터베이스로 작동합니다. 기본적으로 추가하면 그 기능으로 그것은 영원히 반복한다. –