【问题标题】:Fetch posts from firebase by location with swift使用 swift 按位置从 firebase 获取帖子
【发布时间】:2018-11-01 23:29:07
【问题描述】:

当用户进入它们的某种半径时,我正在尝试获取帖子并将它们打印到控制台。我怎样才能迅速做到这一点。

【问题讨论】:

  • 计算距离。

标签: swift firebase firebase-realtime-database


【解决方案1】:

这是我用 Swift 编写的一个小结构,让您使用 Haversine formula 计算两个坐标之间的距离(以 km 为单位)。

示例

let london = Coordinate(long: -0.118092, lat: 51.509865)
let paris = Coordinate(long: 2.3522219, lat: 48.856614)

print(london.distance(to: paris)) // ~343.43km
print(london == paris) // false
print(london) // 51.509865,-0.118092
print(paris) // 48.856614,2.3522219

代码

import Foundation

public struct Coordinate: CustomStringConvertible, Equatable {
  // Earth radius in km
  private static let radiusEarth = 6371.0

  public typealias Distance = Double

  public let lon: Double
  public let lat: Double

  public init(long: Double, lat: Double) {
    self.lon = long
    self.lat = lat
  }

  public static func == (lhs: Coordinate, rhs: Coordinate) -> Bool {
    return lhs.lon == rhs.lon && lhs.lat == rhs.lat
  }

  public var description: String {
    return "\(lat),\(lon)"
  }

  // Haversine formula
  public func distance(to other: Coordinate) -> Distance {
    let dLat = deg2rad(other.lat - lat)
    let dLon = deg2rad(other.lon - lon)
    let a =
      sin(dLat / 2) * sin(dLat / 2) +
      cos(deg2rad(lat)) * cos(deg2rad(other.lat)) *
      sin(dLon / 2) * sin(dLon / 2)
    let c = 2 * atan2(sqrt(a), sqrt(1 - a))
    return Coordinate.radiusEarth * c
  }

  private func deg2rad(_ deg: Double) -> Double {
    return deg * (.pi / 180.0)
  }
}

【讨论】:

  • 所以要从我的 firebase 数据库中获取帖子,我只需将一个坐标设置为帖子坐标,另一个设置为用户当前位置?
猜你喜欢
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 2019-04-11
  • 2018-05-05
  • 2018-11-20
相关资源
最近更新 更多