yandexmapkit-ios
yandexmapkit-ios copied to clipboard
Как получить адрес из координат?
можно так
- (void)reverseGeoCodingLatitude:(double)lat longitude:(double)lon
success:(void (^)(NSString *address))success
failure:(void (^)())failure {
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSString *url = [NSString stringWithFormat:@"http://geocode-maps.yandex.ru/1.x/?geocode=%f,%f&format=json&kind=house&results=1", lon, lat];
[manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSArray *objects = responseObject[@"response"][@"GeoObjectCollection"][@"featureMember"];
if (objects.count > 0) {
success(objects[0][@"GeoObject"][@"name"]);
} else {
failure();
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
failure();
}];
}
По-моему, нужно сначала привести responseObject к словарю, поскольку это NSData:
NSString *streetName, *homeNum;
NSError *error __autoreleasing;
NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData: responseObject
options: NSJSONReadingAllowFragments
error: &error];
NSArray *objects = responseDict[@"response"][@"GeoObjectCollection"][@"featureMember"];
if(objects.count){
NSDictionary *memberDict = objects.firstObject;
streetName = [self findValueForKey: @"ThoroughfareName" Object: memberDict];
homeNum = [self findValueForKey: @"PremiseNumber" Object: memberDict];
//NSLog(@"%@ %@", streetName, homeNum);
}
-(NSString*) findValueForKey: (NSString*) findKey
Object: (id) object{
NSString *result = nil;
if(object == nil){
return nil;
}
else if([object isKindOfClass: [NSArray class]]){
for(id valueObject in (NSArray*)object){
result = [self findValueForKey: findKey
Object: valueObject];
if(result){
return result;
}
}
}
else if([object isKindOfClass: [NSDictionary class]]){
NSDictionary *dict = (NSDictionary*) object;
for(NSString* key in dict.allKeys){
if([key isEqualToString: findKey]){
return [object objectForKey: findKey];
}
else{
result = [self findValueForKey: findKey
Object: [dict objectForKey: key]];
if(result){
return result;
}
}
}
}
return result;
}
for swift 3 I use:
let params = [
"geocode": "\(lon),\(lat)",
"format" : "json",
"kind" : "house",
"results" : "1"
]
let url = "http://geocode-maps.yandex.ru/1.x"
then parsing the result:
if code == 200 {
if let featuremember = (result?["response"]?["GeoObjectCollection"]as? NSDictionary)?["featureMember"] as? NSArray {
if featuremember.count != 0 {
if let name = ((featuremember.object(at: 0) as? NSDictionary)?["GeoObject"] as? NSDictionary)?["name"] as? String {
self.objectAddress = name // Улица Камзина, 10
} else {
//address is nil
}
}
}