iPhone – 从Latitude和Longtiude获取城市名称
我想在我的iPhone应用程序中获取我的当前城市名称。
我目前正在使用CLLocationManager获取经度和纬度,比我将我的坐标传递到CLGeocoder。
CLGeocoder * geoCoder = [[CLGeocoder alloc] init]; [geoCoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { for (CLPlacemark * placemark in placemarks) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Current City" message:[NSString stringWithFormat:@"Your Current City:%@",[placemark locality]] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Cancel", nil]; [alert show]; } }];
这在iOS 5.0中工作正常,但不在iOS 4.3中工作。
另外,我开始使用Google Web服务
-(void)findLocationFor:(NSString *)latitudeStr andLontitude:(NSString *)longtitudeStr{ if ([self connectedToWiFi]){ float latitude = [latitudeStr floatValue]; float longitude = [longtitudeStr floatValue]; NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat:@"%f,%f", latitude, longitude], @"latlng", nil]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://maps.googleapis.com/maps/api/geocode/json"]]; [parameters setValue:@"true" forKey:@"sensor"]; [parameters setValue:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode] forKey:@"language"]; NSMutableArray *paramStringsArray = [NSMutableArray arrayWithCapacity:[[parameters allKeys] count]]; for(NSString *key in [parameters allKeys]) { NSObject *paramValue = [parameters valueForKey:key]; [paramStringsArray addObject:[NSString stringWithFormat:@"%@=%@", key, paramValue]]; } NSString *paramsString = [paramStringsArray componentsJoinedByString:@"&"]; NSString *baseAddress = request.URL.absoluteString; baseAddress = [baseAddress stringByAppendingFormat:@"?%@", paramsString]; [request setURL:[NSURL URLWithString:baseAddress]]; NSError *error = nil; NSURLResponse *response = nil; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if (response == nil) { if (error != nil) { } } else { NSDictionary *responseDict = [returnData objectFromJSONData]; NSArray *resultsArray = [responseDict valueForKey:@"results"]; NSMutableArray *placemarksArray = [NSMutableArray arrayWithCapacity:[resultsArray count]]; for(NSDictionary *placemarkDict in resultsArray){ NSDictionary *coordinateDict = [[placemarkDict valueForKey:@"geometry"] valueForKey:@"location"]; float lat = [[coordinateDict valueForKey:@"lat"] floatValue]; float lng = [[coordinateDict valueForKey:@"lng"] floatValue]; NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setObject:[NSString stringWithFormat:@"%.f",lat] forKey:@"latitude"]; [dict setObject:[NSString stringWithFormat:@"%.f",lng] forKey:@"longitude"]; [dict setObject:[placemarkDict objectForKey:@"formatted_address"] forKey:@"address"]; [placemarksArray addObject:dict]; [dict release]; } NSDictionary *placemark = [placemarksArray objectAtIndex:0]; } } }
但是,我得到的回应太长,意味着我仍然无法得到城市名称,因为在某些情况下,这个networking服务提供所有其他信息关于坐标期望城市名称。
任何人都可以帮我吗?
根据文档CLGeocoder不能在iOS5下工作。 你需要采取另一条路线来支持iOS4和iOS5。
你可以看看MKReverseGeocoder ,但是它在iOS5中被弃用,但仍然可以达到目的。 为了确认,你可以检查所谓的问题
+(NSString *)getAddressFromLatLon:(double)pdblLatitude withLongitude:(double)pdblLongitude { NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%f,%f&output=csv",pdblLatitude, pdblLongitude]; NSError* error; NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString] encoding:NSASCIIStringEncoding error:&error]; locationString = [locationString stringByReplacingOccurrencesOfString:@"\"" withString:@""]; return [locationString substringFromIndex:6]; }
您可以使用此function从经度,纬度获取地址。 你可以根据需要改变。 我们把它作为Class方法,所以我们可以直接使用它
NSString *strAddressFromLatLong = [CLassName getAddressFromLatLon:37.484848 withLongitude:74.48489];
编辑
请停止使用上述function,因为它已停止工作评论(未经我testing)报告。 我build议开始使用SVGeocoder
我正在使用这个并获得邮政编码和城市名称。 修改了Janak添加的方法。
- (void) getAddressFromLatLon:(CLLocation *)bestLocation { NSLog(@"%f %f", bestLocation.coordinate.latitude, bestLocation.coordinate.longitude); CLGeocoder *geocoder = [[CLGeocoder alloc] init] ; [geocoder reverseGeocodeLocation:bestLocation completionHandler:^(NSArray *placemarks, NSError *error) { if (error){ NSLog(@"Geocode failed with error: %@", error); return; } CLPlacemark *placemark = [placemarks objectAtIndex:0]; NSLog(@"placemark.ISOcountryCode %@",placemark.ISOcountryCode); NSLog(@"locality %@",placemark.locality); NSLog(@"postalCode %@",placemark.postalCode); }]; }
这个对我有用 :)
CLGeocoder *ceo = [[CLGeocoder alloc]init]; CLLocation *loc = [[CLLocation alloc]initWithLatitude:26.93611 longitude:26.93611]; [ceo reverseGeocodeLocation: loc completionHandler: ^(NSArray *placemarks, NSError *error) { CLPlacemark *placemark = [placemarks objectAtIndex:0]; NSLog(@"placemark %@",placemark); //String to hold address NSString *locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "]; NSLog(@"addressDictionary %@", placemark.addressDictionary); NSLog(@"placemark %@",placemark.region); NSLog(@"placemark %@",placemark.country); // Give Country Name NSLog(@"placemark %@",placemark.locality); // Extract the city name NSLog(@"location %@",placemark.name); NSLog(@"location %@",placemark.ocean); NSLog(@"location %@",placemark.postalCode); NSLog(@"location %@",placemark.subLocality); NSLog(@"location %@",placemark.location); //Print the location to console NSLog(@"I am currently at %@",locatedAt); }];
//Place below parser code where you are reading latlng and place your latlng in the url NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:[NSURL URLWithString:@"http://maps.googleapis.com/maps/api/geocode/xml?latlng=40.714224,-73.961452&sensor=false"]]; [parser setDelegate:self]; [parser parse]; // Below are the delegates which will get you the exact address easyly -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if([elementName isEqualToString:@"formatted_address"]){ got = YES; //got is a BOOL } } -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if(got){ NSLog(@"the address is = %@",string); } } -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ } //what we are doing is using xmlparser to parse the data which we get through the google map api copy above link and use in browser you will see the xml data brought
对不起,我英文不好,希望能帮到你
试试这个请求在这里你会发现所有关于当前位置,街道/城市/地区名称,门牌号码的数据,但只要你的要求粘贴这个。
NSString *urlString = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=false",pdblLatitude, pdblLongitude]; NSError* error; NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString] encoding:NSASCIIStringEncoding error:&error]; NSData *data = [locationString dataUsingEncoding:NSUTF8StringEncoding]; id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSDictionary *dic = [[json objectForKey:kResults] objectAtIndex:0]; NSString *cityName = [[[dic objectForKey:@"address_components"] objectAtIndex:1] objectForKey:@"long_name"];
这很好,为我工作。
我正在使用CLLocationManager获取经度和纬度,并将我的坐标传递给CLGeocoder。
import @corelocation and for getting city,country #import <AddressBook/AddressBook.h> -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation *location=[locations lastObject]; CLGeocoder *geocoder=[[CLGeocoder alloc]init]; CLLocationCoordinate2D coord; coord.longitude = location.coordinate.longitude; coord.latitude = location.coordinate.latitude; // or a one shot fill coord = [location coordinate]; NSLog(@"longitude value%f", coord.longitude); NSLog(@"latitude value%f", coord.latitude); [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { CLPlacemark *placemark = placemarks[0]; NSDictionary *addressDictionary = [placemark addressDictionary]; city = addressDictionary[(NSString *)kABPersonAddressCityKey]; stateloc = addressDictionary[(NSString *)kABPersonAddressStateKey]; country = placemark.country; NSLog(@"city%@/state%@/country%@",city,stateloc,country); [self getImagesFromServer:city]; }]; [self stopSignificantChangesUpdates]; } - (void)stopSignificantChangesUpdates { [self.locationManager stopUpdatingLocation]; self.locationManager = nil; }
- (void)reverseGeocode:(CLLocation *)location { CLGeocoder *geocoder = [[CLGeocoder alloc] init]; [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { NSLog(@"Finding address"); if (error) { NSLog(@"Error %@", error.description); } else { CLPlacemark *placemark = [placemarks lastObject]; self.myAddress.text = [NSString stringWithFormat:@"%@", ABCreateStringWithAddressDictionary(placemark.addressDictionary, NO)]; } }]; }
我改进了@Constantin Saulenco很好的答案 – json的结果并不总是以相同的顺序排列 – 所以城市并不总是处于同一个索引 – 这个函数将会search正确的结果。 也添加了国家。
NSString *urlString = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=false",location.coordinate.latitude, location.coordinate.longitude]; NSError* error; NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString] encoding:NSASCIIStringEncoding error:&error]; NSData *data = [locationString dataUsingEncoding:NSUTF8StringEncoding]; id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSDictionary *dic = [[json objectForKey:@"results"] objectAtIndex:0]; NSArray* arr = [dic objectForKey:@"address_components"]; //Iterate each result of address components - find locality and country NSString *cityName; NSString *countryName; for (NSDictionary* d in arr) { NSArray* typesArr = [d objectForKey:@"types"]; NSString* firstType = [typesArr objectAtIndex:0]; if([firstType isEqualToString:@"locality"]) cityName = [d objectForKey:@"long_name"]; if([firstType isEqualToString:@"country"]) countryName = [d objectForKey:@"long_name"]; } NSString* locationFinal = [NSString stringWithFormat:@"%@,%@",cityName,countryName];
我发现这个代码,它为我工作: https : //gist.github.com/flyworld/4222448 。
只需将placemark.ISOcountryCode
更改为placemark.locality
。
func getDataCity(tmpLat:Double,tmpLong:Double){
let tmpCLGeocoder = CLGeocoder.init() if tmpLat > 0 , tmpLong > 0 { let tmpDataLoc = CLLocation.init(latitude: tmpLat, longitude: tmpLong) tmpCLGeocoder.reverseGeocodeLocation(tmpDataLoc, completionHandler: {(placemarks,error) in guard let tmpPlacemarks = placemarks else{ return } let placeMark = tmpPlacemarks[0] as CLPlacemark guard let strLocality = placeMark.locality else{ return } // strLocality is your city guard let strSubLocality = placeMark.subLocality else{ return } // strSubLocality is your are of city }) } }