iOS怎样获取当前手机的地理位置和经纬度
2017-02-17 本文已影响6503人
辛小二
目录
- app常见需求(获取当前手机经纬度 地址 精确到省市和街道)并且需要通过经纬度计算出当前位置距离某个商店(确认经纬度的商店)距离是多少?
解答如下:
1、导入coreLocation库
导入CoreLocation2、需要在info.plist里设置权限
//允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription=YES
//允许永久使用GPS的描述
NSLocationWhenInUseUsageDescription=YES
info.plist设置
3、导入头文件和设置代理
导入头文件和设置代理4、初始化CLLocationManager
初始化CLLocationManager
5、设置代理方法
#pragma mark CoreLocation deleagte (定位失败)
/*定位失败则执行此代理方法*/
/*定位失败弹出提示窗,点击打开定位按钮 按钮,会打开系统设置,提示打开定位服务*/
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
/*设置提示提示用户打开定位服务*/
UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"允许\"定位\"提示" message:@"请在设置中打开定位" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction * ok =[UIAlertAction actionWithTitle:@"打开定位" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
/*打开定位设置*/
NSURL * settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication]openURL:settingsURL];
}];
UIAlertAction * cacel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}];
[alert addAction:ok];
[alert addAction:cacel];
[self presentViewController:alert animated:YES completion:nil];
}
/*定位成功后则执行此代理方法*/
#pragma mark 定位成功
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
[_locationManager stopUpdatingLocation];
/*旧值*/
CLLocation * currentLocation = [locations lastObject];
CLGeocoder * geoCoder = [[CLGeocoder alloc]init];
/*打印当前经纬度*/
NSLog(@"%f%f",currentLocation.coordinate.latitude,currentLocation.coordinate.longitude);
/*地理反编码 -- 可以根据地理位置(经纬度)确认位置信息 (街道、门牌)*/
[geoCoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (placemarks.count >0) {
CLPlacemark * placeMark = placemarks[0];
currentCity = placeMark.locality;
if (!currentCity) {
currentCity = @"无法定位当前城市";
}
/*看需求定义一个全局变量来接受赋值*/
NSLog(@"%@",placeMark.country);/*当前国家*/
NSLog(@"%@",currentCity);/*当前城市*/
NSLog(@"%@",placeMark.subLocality);/*当前位置*/
NSLog(@"%@",placeMark.thoroughfare)/*当前街道*/
NSLog(@"%@",placeMark.name);/*具体地址 ** 市 ** 区** 街道*/
/*根据经纬度判断当前距离*/
/*这个地方需要double转字符串赋值到label上面*/
self.headView.Distance.text =HZString(@"距您%.1fkm",[self getDistance:currentLocation.coordinate.latitude lng1:currentLocation.coordinate.longitude lat2:weiDouble lng2:jingDouble]);
}
else if (error == nil&&placemarks.count == 0){
NSLog(@"没有地址返回");
}
else if (error){
NSLog(@"location error:%@",error);
}
}];
}
}
下面开始通过经纬度计算当前手机位置和接口获取到的经纬度两者之间计算距离的方法
答:首先上面这个需求你需要知道四个属性,分别是当前位置的经度纬度以及接口获取的精度纬度,上面解析出来当前的经纬度就是
//将经度显示到label上
/*打印当前经纬度*/
NSLog(@"%f%f",currentLocation.coordinate.latitude,currentLocation.coordinate.longitude);
那么接口获取到的一般都是字符串类型的,那么其实经度和纬度是无法用字符串来识别的,我们只能用字符串转换成double来让系统识别
double类型 转换截图好了到现在为止我们将需要的四个属性都找到了,下面我们开始计算,需要声明两个实例方法,然后进行计算
调用实例方法
[self getDistance:newLocation.coordinate.latitude lng1:newLocation.coordinate.longitude lat2:weiDouble lng2:jingDouble];
实现部分
#pragma mark 通过经纬度计算两地距离
- (float)getDistance:(float)lat1 lng1:(float)lng1 lat2:(float)lat2 lng2:(float)lng2
{
//地球半径
int R = 6378137;
//将角度转为弧度
float radLat1 = [self radians:lat1];
float radLat2 = [self radians:lat2];
float radLng1 = [self radians:lng1];
float radLng2 = [self radians:lng2];
//结果
float s = acos(cos(radLat1)*cos(radLat2)*cos(radLng1-radLng2)+sin(radLat1)*sin(radLat2))*R;
//精度
s = round(s* 10000)/10000;
return round(s);
}
- (float)radians:(float)degrees{
return (degrees*3.14159265)/180.0;
}
以上代码就能实现获取当前位置(省市街道和经纬度)以及计算经纬度和经纬度之前的距离的方法,喜欢的可以点赞。谢谢。
本人个人微信公众号地址(喜欢记得关注😯)
辛小二个人微信公众号地址