仅显示半径内场地的注释
ONLY Show annotations for venues within radius
我试图只显示离我的用户最近的位置的注释。我已将所有位置保存到 firebase,现在我只是尝试检索它们并仅使用用户周围的位置填充 Map 和 TableView。我试过 GeoFire 和其他一些,但我确定我做的不对。有人可以帮忙吗?
override func viewDidLoad() {
super.viewDidLoad()
// Set up Map
mapView.delegate = self
mapView.userTrackingMode = MKUserTrackingMode.follow
// Setup TableView
tableView.delegate = self
tableView.dataSource = self
//Pulls TableData for UITableView
DataService.ds.REF_VENUE.observe(.value, with: { (snapshot) in
self.posts = [] // THIS IS THE NEW LINE
if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
for snap in snapshot {
if let postDict = snap.value as? Dictionary<String, AnyObject> {
let key = snap.key
let post = Post(postKey: key, postData: postDict)
self.posts.append(post)
}
//Populates Map with annotations.
if let locationDict = snap.value as? Dictionary<String, AnyObject> {
let lat = locationDict["LATITUDE"] as! CLLocationDegrees
let long = locationDict["LONGITUDE"] as! CLLocationDegrees
let title = locationDict["NAME"] as! String
let center = CLLocationCoordinate2D(latitude: lat, longitude: long)
_ = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.20, longitudeDelta: 0.20))
let annotation = MKPointAnnotation()
annotation.coordinate = CLLocationCoordinate2DMake(lat, long)
annotation.title = title.capitalized
self.mapView.addAnnotation(annotation)
}
}
}
self.tableView.reloadData()
})
}
以下是我设置 table 的方法:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return posts.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "detailCell", for: indexPath) as? PostCell {
let cellData = posts[indexPath.row]
cell.configureCell(post: cellData)
return cell
} else {
return PostCell()
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let post = posts[indexPath.row]
performSegue(withIdentifier: "previewSegue", sender: post)
}
因为我的位置和你的位置不一样。我在设备上对其进行了测试,结果就像离我所在位置的距离一样,而您的场地位置很大,大约 3K 。因此您可以使用该代码文件并在您的设备中检查它,这会有所帮助。
1) 我暂时将您的 didload 函数替换为不同的函数,并在地图的 DidUpdateLocation 中调用它
2) 使用 //iosGeek 作为我在文件中插入代码的代码行上方的注释。
3) 目前我没有在地图或 table 中填充数据,因为位置不同
Link: https://drive.google.com/open?id=0Bz8kF1Gedr7fNThTbTFZY1Q3LVk
看看你的 FeedVc 中的这个函数
1) 请在设备上测试以获取位置差异
2) 在控制台中打印位置以检查其是否为真
3) 在 If else 条件下打印 self.postdata 以检查输出
if snapshot.exists(){
if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
for snap in snapshot {
//Here I just used your snapshot to filter data
self.postData = snap.value as! [String : AnyObject]
//calculating distance here with custom function made
let distance = self.calculateDistancxe(userlat: self.userLatt, userLon: self.userLonn, venueLat: self.postData["LATITUDE"]! as! CLLocationDegrees, venueLon: self.postData["LATITUDE"]! as! CLLocationDegrees)
//if Distance is less Than or equal to 2 km
let aa : Int = Int(distance)!
if (aa <= 2){
//if yes , add *self.postData* in a new Dictionary or Array
print("*********\(self.postData)")
//time to use that postdata in a dict or array from which you will populate data in TableView
}
else{
//if condition don't satisfy
print("noting \(distance)")
}
}
}
}
如果仍有任何问题,请发表评论
我试图只显示离我的用户最近的位置的注释。我已将所有位置保存到 firebase,现在我只是尝试检索它们并仅使用用户周围的位置填充 Map 和 TableView。我试过 GeoFire 和其他一些,但我确定我做的不对。有人可以帮忙吗?
override func viewDidLoad() {
super.viewDidLoad()
// Set up Map
mapView.delegate = self
mapView.userTrackingMode = MKUserTrackingMode.follow
// Setup TableView
tableView.delegate = self
tableView.dataSource = self
//Pulls TableData for UITableView
DataService.ds.REF_VENUE.observe(.value, with: { (snapshot) in
self.posts = [] // THIS IS THE NEW LINE
if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
for snap in snapshot {
if let postDict = snap.value as? Dictionary<String, AnyObject> {
let key = snap.key
let post = Post(postKey: key, postData: postDict)
self.posts.append(post)
}
//Populates Map with annotations.
if let locationDict = snap.value as? Dictionary<String, AnyObject> {
let lat = locationDict["LATITUDE"] as! CLLocationDegrees
let long = locationDict["LONGITUDE"] as! CLLocationDegrees
let title = locationDict["NAME"] as! String
let center = CLLocationCoordinate2D(latitude: lat, longitude: long)
_ = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.20, longitudeDelta: 0.20))
let annotation = MKPointAnnotation()
annotation.coordinate = CLLocationCoordinate2DMake(lat, long)
annotation.title = title.capitalized
self.mapView.addAnnotation(annotation)
}
}
}
self.tableView.reloadData()
})
}
以下是我设置 table 的方法:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return posts.count }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "detailCell", for: indexPath) as? PostCell {
let cellData = posts[indexPath.row]
cell.configureCell(post: cellData)
return cell
} else {
return PostCell()
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let post = posts[indexPath.row]
performSegue(withIdentifier: "previewSegue", sender: post)
}
因为我的位置和你的位置不一样。我在设备上对其进行了测试,结果就像离我所在位置的距离一样,而您的场地位置很大,大约 3K 。因此您可以使用该代码文件并在您的设备中检查它,这会有所帮助。
1) 我暂时将您的 didload 函数替换为不同的函数,并在地图的 DidUpdateLocation 中调用它
2) 使用 //iosGeek 作为我在文件中插入代码的代码行上方的注释。
3) 目前我没有在地图或 table 中填充数据,因为位置不同
Link: https://drive.google.com/open?id=0Bz8kF1Gedr7fNThTbTFZY1Q3LVk
看看你的 FeedVc 中的这个函数
1) 请在设备上测试以获取位置差异
2) 在控制台中打印位置以检查其是否为真
3) 在 If else 条件下打印 self.postdata 以检查输出
if snapshot.exists(){
if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
for snap in snapshot {
//Here I just used your snapshot to filter data
self.postData = snap.value as! [String : AnyObject]
//calculating distance here with custom function made
let distance = self.calculateDistancxe(userlat: self.userLatt, userLon: self.userLonn, venueLat: self.postData["LATITUDE"]! as! CLLocationDegrees, venueLon: self.postData["LATITUDE"]! as! CLLocationDegrees)
//if Distance is less Than or equal to 2 km
let aa : Int = Int(distance)!
if (aa <= 2){
//if yes , add *self.postData* in a new Dictionary or Array
print("*********\(self.postData)")
//time to use that postdata in a dict or array from which you will populate data in TableView
}
else{
//if condition don't satisfy
print("noting \(distance)")
}
}
}
}
如果仍有任何问题,请发表评论