0

目前我有一个基本上是城市指南的 iPhone 应用程序。它向用户展示他们周围的不同事物,并按距离顺序列出它们。

目前,该应用程序的数据位于在线 MySQL 数据库中,然后一个 php 脚本将该数据库的不同部分(例如银行)转换为 XML 文档,因此我有一个用于银行的 XML 文档,一个用于酒吧等的 XML 文档。每个 XML文档有自己的 URL。

然后我的 iPhone 应用从 URL 中读取 XML 文档,解析 XML 文档,然后使用 CoreLocation 计算 XML 文档中每个位置与用户之间的距离,然后将数据放入按距离排序的 TableViews 中,最接近的在前。(可能值得注意的是,数据库中的每条数据(酒吧、银行等)都附有坐标)。

这工作正常,当有多达几百个位置要解析和计算距离时,没有问题。但是,一旦您开始进入数千个,它开始需要很长时间。

基本上我想知道是否有人知道一种方法,而不是下载所有数据然后计算距离,我可以将手机 GPS 位置发送到服务器/数据库或其他任何东西,然后它返回最近的 20 个位置,然后我可以像以前一样解析和显示.

我知道这是一个很大的问题,我不是在寻找帮助我创造一切的人,我只需要知道如何做到这一点的方法。或者,如果有人做过类似的事情。

提前致谢。

4

1 回答 1

1

您已经在您的问题中定义了正确执行此操作的方法。您需要将用户的坐标传递到 Web 服务中。Web 服务或存储过程应实现将结果过滤到仅附近事物的逻辑。如果您需要建议的特定部分,请澄清。

您真的应该让数据库引擎在这里完成繁重的工作。在 mySQL 中,你会使用这样的东西:

SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(lat * PI() / 180) + 
     COS($lat * PI() / 180) * COS(lat * PI() / 180) * COS(($lon - lon) * 
     PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance 
FROM members 
HAVING distance<='10' ORDER BY distance ASC

以下是带有参数的 JSON 获取请求的一些 AFNetworking 代码注意(这是最相关的代码片段,不会单独执行):

NSString *latString = [NSString stringWithFormat:@"%f", lastLocation.coordinate.latitude];
    NSString *lonString = [NSString stringWithFormat:@"%f", lastLocation.coordinate.longitude];
    NSString *accString = [NSString stringWithFormat:@"%f", lastLocation.horizontalAccuracy];

    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:[defaults valueForKeyPath:@"sessionRP"] , @"sessionRP",  [defaults valueForKeyPath:@"partnerID"], @"pid", appointment.scheduleRowPointer, @"srp", latString, @"lat", lonString, @"long", status, @"stat", @"0", @"cached", accString, @"acc", nil];
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:myPath parameters:params];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
于 2012-11-16T17:03:30.153 回答