Search code examples
iphoneobjective-ccllocationmanagercllocationclgeocoder

Placemark not giving zip code to find out weather information


I want to find out the weather from the current location.

For that I used the code as

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    [self.locationManager stopUpdatingLocation];

    self.location = newLocation;
//    NSLog(@"lat long = %f,%f",self.location.coordinate.latitude,self.location.coordinate.longitude);

    // Geocode coordinate (normally we'd use location.coordinate here instead of coord).
    // This will get us something we can query Google's Weather API with

    if (boolCurrentlyWorking == NO) {

        CLGeocoder* reverseGeocoder = [[CLGeocoder alloc] init];
        if(reverseGeocoder)
        {
            [reverseGeocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
                CLPlacemark* placemark = [placemarks objectAtIndex:0];
                if (placemark) {
                    //Using blocks, get zip code
                    NSString *zipCode = [placemark.addressDictionary objectForKey:(NSString*)kABPersonAddressZIPKey];
                    NSLog(@"placemark : %@ zipcode : %@",placemark.addressDictionary,zipCode);
                }
            }];

        }else{
            MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:self.location.coordinate];
            geocoder.delegate = self;
            [geocoder start];
        }
     }

    boolCurrentlyWorking = YES;
}

I am not getting zip code here.

Also found out that this method of didupdate location has been deprecated and new method is

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *location = [locations lastObject];
    CLLocation *newlocation = location;
    NSLog(@"location : %@",location);
    CLGeocoder* reverseGeocoder = [[CLGeocoder alloc] init];
    if(reverseGeocoder)
    {
        [reverseGeocoder reverseGeocodeLocation:newlocation completionHandler:^(NSArray *placemarks, NSError *error) {
            for(CLPlacemark *placemark in placemarks)
            {
                NSLog(@"plcaemark desc : %@",[placemark description]);
            }
        }];
    }
}

But it also does not contain zipcode.

I got this description

{
    Country = India;
    CountryCode = IN;
    FormattedAddressLines =     (
        NH8C,
        Gujarat,
        India
    );
    Name = NH8C;
    State = Gujarat;
    Street = NH8C;
    Thoroughfare = NH8C;
}

Is there like it does not provide zipcode information and we have to build it? If yes then how?


Solution

  • First of all We are not getting any zip code or postal code for India.

    Also Google API has been stop working.

    I used yahoo api to find out weather.

    Here is the code that might help someone

    -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
        [self.locationManager stopUpdatingLocation];
    
        self.location = newLocation;
    
    
    
            NSString *linkForWoeid = [NSString stringWithFormat:@" http://where.yahooapis.com/geocode?location=%f,%f&flags=J&gflags=R&appid=zHgnBS4m",self.location.coordinate.latitude,self.location.coordinate.longitude];
            NSURL *woeidURL = [NSURL URLWithString:linkForWoeid];
            NSData *WoeidData = [NSData dataWithContentsOfURL:woeidURL];
            if (WoeidData != NULL)
            {
                NSError *woeiderr = nil;
                NSDictionary *aDicWOEIDResp = [NSJSONSerialization JSONObjectWithData:WoeidData options:NSJSONReadingMutableContainers error:&woeiderr];
                NSDictionary *aDictWOEID = [[[[aDicWOEIDResp objectForKey:@"ResultSet"]objectForKey:@"Results"]objectAtIndex:0]objectForKey:@"woeid"];
    
                NSString *address=[NSString stringWithFormat:@"http://weather.yahooapis.com/forecastrss?w=%@",aDictWOEID];
                ICB_WeatherConditions *icbWeather = [[ICB_WeatherConditions alloc] initWithQuery:address];
    
    }
    
    #import "ICB_WeatherConditions.m"
    
    - (ICB_WeatherConditions *)initWithQuery:(NSString *)query
    {
        if (self = [super init])
        {
            NSURL *url = [NSURL URLWithString:query];
            CXMLDocument *parser = [[[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:nil] autorelease];
    
            NSDictionary *namespaceMedia = [NSDictionary dictionaryWithObject:@"http://xml.weather.yahoo.com/ns/rss/1.0" forKey:@"yweather"];
            NSArray *nodes = [parser nodesForXPath:@"//channel" error:nil];
    
            for (CXMLNode *node in nodes) {
                if ([node kind] == CXMLElementKind)
                {
                    CXMLElement *element = (CXMLElement *)node;
                    for(int i=0;i<[element childCount];i++)
                    {
                        NSString *strKey = [[element childAtIndex:i] name];
                        if([strKey isEqual:@"location"])
                        {
                            location = [self stringForXPath:@"@city" ofNode:[element childAtIndex:i] withNameSpace:namespaceMedia];
                        }
                        else if([strKey isEqual:@"item"])
                        {
                            NSArray *nodeItem = [element nodesForXPath:@"//item" error:nil];
                            CXMLElement *elementItem = [nodeItem objectAtIndex:0];
                            for(int j=0;j<[elementItem childCount];j++){
                                NSString *strKeyItem = [[elementItem childAtIndex:j] name];
                                if([strKeyItem isEqual:@"condition"]){
                                    condition =[self stringForXPath:@"@text" ofNode:[elementItem childAtIndex:j] withNameSpace:namespaceMedia];
                                    currentTemp = [[self stringForXPath:@"@temp" ofNode:[elementItem childAtIndex:j] withNameSpace:namespaceMedia] intValue];
                                }
                                else if([strKeyItem isEqual:@"forecast"])
                                {
                                    NSString *date = [self stringForXPath:@"@date" ofNode:[elementItem childAtIndex:j] withNameSpace:namespaceMedia];
                                    NSDate *curDate = [NSDate date];
                                    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
                                    dateFormatter.dateFormat = @"dd MMM yyyy";
                                    NSString *strCurDate = [dateFormatter stringFromDate:curDate];
                                    if([date isEqual:strCurDate])
                                    {
                                        highTemp = [[self stringForXPath:@"@high" ofNode:[elementItem childAtIndex:j] withNameSpace:namespaceMedia] intValue];
                                        lowTemp = [[self stringForXPath:@"@low" ofNode:[elementItem childAtIndex:j] withNameSpace:namespaceMedia] intValue];
                                    }
                                }
                            }
                        }
                        else
                            continue;
                    }
    
                }
          }
        }
        return self;
    }
    

    This is how I get the weather Details. In my case I only needed Location,Condition,High Temp,Low Temp,Current Temp.