我的核心数据存储中有具有纬度和经度属性的记录。现在我需要找到最接近给定位置的记录。在SQL中,我会这样做:
select t.lat
,t.lon
,(t.lat-varLat) + (t.lon - varLon) diff
from table t
order by diff ASC.
给定varLat和varLon是我想要的最接近记录的位置的坐标。然而,我不知道如何在核心数据中使用NSPredcate来做到这一点。
我能想象的最糟糕的事情是用一个谓词循环fetchrequests,该谓词围绕给定的(varLat,varLon)扩展"搜索范围",并使用longitude BETWEEN %@ && latitude BETWEEN %@
,有两个数组(每个数组都有作为数组成员的中心+和中心-半径)作为参数,每次都扩大这个范围,直到我命中为止。。然而,这远不是最佳的。
谢谢你的建议。
首先,您的查询不正确,错误高达app。40%。你的计算只是把长短差加起来。假设为2D曲面,实际差异为sqrt((lat-varlat)^2 + (lon-varLon)^2)
。在实际表面上,几何结构更为复杂,但在大多数情况下,差异可以忽略不计。
在核心数据中,获取所有实例,然后在循环中对它们进行迭代并不罕见。原因是Core Data使用了一种称为faulting的机制,该机制允许您在没有太多内存开销的情况下检索大量对象。