5

我正在编写一个具有 ca 的应用程序。数据库中有 7000 家欧洲餐厅,我想向用户显示最近的餐厅列表,例如所有距离用户 5 公里的餐厅。

我可以在服务器上进行搜索,但它需要互联网。是否可以将数据保存在 iPhone 上并查询数据库?我在核心数据或 iPhone SQLite 中找不到任何类似的参考资料。

我真的需要用毕达哥拉斯之类的东西自己编程,并在每次查询时计算到每家餐馆的距离吗?还是有其他方法?

[更新] 我想像在服务器上一样使用它(但要在 iPhone 上使用):SELECT * FROM restaurants WHERE ST_Distance_Sphere(geo, ST_GeomFromText(POINT(55.98767 57.12345), -1)) < 5000

我希望用户即使没有互联网连接也能找到餐厅,例如当您在国外时。

4

2 回答 2

9

阅读纬度和经度计算。纬度和经度本身就是表示为球面上的弧的距离。如果您有一个由纬度和经度表示的位置数据库,那么您可以执行提取以仅查找位于用户当前位置的南北几度纬度以及东、西几度经度内的那些记录。

所以你最终会得到一个类似于(伪代码)的谓词:

latitude >= (currentLatitude-aFewMinutesOfArc)
AND
latitude <= (currentLatitude+aFewMinutesOfArc)
AND
longitude >= (currentLongitude-aFewMinutesOfArc)
AND
longitude >= (currentLongitude+aFewMinutesOfArc)

...这将创建一个逻辑框,该框将返回该框内的所有餐厅记录。然后,如果您需要计算确切的距离,您只需对您拥有的 7,000 条记录中的少数几条进行计算。

我建议阅读定位服务,因为它提供了很多用于处理定位计算的工具。

至于是使用普通 SQL 还是核心数据,请查看此主题的先前答案。简而言之,如果您已经了解 C SQL api,并且您的数据简单、庞大且静态,那么 SQL 是一个不错的选择。如果您可以花时间学习 Core Data,并且您的数据是复杂且动态的,那么无论数据大小如何,Core Data 都是更好的选择。

于 2011-07-15T18:45:25.713 回答
1

您可以使用iOS 版 GeoFire。它使用 Firebase 来存储数据,但由于 Firebase 维护一个本地缓存,它仍然可以在没有网络连接的情况下工作。它将处理地理查询以及在项目进入和离开您的查询时实时通知您。

[免责声明:我在 Firebase 工作]

于 2014-08-26T22:59:36.740 回答