目前我有一个iPhone应用程序,基本上是一个城市指南。它向用户显示不同的东西,并按距离的顺序列出。
目前应用程序的数据位于在线MySQL数据库中,然后php脚本将此数据库的不同部分(如银行)转换为XML文档,因此我有银行的XML文档,一个用于条形码等每个XML文档都有自己的URL。
我的iPhone应用程序然后从URL读取XML文档,解析XML文档,然后使用CoreLocation计算XML文档中每个位置与用户之间的距离,然后将数据放入按距离排序的TableView中,最接近第一。 (值得注意的是,数据库中的每个数据(条形图,银行等)都附有坐标)。
这很好用,当有多达几百个位置来解析和计算距离时没有问题。然而,一旦你开始成千上万,它开始需要很长时间。
基本上我想知道是否有人知道一种方法而不是下载所有数据然后计算距离我可以将手机GPS位置发送到服务器/数据库或其他任何然后它返回最接近的20个位置然后我可以解析和像以前一样显示。
我知道这是一个很大的问题我不是在寻找帮助我创建所有东西的人,我只需要知道如何做到这一点的方法。或者,如果有人做了类似的事情。
提前致谢。
答案 0 :(得分: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) {