在iOS中使用Geocoder类获取基于地址的经度和纬度

我得到了基于经度和纬度值的当前位置,然后我也使用Annotation在Google地图上find了多个地方。 现在我想根据地址(即街道,市县)来获取经纬度的值,需要怎样的指导才能实现。

直到现在,这是我曾经试过的:

#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 

上面的代码不是给我经纬度的工作。需要一些帮助我在这里做错了什么,或者如果我失去了一些东西。

提前致谢。

编辑

在iOS8更新中使用此检查之前

 NSLocationAlwaysUsageDescription NSLocationWhenInUseUsageDescription 

这是为了获得像街道名称,国家名称,国家经纬度的用户区。

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

在viewdidload方法或根据您的项目在某处调用像这样的方法

 [self getLocationFromAddressString:@"chennai"]; 

只需在您的浏览器中通过这个http://maps.google.com/maps/api/geocode/json?sensor=false&address=chennai

你将有拉斯和lon的json格式

 http://maps.google.com/maps/api/geocode/json?sensor=false&address=@"your city name here" NSString *address = [NSString stringWithFormat:@"http://maps.google.com/maps/api/geocode/json?sensor=false&address=%@ %@ %@", self.streetField.text, self.cityField.text, self.countryField.text]; 

这种方法的用法….

 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); 

有人正在寻找Swift 2.0解决scheme可以使用如下:

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

迅速

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

我使用了SwiftyJSON,但是您可以根据需要parsingJSON响应

尝试这个,

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

尝试这个

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

使用Dashrath代码,您可以使用地址string添加GMSMarker

(在迅速4)

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