从地址获取纬度/经度

如何使用iPhone SDK 3.x从用户input的完整地址(街道,城市等)获取经度和纬度?

这是一个更新,更紧凑的unforgiven代码版本,它使用最新的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; } 

它假设“位置”的坐标是第一位的,例如在“视口”之前,因为它只是在“lng”和“lat”键下find第一个坐标。 如果您担心这里使用的简单扫描技术,请随意使用适当的JSON扫描器(例如SBJSON)。

您可以使用Google地理编码。 就像通过HTTP获取数据并parsing数据一样简单(它可以返回JSON KML,XML,CSV)。

这里有一个类似的解决scheme来获取谷歌的经纬度。 注意:这个例子使用了SBJson库,你可以在github上find它:

 + (CLLocationCoordinate2D) geoCodeUsingAddress: (NSString *) address { CLLocationCoordinate2D myLocation; // -- modified from the stackoverflow page - we use the SBJson parser instead of the string scanner -- NSString *esc_addr = [address stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; NSString *req = [NSString stringWithFormat: @"http://maps.google.com/maps/api/geocode/json?sensor=false&address=%@", esc_addr]; NSDictionary *googleResponse = [[NSString stringWithContentsOfURL: [NSURL URLWithString: req] encoding: NSUTF8StringEncoding error: NULL] JSONValue]; NSDictionary *resultsDict = [googleResponse valueForKey: @"results"]; // get the results dictionary NSDictionary *geometryDict = [ resultsDict valueForKey: @"geometry"]; // geometry dictionary within the results dictionary NSDictionary *locationDict = [ geometryDict valueForKey: @"location"]; // location dictionary within the geometry dictionary // -- you should be able to strip the latitude & longitude from google's location information (while understanding what the json parser returns) -- DLog (@"-- returning latitude & longitude from google --"); NSArray *latArray = [locationDict valueForKey: @"lat"]; NSString *latString = [latArray lastObject]; // (one element) array entries provided by the json parser NSArray *lngArray = [locationDict valueForKey: @"lng"]; NSString *lngString = [lngArray lastObject]; // (one element) array entries provided by the json parser myLocation.latitude = [latString doubleValue]; // the json parser uses NSArrays which don't support "doubleValue" myLocation.longitude = [lngString doubleValue]; return myLocation; } 

更新版本,使用iOS JSON:

 - (CLLocationCoordinate2D)getLocation:(NSString *)address { CLLocationCoordinate2D center; NSString *esc_addr = [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *req = [NSString stringWithFormat:@"http://maps.google.com/maps/api/geocode/json?sensor=false&address=%@", esc_addr]; NSData *responseData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:req]]; NSError *error; NSMutableDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:nil error:&error]; if( error ) { NSLog(@"%@", [error localizedDescription]); center.latitude = 0; center.longitude = 0; return center; } else { NSArray *results = (NSArray *) responseDictionary[@"results"]; NSDictionary *firstItem = (NSDictionary *) [results objectAtIndex:0]; NSDictionary *geometry = (NSDictionary *) [firstItem objectForKey:@"geometry"]; NSDictionary *location = (NSDictionary *) [geometry objectForKey:@"location"]; NSNumber *lat = (NSNumber *) [location objectForKey:@"lat"]; NSNumber *lng = (NSNumber *) [location objectForKey:@"lng"]; center.latitude = [lat doubleValue]; center.longitude = [lng doubleValue]; return center; } } 

下面的方法做你所要求的。 您需要插入Google地图密钥才能正常工作。

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

还有CoreGeoLocation,它将框架(Mac)或静态库(iPhone)中的function封装起来。 支持通过谷歌或雅虎查找,如果你有一个优先select。

http://github.com/thekarladam/CoreGeoLocation

对于谷歌地图的关键解决scheme,正如上面所说的那样,是不是应该让应用程序免费? 根据谷歌条款和条件:9.1免费,您的地图API实施的公共可访问性。 用户一般都可以免费使用您的Maps API实施。

使用sdk 3.0中的map套件,使用SDK很容易。 请参阅苹果手册或访问http://www.devworld.apple.com/iphone/program/sdk/maps.html

 - (void)viewDidLoad { app=(AppDelegate *)[[UIApplication sharedApplication] delegate]; NSLog(@"%@", app.str_address); NSLog(@"internet connect"); NSString *Str_address=_txt_zipcode.text; double latitude1 = 0, longitude1 = 0; NSString *esc_addr = [ Str_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:&latitude1]; if ([scanner scanUpToString:@"\"lng\" :" intoString:nil] && [scanner scanString:@"\"lng\" :" intoString:nil]) { [scanner scanDouble:&longitude1]; } } } //in #.hfile // CLLocationCoordinate2D lat; // CLLocationCoordinate2D lon; // float address_latitude; // float address_longitude; lat.latitude=latitude1; lon.longitude=longitude1; address_latitude=lat.latitude; address_longitude=lon.longitude; } 
 func geoCodeUsingAddress(address: NSString) -> CLLocationCoordinate2D { var latitude: Double = 0 var longitude: Double = 0 let addressstr : NSString = "http://maps.google.com/maps/api/geocode/json?sensor=false&address=\(address)" as NSString let urlStr = addressstr.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) let searchURL: NSURL = NSURL(string: urlStr! as String)! do { let newdata = try Data(contentsOf: searchURL as URL) if let responseDictionary = try JSONSerialization.jsonObject(with: newdata, options: []) as? NSDictionary { print(responseDictionary) let array = responseDictionary.object(forKey: "results") as! NSArray let dic = array[0] as! NSDictionary let locationDic = (dic.object(forKey: "geometry") as! NSDictionary).object(forKey: "location") as! NSDictionary latitude = locationDic.object(forKey: "lat") as! Double longitude = locationDic.object(forKey: "lng") as! Double }} catch { } var center = CLLocationCoordinate2D() center.latitude = latitude center.longitude = longitude return center }