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