Я создаю приложение, в котором я получаю текущее местоположение, имя и адрес, широту и долготу, но как найти ближайшие места, такие как банки, ресторан, автобусная остановка, рядом с моим текущим местоположением в iPhone.
Как найти ближайшие места, такие как банки, ресторан в iPhone
Ответы (3)
Вы можете использовать сервис Google таким образом и вызывать его в цикле, каждый раз меняя строку 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/
Вам понадобится API, который предоставит вам все это, его нет в стандартном SDK.
У вас должен быть объект, представляющий банк, ресторан или автобус (в примере - вокзал). Вы, вероятно, захотите, чтобы он реализовал протокол 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]
будет рядом с вашим местоположением.