【问题标题】:iPhone geo radius search; Use Core Data or SQLite?iPhone地理半径搜索;使用核心数据还是 SQLite?
【发布时间】:2011-10-05 04:26:08
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您可以考虑 - 如果可能并根据数据集的质量 - 如果您有此信息,则使用纬度/经度计算距离,直到您的用户所在的位置。
  • 是的,我就是这么想的。但是我不想在毕达哥拉斯计算的帮助下获得所有 7k 行并比较每一行,我想使用类似 SELECT * FROM restaurant WHERE ST_Distance_Sphere(geo, ST_GeomFromText(POINT(55.98767 57.12345), -1 ))
  • 我实现此目的的一种方法是使用大约 5,000 个条目的数据集,但这些条目是二进制格式,因此不使用 Core Data / SQL。设备上计算纬度、经度和所有条目之间距离的处理时间不到 2 秒——可以做到——但遗憾的是,我无法在 SQL 方面提出建议,因为我没有在 iOS 中使用过这个。您还可以将位置拆分为大陆或纬度块,以协助完成此任务的计算方面。
  • 嗯,好的,感谢您的 cmets 关于您的数据集上的时间,这非常有价值。

标签: iphone sqlite core-data spatial geo


【解决方案1】:

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

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

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

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

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

至于使用纯SQL还是Core Data,请看previous answer on the subject. 简而言之,如果您已经了解C SQL api并且您的数据简单、庞大且静态,那么SQL是一个不错的选择。如果您可以花时间学习 Core Data,并且您的数据是复杂且动态的,那么无论数据大小如何,Core Data 都是更好的选择。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      相关资源
      最近更新 更多