objective-c - CoreData + Magical Record 运行选择查询

标签 objective-c core-data nspredicate magicalrecord magicalrecord-2.2

我有一个带有 sqlite 数据库的应用程序,其中包含 7000 多条记录,其中包含城市名称、经度和纬度。这些“城市”也连接到数据库上的相关城市字段。

我的应用程序所做的是,使用核心位置查询当前位置,获取经度和纬度值,然后从数据库中找到最近的位置。

结果不必非常准确(我只想匹配城市),所以我想使用斜边公式来查找最近的点:

closest city in db: min((x1-x2)^2 +(y1-y2)^2)^(1/2)

x1, y1: lon and lat for user
x2, y2: lon and lat for points in database. 

如果我使用 ms-sql 或 sqlite 数据库,我可以轻松创建查询,但当涉及到核心数据时,我就没有想法了。

我不想获取所有数据(并填充内存),然后在所有字段上聚合此公式,那么有没有办法创建查询并从数据库获取结果?

我是否对这个问题想得太多,而错过了一个简单的解决方案?

最佳答案

如果我正确理解您的问题,您想要找到距离您当前位置最近的“n”个城市。

我有类似的事情,这就是我的处理方法。

本质上,您可能需要获取每个城市的纬度/经度并将其散列到某个索引中。我们使用墨卡托投影将纬度/经度转换为 x/y,然后以类似于 Google/Bing/Apple map 散列其 map 图 block 的方式散列该值。幸运的是,MapKit 内置了墨卡托投影功能。

伪代码:

for each city's lat/lon {
    CLLocationCoordinate2D coordinate = (CLLocationCoordinate2D){lat, lon};
    MKMapPoint point = MKMapPointForCoordinate(coordinate);
    //256 represents the size of a map tile at zoomLevel 20.  You can use whatever zoomLevel 
    //you want here, but we need something to quickly lookup close-by cities.
    //this is the formula you can use to determine how granular your index is
    //(256 * pow(2, (20 - zoomLevel)))
    NSInteger x = point.x/256.0;
    NSInteger y = point.y/256.0;
    save x & y in a CityHashIndex table
}

现在,您获取当前位置的纬度/经度,将其散列到索引中,如上所示,然后只需针对此 CityHashIndex 表编写一个查询即可。

因此,为了简单起见,您当前位置的索引为 1000, 1000。因此,要查找附近的城市,您可能会搜索索引在“900-1100, 900-1100”范围内的城市。

从这里开始,您现在只需拉入小得多的城市集,并且处理斜边公式的内存要求也不是那么糟糕。

如果您有兴趣,我可以详细说明。

关于objective-c - CoreData + Magical Record 运行选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20706536/

相关文章:

ios - 捕获 UINavigationBar 上的触摸?

objective-c - NSScrollView 无限/无限滚动 | subview 重用

ios - CoreData -(性能)频繁数据的注意事项

swift - 获取请求错误

ios - NSPredicate 搜索具有 nil 值的连接表

ios - 添加 subview myNavigationController.view 时关闭 20 像素(y 轴)

objective-c - 默认全屏播放 YouTube 视频

ios - iOS数据导入策略/设计

objective-c - NSPredicate:加入对象或对象ID

swift - SwiftUI View和@FetchRequest谓词带有可以更改的变量