yandexmapkit-ios icon indicating copy to clipboard operation
yandexmapkit-ios copied to clipboard

Как получить адрес из координат?

Open omarmin opened this issue 12 years ago • 4 comments

omarmin avatar Jan 27 '14 23:01 omarmin

можно так

- (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();
    }];
}

z0rgoyok avatar Feb 25 '14 12:02 z0rgoyok

По-моему, нужно сначала привести 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);
                   }

Dmitry-rman avatar Mar 14 '14 02:03 Dmitry-rman

-(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;
}

Dmitry-rman avatar Mar 14 '14 02:03 Dmitry-rman

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
                   }
          }
}

gulzatique avatar May 31 '17 05:05 gulzatique