tags:

views:

2320

answers:

6

Hi there, this is my first question on stackoverflow. any one know how to get lang\long from full address (street,city ecc..) inserted by the user using the iphone sdk 3.x.

thanks guys

+3  A: 

You can use Google Geocoding for this. It is as simple as getting data through HTTP and parsing it (it can return JSON KML, XML, CSV).

Valerii Hiora
+2  A: 

The following method does what you asked for. You need to insert your Google maps key for this to work correctly.

- (CLLocationCoordinate2D) geoCodeUsingAddress:(NSString *)address{

    int code = -1;
    int accuracy = -1;
    float latitude = 0.0f;
    float longitude = 0.0f;
    CLLocationCoordinate2D center;

    // setup maps api key
    NSString * MAPS_API_KEY = @"YOUR GOOGLE MAPS KEY HERE";

    NSString *escaped_address =  [address stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
    // Contact Google and make a geocoding request
    NSString *requestString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv&oe=utf8&key=%@&sensor=false&gl=it", escaped_address, MAPS_API_KEY];
    NSURL *url = [NSURL URLWithString:requestString];

    NSString *result = [NSString stringWithContentsOfURL: url encoding: NSUTF8StringEncoding error:NULL];
     if(result){
      // we got a result from the server, now parse it
      NSScanner *scanner = [NSScanner scannerWithString:result];
      [scanner scanInt:&code];
      if(code == 200){
       // everything went off smoothly
       [scanner scanString:@"," intoString:nil];
       [scanner scanInt:&accuracy];

       //NSLog(@"Accuracy: %d", accuracy);

       [scanner scanString:@"," intoString:nil];
       [scanner scanFloat:&latitude];
       [scanner scanString:@"," intoString:nil];
       [scanner scanFloat:&longitude];


       center.latitude = latitude;
       center.longitude = longitude;

       return center;


      }
      else{
       // the server answer was not the one we expected
       UIAlertView *alert = [[[UIAlertView alloc] 
               initWithTitle: @"Warning" 
               message:@"Connection to Google Maps failed"
               delegate:nil
               cancelButtonTitle:nil 
               otherButtonTitles:@"OK", nil] autorelease];

       [alert show];

       center.latitude = 0.0f;
       center.longitude = 0.0f;

       return center;


      }

     }
     else{
      // no result back from the server
      UIAlertView *alert = [[[UIAlertView alloc] 
              initWithTitle: @"Warning" 
              message:@"Connection to Google Maps failed"
              delegate:nil
              cancelButtonTitle:nil 
              otherButtonTitles:@"OK", nil] autorelease];

      [alert show];

      center.latitude = 0.0f;
      center.longitude = 0.0f;

      return center;
     }

    }

        center.latitude = 0.0f;
        center.longitude = 0.0f;

        return center;

}
unforgiven
A: 

There's also CoreGeoLocation, which wraps up the functionality in a framework (Mac) or static library (iPhone). Supports lookups through Google or Yahoo, if you have a preference for one over the other.

http://github.com/thekarladam/CoreGeoLocation

Jablair
A: 

Nice Post.... Thankx Dude. Its Help me a lot.

Asfak
A: 

For the google map key solution, as described by unforgiven above, doesn't one has to make the app free? As per google terms & conditions: 9.1 Free, Public Accessibility to Your Maps API Implementation. Your Maps API Implementation must be generally accessible to users without charge.

With map kit in sdk 3.0 this is easily done using the SDK. See apple's manuals or follow : http://www.devworld.apple.com/iphone/program/sdk/maps.html

gammapoint
A: 

Here's an updated, more compact, version of unforgiven's code, which uses the latest v3 API:

- (CLLocationCoordinate2D) geoCodeUsingAddress:(NSString *)address
{
    double latitude = 0, longitude = 0;
    NSString *esc_addr =  [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSString *req = [NSString stringWithFormat:@"http://maps.google.com/maps/api/geocode/json?sensor=false&address=%@", esc_addr];
    NSString *result = [NSString stringWithContentsOfURL:[NSURL URLWithString:req] encoding:NSUTF8StringEncoding error:NULL];
    if (result) {
        NSScanner *scanner = [NSScanner scannerWithString:result];
        if ([scanner scanUpToString:@"\"lat\":" intoString:nil] && [scanner scanString:@"\"lat\":" intoString:nil]) {
            [scanner scanDouble:&latitude];
            if ([scanner scanUpToString:@"\"lng\":" intoString:nil] && [scanner scanString:@"\"lng\":" intoString:nil]) {
                [scanner scanDouble:&longitude];
            }
        }
    }
    CLLocationCoordinate2D center;
    center.latitude = latitude;
    center.longitude = longitude;
    return center;
}

It makes the assumption that the coordinates for "location" come first, e.g. before those for "viewport", because it just takes the first coords it finds under the "lng" and "lat" keys. Feel free to use a proper JSON scanner (e.g. SBJSON) if you are worried about this simple scanning technique used here.

Thomas Tempelmann