31 декабря 2010 г.

Конвертирование "человеческого" адреса в широту и долготу

Что б отобразить что-то на карте (MKMapView) нужно знать координаты (широту и долготу) точки в которой мы хотим отобразить элемент. У меня возникла ситуация когда в качестве координаты у меня есть только почтовый адрес. Сервисов преобразования почтового адреса в широту и долготу довольно много, я использовал "Yahoo! Maps Web Services - Geocoding API"

Функция конвертации выглядит так:
- (void) convertAddress:(NSString *) address
{
NSError *err = nil;
NSString *url = [NSString stringWithFormat:@"http://api.maps.yahoo.com/ajax/geocode?appid=onestep&qt=1&id=m&qs=%@",
[self convertChars:address]];
NSString *str = [NSString stringWithContentsOfURL:[NSURL URLWithString:url]
encoding:NSUTF8StringEncoding
error:&err];
NSLog(@"%@", str);
CGFloat lat = [[self getAttr:@"Lat" fromString:str] floatValue];
CGFloat lon = [[self getAttr:@"Lon" fromString:str] floatValue];
if (fabs(lat)>.0001 || fabs(lon)>.0001)
{
MKCoordinateRegion region;
region.center.latitude = lat;
region.center.longitude = lon;
region.span.latitudeDelta = 0.1;
region.span.longitudeDelta = 0.1;
[mapView setRegion:region];
}
}


Для начала конвертируем символы адреса, так как адрес передаем в GET запросе:

- (NSString *) convertChars:(NSString *) str
{
NSMutableString *rv = [str mutableCopy];
[rv replaceOccurrencesOfString:@" "
withString:@"+"
options:0
range:NSMakeRange(0, [rv length])];
[rv replaceOccurrencesOfString:@","
withString:@""
options:0
range:NSMakeRange(0, [rv length])];
[rv replaceOccurrencesOfString:@"."
withString:@""
options:0
range:NSMakeRange(0, [rv length])];
return [rv autorelease];
}


Результатом запроса будет javascript строка, и из нее выделяем долготу и широту:

- (NSString *) getAttr:(NSString *) attr fromString:(NSString *) str
{
NSString *rv = nil;
NSRange rng = [str rangeOfString:[NSString stringWithFormat:@"\"%@\":", attr]];
if (rng.location != NSNotFound)
{
rng.location = rng.location +rng.length;
rng.length = 0;
unichar ch = [str characterAtIndex:rng.location+rng.length];
while ((rng.location+rng.length)<[str length] && (ch!=',' && ch!='}'))
{
rng.length++;
ch = [str characterAtIndex:rng.location+rng.length];
}
rv = [str substringWithRange:rng];
}
return rv;
}


В качестве примера обновил проект на github

Так же смотрите:
- MapKit в iOS

Комментариев нет:

Отправить комментарий