【问题标题】:Sending coordinates to a web server and retrieving data based on those coordinates将坐标发送到 Web 服务器并根据这些坐标检索数据
【发布时间】:2012-11-16 16:59:56
【问题描述】:

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

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

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

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

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

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

提前致谢。

【问题讨论】:

    标签: ios database xcode gps core-location


    【解决方案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 代码注意(这是最相关代码的 sn-p,不会单独执行):

    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) {
    

    【讨论】:

    • 谢谢,我很高兴这是可能的。我可以就如何将用户坐标传递给 Web 服务提出一些建议?
    • 您可以使用带参数的 GET。我已经很久没有看过 php web 服务了,所以在那里不能有太大帮助,但是如果您使用 AFNetworking 来处理您的请求,我将在我的答案中发布一些我用来做类似事情的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多