结果应该是一个机场名称,该名称在距iPhone当前位置3英里的纬度和经度之间,只是在查询中输入了错误的机场。
代码:
let lat = 0.0144927536231884
let lon = 0.0181818181818182
let lowerLat = latitude - (lat * distance)
let lowerLon = longitude - (lon * distance)
let greaterLat = latitude + (lat * distance)
let greaterLon = longitude + (lon * distance)
let docRef = Firestore.firestore().collection("airport")
docRef.whereField("latitude", isGreaterThan: lowerLat)
.whereField("latitude", isLessThan: greaterLat)
docRef.whereField("longitude", isGreaterThan: lowerLon)
.whereField("longitude", isLessThan: greaterLon)
docRef.getDocuments { snapshot, error in
if let error = error {
print("Error getting documents: \(error)")
} else {
for document in snapshot!.documents {
if self.btStart.currentTitle == "Decolagem" {
self.tfOrigin.text = (document.get("ident") as! String)
} else {
self.tfDestination.text = (document.get("ident") as! String)
}
}
}
}
}
此查询正确吗?
答案 0 :(得分:1)
您的代码有两点根本上是错误的。首先是它实际上并不查询您要查询的内容,它所做的只是从机场集合中获取所有文档。第二个是,您似乎正在尝试使用多个字段上的范围过滤器查询文档-范围过滤器必须全部在同一字段上查询。
docRef
是对集合的引用(因此它实际上应称为colRef
之类),其中不包含任何查询参数,这就是为什么查询不返回任何有意义的内容的原因,因为这不完全是一个查询,只是一个收藏夹。
docRef.whereField("latitude", isGreaterThan: lowerLat).whereField("latitude", isLessThan: greaterLat)
docRef.whereField("longitude", isGreaterThan: lowerLon).whereField("longitude", isLessThan: greaterLon)
由于您已将docRef
声明为常量,并且实际上从未尝试更改其值,因此上述两行实际上没有任何作用。您正在寻找的是这样的:
let query = Firestore.firestore().collection("airport").whereField("latitude", isGreaterThan: lowerLat).whereField("latitude", isLessThan: greaterLat)
query.getDocuments { snapshot, error in
...
}
此代码将返回一组有意义的文档。但是,您不能在此查询的另一个字段上添加范围过滤器。当您使用范围过滤器latitude
时,您已经在该查询中消耗了唯一可用的范围过滤器。