小序:
本文包括三个内容:
①:定位功能的实现
②:知道城市名拿到经纬度
③:根据经纬度拿到日出日落时间
关于定位我们要添加#import <CoreLocation/CoreLocation.h>
头文件
一、定位功能
先创建这两个对象(这里是全局私有):
CLLocationManager* _manager //定位管理 CLGeocoder *_geocoder //地理编码
下面直接上代码了
//定位
//1.创建定位管理对象
_manager=[[CLLocationManager alloc]init];
_geocoder=[[CLGeocoder alloc]init];
//2.设置属性 distanceFilter、desiredAccuracy
_manager.distanceFilter=kCLDistanceFilterNone;//实时更新定位位置
_manager.desiredAccuracy=kCLLocationAccuracyBest;//定位精确度
if([_manager respondsToSelector:@selector(requestAlwaysAuthorization)])
{
[_manager requestAlwaysAuthorization];
}
//该模式是抵抗程序在后台被杀,申明不能够被暂停
_manager.pausesLocationUpdatesAutomatically=NO;
//3.设置代理 我们要遵循代理:<CLLocationManagerDelegate>
_manager.delegate=self;
//4.开始定位
[_manager startUpdatingLocation];
//5.获取朝向
[_manager startUpdatingHeading];
下面是代理方法
#pragma mark -- delegate
//定位失败时调用的方法
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError* )error
{
NSLog(@"%@",error);
}
//定位成功调用的的方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray* )locations
{
if(locations.count>0)
{
// 获取位置信息
CLLocation *loc=[locations lastObject];
// 获取经纬度的结构体
CLLocationCoordinate2D coor=loc.coordinate;
CLLocation *location=[[CLLocation alloc]initWithLatitude:coor.latitude longitude:coor.longitude];
[_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray* placemarks, NSError *error) {
CLPlacemark *pmark=[placemarks firstObject];
/*//地址字典 这里都是关于位置的一些属性 我们拿到我们需要的信息 最后我打印的是一个完整的信息
NSLog(@"%@",pmark.addressDictionary);
位置信息:经纬度
NSString *city=pmark.location;
拿到城市 直辖市拿不到
NSString *city=pmark.locality;
拿到所在区
NSString *city=pmark.subLocality;
拿到所造号
NSString *city=pmark.subThoroughfare;
多少路多少号
NSLog(@"%@",pmark.name);
所在省份
NSString *city=pmark.administrativeArea;
*/
NSString *city=pmark.addressDictionary[@"City"];
// if([city hasSuffix:@"市辖区"])
// city=[city substringToIndex:city.length-3];
// if([city hasSuffix:@"市"])
// city=[city substringToIndex:city.length-1];
NSLog(@"城市:%@",city);
for (CLPlacemark * placemark in placemarks) {
NSDictionary *test = [placemark addressDictionary];
// Country(国家) State(省份) City(城市) SubLocality(区)
NSLog(@"%@", [[test objectForKey:@"Country"] stringByAppendingFormat:[NSString stringWithFormat:@"%@%@%@%@",[test objectForKey:@"State"], [test objectForKey:@"City"],[test objectForKey:@"SubLocality"],[test objectForKey:@"Street"]]]);
}
}];
}
}
二、根据城市名拿到经纬度
还是直接上代码
//根据城市拿到经纬度
NSString *oreillyAddress = @"beijing";
CLGeocoder *myGeocoder = [[CLGeocoder alloc] init];
[myGeocoder geocodeAddressString:oreillyAddress completionHandler:^(NSArray *placemarks, NSError *error) {
if ([placemarks count] > 0 && error == nil) {
NSLog(@"Found %lu placemark(s).", (unsigned long)[placemarks count]);
CLPlacemark *firstPlacemark;
firstPlacemark = [placemarks objectAtIndex:0];
NSLog(@"Longitude = %f", firstPlacemark.location.coordinate.longitude);//经度
NSLog(@"Latitude = %f", firstPlacemark.location.coordinate.latitude);//纬度
三、根据经纬度算日出日落
就用上面那个方法拿到经纬度,算日出日落有一套算法 ,我这里也是用别人写好的类。这是代码位置。展示下使用的代码
//根据经纬度判断
double latitude = firstPlacemark.location.coordinate.latitude;
double longitude = firstPlacemark.location.coordinate.longitude;
NSDate * date=[NSDate date];
//这里的formatter是提前设定好的 也是我们需要展示的时间格式
//提前设置的属性:@property (nonatomic, strong) NSDateFormatter* formatter;
NSLog(@"当前时间%@",[self.formatter stringFromDate:date]);
NSDate* sunriseDate = RMSunCalculateSunrise(latitude, longitude, date, RMSunZenithOfficial);
if(sunriseDate == nil)
{
// This can occur in the extremes of the upper and lower hemispheres at certain times of year
NSLog(@"今天没有日出");
}
else
{
NSLog(@"日出:%@",[self.formatter stringFromDate:sunriseDate]);
}
NSDate* sunsetDate = RMSunCalculateSunset(latitude, longitude, date, RMSunZenithOfficial);
if(sunsetDate == nil)
{
// This can occur in the extremes of the upper and lower hemispheres at certain times of year
NSLog(@"今天没有日落") ;
}
else
{
NSLog(@"日落:%@",[self.formatter stringFromDate:sunsetDate]);
}
有什么问题可以一起交流哈。。