2017-03-21 10 views
0

Firebaseデータベースからすべての注釈位置を取得しています。以下のコード(新しい子がデータベースに追加された後にのみ実行される)すべてのCLlocations CLLocationCoordinate2Dを配列に保存する方法

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

を取得するには、このlocationManagerを使用して、以下のコードは、同じlocationManager機能である - 右このコードの下で、私はすべての場所をつかんで、私のユーザーの現在の位置がどんなに多くの問題にもかかわらず近くにあるかどうかを確認しようとしています。しかし、代わりに私は唯一の注釈の場所を取得しているので私はそれが私が認識している1つの値を保持することができます上のC1のC1に格納するので、私は配列を作成しようとすると、私は以前のように1つの注釈の位置を取得する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

あなたはあなたのメソッドallLocationAnnotations()は一度だけ呼び出されるため、Annotationは1つしか取得できません。

場所は

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

} 

はこれだけ上記の方法であなたのメソッドを呼び出すallLocationAnnotations()されるたびに呼び出すだけの方法を更新します。 すべて最高です。

+0

ありがとうございました:)しかし、私のfirebaseのデータを取得しているコードはdatabaseRef.child( "Ice_Locations")です。queryOrderedByKey()。observe(.childAdded、with:{(snapshot))その機能ではループとして動作し、子供の合計数がfirebaseデータベースにありますが、新しい子がデータベースに追加されるたびに実行されます。Firebaseはリアルタイムデータベースとして動作します。その関数に永遠にループする –

関連する問題