我正在写一个有大约的应用程序。数据库中的7000家欧洲餐馆,我想向用户显示最近的餐馆列表,例如,所有这些餐馆都是半径5公里的用户。
我可以在服务器上进行搜索,但它需要上网。是否可以将数据保存在iPhone上并查询数据库?我在核心数据或iPhone中没有找到类似内容的任何引用。
我是否真的需要用毕达哥拉斯和其他东西自己编程并计算每个查询到每家餐馆的距离?或者还有其他方式吗?
[更新]我想像在服务器上一样使用它(但是要在iPhone上执行):SELECT * FROM restaurants WHERE ST_Distance_Sphere(geo, ST_GeomFromText(POINT(55.98767 57.12345), -1)) < 5000
我希望用户能够找到一家餐馆,即使她没有网络连接,例如当你在国外时。
答案 0 :(得分:9)
阅读纬度和经度计算。纬度经度本身就是在球面上以弧线表示的距离。如果您有一个由纬度和经度表示的位置数据库,那么您可以执行提取以仅查找位于用户当前位置的东西方向的北纬几度和经度的几度的记录。
所以你最终会得到一个类似(伪代码)的谓词:
latitude >= (currentLatitude-aFewMinutesOfArc)
AND
latitude <= (currentLatitude+aFewMinutesOfArc)
AND
longitude >= (currentLongitude-aFewMinutesOfArc)
AND
longitude >= (currentLongitude+aFewMinutesOfArc)
...这将创建一个逻辑框,它将返回所有餐馆内的记录。然后,如果您需要计算确切的距离,您只需要对您拥有的7,000个记录中的少数记录进行计算。
我建议阅读Location Services,因为它提供了许多处理位置计算的工具。
关于是使用纯SQL还是核心数据,请查看此previous answer on the subject.简而言之,如果您已经了解C SQL API并且数据简单,大且静态,则SQL是一个不错的选择。如果您可以花时间学习核心数据并且数据复杂且动态,那么无论数据大小如何,核心数据都是更好的选择。
答案 1 :(得分:2)
您可以使用GeoFire for iOS。它使用Firebase存储数据,但由于Firebase维护了本地缓存,因此它仍然可以在没有网络连接的情况下工作。它将处理GeoQueries,并在物品进入和离开您的查询时实时通知您。
[免责声明:我在Firebase工作]