2014-07-01 5 views
8

Ich habe den aktuellen Standort basierend auf den Längen- und Breitengradwerten erhalten und dann habe ich auch mehrere Orte auf Google Map mit Annotation. Jetzt möchte ich die Längen- und Breitengradwerte basierend auf der Adresse (d. H. Straße, Stadt und Landkreis) erhalten. Benötigen Sie eine Anleitung, wie dies erreicht werden kann.Breiten- und Längengrad basierend auf Adresse mit Geocoder-Klasse in iOS

Bis jetzt ist es das, was ich versucht habe: -

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 
@synthesize streetField = _streetField, cityField = _cityField, countryField = _countryField, fetchCoordinatesButton = _fetchCoordinatesButton, nameLabel = _nameLabel, coordinatesLabel = _coordinatesLabel; 
@synthesize geocoder = _geocoder; 


- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 
    _streetField.delegate=self; 
    _cityField.delegate=self; 
    _countryField.delegate=self; 

    // Do any additional setup after loading the view, typically from a nib. 
} 

- (IBAction)fetchCoordinates:(id)sender { 
    NSLog(@"Fetch Coordinates"); 
    if (!self.geocoder) { 
      NSLog(@"Geocdoing"); 
     self.geocoder = [[CLGeocoder alloc] init]; 
    } 

    NSString *address = [NSString stringWithFormat:@"%@ %@ %@", self.streetField.text, self.cityField.text, self.countryField.text]; 
    NSLog(@"GET Addres%@",address); 

    self.fetchCoordinatesButton.enabled = NO; 

    [self.geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) { 
      NSLog(@"Fetch Gecodingaddress"); 
     if ([placemarks count] > 0) { 
      CLPlacemark *placemark = [placemarks objectAtIndex:0]; 

      NSLog(@"GET placemark%@",placemark); 

      CLLocation *location = placemark.location; 

      NSLog(@"GET location%@",location); 

      CLLocationCoordinate2D coordinate = location.coordinate; 


      self.coordinatesLabel.text = [NSString stringWithFormat:@"%f, %f", coordinate.latitude, coordinate.longitude]; 

      NSLog(@"CoordinatesLabel%@",self.coordinatesLabel.text); 


      if ([placemark.areasOfInterest count] > 0) { 
       NSString *areaOfInterest = [placemark.areasOfInterest objectAtIndex:0]; 
       self.nameLabel.text = areaOfInterest; 
       NSLog(@"NameLabe%@",self.nameLabel.text); 
      } 
     } 

     self.fetchCoordinatesButton.enabled = YES; 
    }]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
-(BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 
    return YES; 
} 
@end 

Above Code nicht den Spielraum geben Sie mir arbeitet und longitude.Need etwas Hilfe auf das, was ich falsch hier tun oder wenn ich fehle auf etwas.

Vielen Dank im Voraus.

+0

Verwenden Sie diesen Link es ist Hoffnung für Sie http://StackOverflow.com/Questions/21595538/Get-Latitude-and-Longitude-based- on-zip-using-geocoder-klasse-in-ios/21595688 # 21595688 –

+0

@ Anbu.Karthik Ich brauche Längen- und Breitengrad basierend auf der Adresse.Ihr Code basiert auf der Postleitzahl. Ich habe versucht, Sie Code Ich übergab meine Stadt Name und Land Name zu URL, aber es funktioniert nicht Bitte geben Sie mir eine Idee – user3792517

Antwort

21

EDIT:

Bevor diese Prüfung mit iOS8 updation mit

NSLocationAlwaysUsageDescription 
NSLocationWhenInUseUsageDescription 

Dieser für das Erhalten lat und lange basierten Benutzerbereich wie Straßennamen, Staatsnamen, Land.

-(CLLocationCoordinate2D) getLocationFromAddressString: (NSString*) addressStr { 
    double latitude = 0, longitude = 0; 
    NSString *esc_addr = [addressStr 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; 
    NSLog(@"View Controller get Location Logitute : %f",center.latitude); 
    NSLog(@"View Controller get Location Latitute : %f",center.longitude); 
    return center; 

} 

Aufruf der Methode, wie dies in viewDidLoad Verfahren oder irgendwo nach einem Projekt

[self getLocationFromAddressString:@"chennai"]; 

passiert dies nur in Ihrem Browser http://maps.google.com/maps/api/geocode/json?sensor=false&address=chennai

und werden Sie json-Format mit lat und lon haben

die uns Alter dieser Methode ....

CLLocationCoordinate2D center; 
     center=[self getLocationFromAddressString:@"uthangarai"]; 
     double latFrom=&center.latitude; 
     double lonFrom=&center.longitude; 

    NSLog(@"View Controller get Location Logitute : %f",latFrom); 
     NSLog(@"View Controller get Location Latitute : %f",lonFrom); 
+0

Danke für die Antwort, aber wo es Adresse – user3792517

+0

übergeben Sie einfach Ihre Stadt Name ... – karthikeyan

+0

.und es wird ein JSON-Format und es zeigt formatierte Adresse mit Ihrer Stadt, Land – karthikeyan

0
- (IBAction)forwardButton:(id)sender 
{ 
    if([self.address.text length]) 
    { 
     NSString *place = self.address.text; 
     CLGeocoder *geocoder = [[CLGeocoder alloc] init]; 
     __unsafe_unretained RTGeoCoderViewController *weakSelf = self; 
     [geocoder geocodeAddressString:place completionHandler:^(NSArray* placemarks, NSError* error) 
     { 
      NSLog(@"completed"); 
      if (error) 
      { 
       NSLog(@"error = %@", error); 
       dispatch_async(dispatch_get_main_queue(), 
           ^{ 
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[self errorMessage:error.code] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; 
            [alert show]; 
           }); 
      } 
      else 
      { 
       NSLog(@"%@",placemarks); 
      } 
     }]; 
    } 
} 
3

die Sie interessieren,

NSString *address = [NSString stringWithFormat:@"%@,%@,%@", self.streetField.text, self.cityField.text,self.countryField.text];  

[self.geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) 
{ 
    if(!error) 
    { 
     CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
     NSLog(@"%f",placemark.location.coordinate.latitude); 
     NSLog(@"%f",placemark.location.coordinate.longitude); 
     NSLog(@"%@",[NSString stringWithFormat:@"%@",[placemark description]]); 
    } 
    else 
    { 
     NSLog(@"There was a forward geocoding error\n%@",[error localizedDescription]); 
    } 
} 
]; 
+0

Ich bin nicht Geting Breite und Länge – user3792517

+0

Ich bekomme hier, oder versuchen Sie mit Google API "http: //maps.googleapis. com/karten/api/geocode/json? sensor = wahr & adresse = ". Fügen Sie Ihre Adresszeichenfolge hinzu, indem Sie Leerzeichen durch + in die obige API ersetzen und die JSON-Antwort analysieren – abhi

8

Jemand sucht Swift 2.0-Lösung kann unter Verwendung:

let address = "1 Infinite Loop, CA, USA" 
     let geocoder = CLGeocoder() 

     geocoder.geocodeAddressString(address, completionHandler: {(placemarks, error) -> Void in 
      if((error) != nil){ 
       print("Error", error) 
      } 
      if let placemark = placemarks?.first { 
       let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate 
       coordinates.latitude 
       coordinates.longitude 
       print("lat", coordinates.latitude) 
       print("long", coordinates.longitude) 


      } 
     }) 
0

Versuchen Sie, diese

- (void)getAddressFromAdrress:(NSString *)address withCompletationHandle:(void (^)(NSDictionary *))completationHandler { 


       CLGeocoder *geoCoder = [[CLGeocoder alloc] init]; 
      //Get the address through geoCoder 
      [geoCoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) { 


       if ([placemarks count] > 0 && !error) { 

        //get the address from placemark 
        CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
        NSString *locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "]; 
        CLLocation *location = placemark.location; 
        CLLocationCoordinate2D coordinate = location.coordinate; 
        _latitudeUserLocation = coordinate.latitude; 
        _longitudeUserLocation = coordinate.longitude; 
        NSString *postalCode = placemark.addressDictionary[(NSString*)kABPersonAddressZIPKey]; 
        if (postalCode == nil) postalCode = @""; 
        if (locatedAt == nil) locatedAt = @""; 
        NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
               postalCode    ,kPostalCode, 
               locatedAt    ,kFullAddress, 
               nil]; 
        completationHandler(dictionary); 

       } else { 

        completationHandler(nil); 
       } 
      }]; 
} 
4

Swift

public func getLocationFromAddress(address : String) -> CLLocationCoordinate2D { 
     var lat : Double = 0.0 
     var lon : Double = 0.0 

     do { 

      let url = String(format: "https://maps.google.com/maps/api/geocode/json?sensor=false&address=%@", (address.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)!)) 
      let result = try Data(contentsOf: URL(string: url)!) 
      let json = JSON(data: result) 

      lat = json["results"][0]["geometry"]["location"]["lat"].doubleValue 
      lon = json["results"][0]["geometry"]["location"]["lng"].doubleValue 

     } 
     catch let error{ 
      print(error) 
     } 

     return CLLocationCoordinate2D(latitude: lat, longitude: lon) 
    } 

I verwendet SwiftyJSON aber Sie können die JSON-Antwort analysieren, wie Sie wollen

0

Mit Dashrath Code können Sie die Adresszeichenfolge verwenden, um eine GMSMarker

(in schnellen 4) hinzufügen

func getLocationFromAddress(address : String, localName: String) { 
     let geocoder = CLGeocoder() 
     var coordinates = CLLocationCoordinate2D() 
     geocoder.geocodeAddressString(address, completionHandler: {(placemarks, error) -> Void in 
      if((error) != nil){ 
       print("Error", error!) 
      } 
      if let placemark = placemarks?.first { 
       coordinates = placemark.location!.coordinate 
       let marker = GMSMarker(position: coordinates) 
       marker.title = localName 
       marker.map = self.mapView 
      } 
     }) 
    } 
Verwandte Themen