BirdBrown
Swift 实现的 k-d 二维空间划分树。数据存储在两个数组的对中,使序列化非常简单。除了经典的 k-d 树查询外,BirdBrown 还实现了基于 geokdbush 的地理最近邻搜索。
要查看可变、非地理空间的 k-d 树,请参阅 [https://github.com/Bersaelor/KDTree]
示例
要运行示例项目,请克隆仓库,然后从 Example 目录首先运行 pod install
安装
BirdBrown 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod 'BirdBush'
文档
初始化
使用作为 [id, 经度, 纬度] 形式 Double 数组输入的地理位置生成
var bigArray = [[Double]]()
for i in 1...10000 {
bigArray.append([Double(i), Double.random(in: -180..<180), Double.random(in: -90...90)])
}
let bigIndex = BirdBush<Double>(locations: bigArray,
getID: { $0[0] },
getX: { $0[1] },
getY: { $0[2] })
方法
around(lon: Double, lat: Double, maxResults: Int, maxDistance: Double) -> [(U, Double)]
返回给定地理位置附近的最接近的点,按距离递增的顺序。返回类型是 [(U, Double)]
,其中 U
是位置ID的类型,当使用BirdBush<U>
初始化时指定。第二个值是两点之间的哈弗辛距离。要将其转换为弧度中央角,请使用centralAngle(_ h: Double)
。
lon
:查询点的经度。lat
:查询点的纬度。maxResults
:(可选)返回的最大点数(默认为Int.max
)。maxDistance
:(可选)搜索的最大距离(默认为Double.greatestFiniteMagnitude
)。
centralAngle(_ h: Double) -> Double
返回 around
方法返回的哈弗辛距离的中央角(弧度)。要将中央角转换为距离,乘以地球半径(单位自行选择),例如 6.371e6 米。
nearest(qx: Double, qy: Double) -> (U, Double)
返回查询坐标的最接近的点。返回类型是 (U, Double)
,其中 U
是用于位置ID的类型,当使用 BirdBush<U>
初始化时指定。第二个值是两点之间的平方欧几里得距离。
qx
:查询点 x 坐标。qy
:查询点 y 坐标。
range(minX: Double, minY: Double, maxX: Double, maxY: Double) -> [U]
返回给定盒内的点。返回类型为 [U]
,其中 U
是位置 ID 类型,由初始化时指定的 BirdBush<U>
定义。
within(qx: Double, qy: Double, r: Double) -> [U]
返回所有在查询点指定距离内的点。返回类型为 [U]
,其中 U
是位置 ID 类型,由初始化时指定的 BirdBush<U>
定义。
qx
:查询点 x 坐标。qy
:查询点 y 坐标。r
:最大距离。
作者 & 许可证
Bird Bush 是 Vladimir Agafonkin 的 JavaScript 库 kdbush 和 geokdbush 的 Swift 版本。Bird Bush 在 ISC 许可证下提供。有关更多信息,请参阅 LICENSE 文件。