如何在 iPhone 中找到最近的位置,如银行、餐厅

Posted

技术标签:

【中文标题】如何在 iPhone 中找到最近的位置,如银行、餐厅【英文标题】:How to find nearest locations like banks, restaurant in iPhone 【发布时间】:2011-07-29 11:19:53 【问题描述】:

我正在制作一个应用程序,我在其中获取当前位置、姓名和地址、纬度和经度,但是如何在 iPhone 中找到我当前位置附近的银行、餐厅、公交车站等最近的地方。

【问题讨论】:

【参考方案1】:

您可以像这样使用谷歌的服务,并在每次更改pointOfInterest字符串的循环中调用它:

CLLocationCoordinate2D coordinate = location.coordinate;
NSString *pointOfInterest = @"banks";
NSString *URLString = [NSString stringWithFormat:@"http://ajax.googleapis.com/ajax/services/search/local?v=1.0&rsz=small&sll=%f,%f&q=%@",coordinate.latitude,coordinate.longitude, pointOfInterest];

URLString = [URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URLString]];

// Perform request and get JSON back as a NSData object
NSError *error = nil;
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
if(error != nil) 
UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Error" 
                                                         message:[error localizedDescription] 
                                                        delegate:self 
                                               cancelButtonTitle:@"Done" 
                                               otherButtonTitles:nil] autorelease]; 
        [alert show];

else 
// Get JSON as a NSString from NSData response
    NSString *jsonString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
    //Return the values in NSDictionary format  
    SBJsonParser *parser = [[SBJsonParser alloc] init];

    NSDictionary *jsonResponse = [parser objectWithString:jsonString error:nil];
    NSDictionary *responseData = [jsonResponse objectForKey:@"responseData"];
    NSArray *results = [responseData objectForKey:@"results"];

您可以在这里获取 JSON API:

https://github.com/stig/json-framework/

【讨论】:

【参考方案2】:

您将需要一个能够为您提供这些东西的 API,而标准 SDK 中没有。

【讨论】:

【参考方案3】:

您应该有一个代表银行、餐厅或公共汽车(示例中的车站)的对象。您可能希望它实现 MKAnnotation 协议,因为您可能希望将它们添加到 MKMapView。这些对象中的每一个都需要一个坐标属性(CLLocationCoordinate2D)。当我做这样的事情时,我还添加了一个距离属性(CLLocationDistance)。在视图控制器中实例化这些对象时,您需要将它们添加到数组中。

现在,当用户的应用程序更新时,您让每个对象计算从该位置到自身的距离。

例如:

- (void)calculateDistance:(CLLocation *)location 
    CLLocation *stationLocation = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
    distance = [location distanceFromLocation:stationLocation];
    [stationLocation release];

一旦你让每个对象计算它的距离,你现在可以按距离对你的数组进行排序。

[stations sortUsingSelector:@selector(compareDistance:)]

这要求您的对象实现此方法:

- (NSComparisonResult)compareDistance:(Station *)aStation 
    if (distance < aStation.distance) return NSOrderedAscending;
    if (distance > aStation.distance) return NSOrderedDescending;
    return NSOrderedSame;

现在您的数组中应该包含按距离排序的代表银行等的对象。

[stations objectAtIndex:0] 将是您所在位置的附近。

【讨论】:

以上是关于如何在 iPhone 中找到最近的位置,如银行、餐厅的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 中查找最近的地点

我正在尝试制作一个类似于查找我的朋友的 iphone 应用程序我如何在地图上找到我朋友的位置?

在 iPhone 上构建“查找最近”位置感知应用程序的最佳方法是啥?

如何从当前位置找到最近的经纬度?

Google maps api v2如何找到最近的位置

找到离给定点最近的点