文档章节

iOS中的定位

D
 Dumplings
发布于 2016/05/16 17:37
字数 893
阅读 28
收藏 1

地理编码 与 反地理编码:

#import "ViewController.h"
//先引入库
#import <CoreLocation/CoreLocation.h>

@interface ViewController ()

//创建一个CLGeocoder
@property (nonatomic, strong) CLGeocoder *geocoder;

#pragma mark - 地理编码
//在界面上创建控件
- (IBAction)geocode;
@property (weak, nonatomic) IBOutlet UITextField *addressField;
@property (weak, nonatomic) IBOutlet UILabel *longitudeLabel;
@property (weak, nonatomic) IBOutlet UILabel *latitudeLabel;
@property (weak, nonatomic) IBOutlet UILabel *detailAddressLabel;

#pragma mark - 反地理编码
//在界面上创建控件
- (IBAction)reverseGeocode;
@property (weak, nonatomic) IBOutlet UITextField *longtitudeField;
@property (weak, nonatomic) IBOutlet UITextField *latitudeField;
@property (weak, nonatomic) IBOutlet UILabel *reverseDetailAddressLabel;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

- (CLGeocoder *)geocoder
{
    if (_geocoder == nil) {
        _geocoder = [[CLGeocoder alloc] init];
    }
    return _geocoder;
}

#pragma mark -地理编码
//地址 ---> 经纬度
- (void)geocode
{
    NSString *address = self.addressField.text;
    if (self.addressField.text.length == 0) {
        
        return;
    }
    
    
    [self.geocoder geocodeAddressString:address completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        
        if (error || placemarks.count == 0) {
            self.addressField.text = @"您输入的位置存在错误";
        } else {
            for (CLPlacemark *placemark in placemarks) {
                NSLog(@"name=%@ locality=%@ country=%@ postalCode=%@", placemark.name, placemark.locality, placemark.country, placemark.postalCode);
            }
            
            /*
             thoroughfare 街道
             locality  城市
             subLocality  街道
             postalCode  邮编
             ISOcountryCode  国家编码
             country  国家
             */
            
            //显示最前面的地标
            CLPlacemark *placemark = [placemarks firstObject];
            self.longitudeLabel.text = [NSString stringWithFormat:@"%.2f",placemark.location.coordinate.longitude];
            self.latitudeLabel.text = [NSString stringWithFormat:@"%.2f",placemark.location.coordinate.latitude];
            self.detailAddressLabel.text = placemark.name;
        }
    }];
}

#pragma mark -反地理编码

//经纬度 --> 地名
- (void)reverseGeocode
{
    CLLocation *location = [[CLLocation alloc] initWithLatitude:[self.latitudeLabel.text doubleValue] longitude:[self.longitudeLabel.text doubleValue]];
    
    [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        
        if (error || placemarks.count == 0) {
            self.reverseDetailAddressLabel.text = @"您输入的经纬度存在错误";
        } else {
            
            for (CLPlacemark *placemark in placemarks) {
                NSLog(@"name=%@ locality=%@ country=%@ postalCode=%@", placemark.name, placemark.locality, placemark.country, placemark.postalCode);
            }
            
            CLPlacemark *placemark = [placemarks firstObject];
            self.reverseDetailAddressLabel.text =  placemark.name;
            self.longtitudeField.text = [NSString stringWithFormat:@"%.2f",placemark.location.coordinate.longitude];
            self.latitudeField.text = [NSString stringWithFormat:@"%.2f",placemark.location.coordinate.latitude];

        }
    }];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self.view endEditing:YES];
}

 

 

OC库定位:

#import "ViewController.h"
//引入库
#import "CoreLocation/CoreLocation.h"

@interface ViewController ()<CLLocationManagerDelegate>{
    
    CLLocationManager *manager;
    
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    if ([CLLocationManager locationServicesEnabled]) {
        //可以定位并开始定位
        [self.manager startUpdatingLocation];
        
        //传入一个区域
        //[self.manager startMonitoringForRegion:<#(nonnull CLRegion *)#>];
        
    }else{
        
        //提醒用户打开定位开关
        //检查网络
   
    }
    
    //计算距离
    [self countDistance];
    
    
}

//定位的方法
-(CLLocationManager *)manager{
    
    if (manager == nil) {
        //创建用户管理器,定位用户的位置
        manager = [[CLLocationManager alloc]init];
        //判断当前的版本
        if ([[[UIDevice currentDevice] systemVersion]floatValue] >= 8.0) {
            [manager requestAlwaysAuthorization];
            [manager requestWhenInUseAuthorization];
        }
        
        manager.delegate = self;
        
        //每隔多少米定位一次
        manager.distanceFilter = kCLDistanceFilterNone;
        
        //精确度
        manager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
 
    }
    
    return manager;
}


//计算距离的方法
-(void)countDistance{
    
    CLLocation *lo1 = [[CLLocation alloc]initWithLatitude:41 longitude:115];
    CLLocation *lo2 = [[CLLocation alloc]initWithLatitude:41 longitude:116];
    
    CLLocationDistance distance = [lo1 distanceFromLocation:lo2];
    
    NSLog(@"%f", distance);
    
}

//定位自己的位置
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    
    CLLocation *location = [locations lastObject];
    
    //纬度  location.coordinate.latitude
    //经度  location.coordinate.longitude

    NSLog(@"纬度%f------经度%f",location.coordinate.latitude,location.coordinate.longitude);
    
    
    //停止更新位置(非常耗电)
//    [manager stopUpdatingLocation];
 
}


//进入某个区域调用
- (void)locationManager:(CLLocationManager *)manager
         didEnterRegion:(CLRegion *)region{
    

    
    
}


//离开某个区域调用
- (void)locationManager:(CLLocationManager *)manager
          didExitRegion:(CLRegion *)region{
    
    
    
    
}

 

 

 

iOS地图(MapKit):

#import "ViewController.h"
//先引入库
#import <MapKit/MapKit.h>
//注意引入代理
@interface ViewController ()<MKMapViewDelegate>
//新建一个CLLocationManager
@property (nonatomic,strong) CLLocationManager *manager;


@end

@implementation ViewController


/**
 *  !!!!!!!!!注意:要在 Info.plist 中添加 NSLocationWhenInUseUsageDescription ,并把 Boolean 改成 YES
 */




- (void)viewDidLoad {
    [super viewDidLoad];

    //判断当前版本(8.0以后使用地图需要先定位)
    if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 8.0) {
        self.manager = [[CLLocationManager alloc]init];
        [self.manager requestWhenInUseAuthorization];
        [self.manager requestAlwaysAuthorization];
    }
    
    //初始化地图
    MKMapView *mapView = [[MKMapView alloc]initWithFrame:self.view.bounds];
    
    //设置地图的类型
    mapView.mapType = MKMapTypeStandard;
    
    //设置跟踪模式
    mapView.userTrackingMode = MKUserTrackingModeFollow;
    
    //设置代理(监控地图的相关行为:比如显示的区域发生了改变)
    mapView.delegate = self;
    
    [self.view addSubview:mapView];
    
    
}


/**
 *  更新到用户的位置时就会调用(显示的位置、显示范围改变)
 *  userLocation : 大头针模型数据, 对大头针位置的一个封装(这里的userLocation描述的是用来显示用户位置的蓝色大头针)
 */
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
    
    //地图上的大头针上的简介
    userLocation.title = @"哈哈哈哈哈哈";
    userLocation.subtitle = @"我是介绍";

}

/**
 *  地图显示的区域即将改变了就会调用
 */
-(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated{
    
    NSLog(@"regionWillChangeAnimated");
    
}


/**
 *  地图显示的区域改变了就会调用(显示的位置、显示范围改变)
 */
-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
    
    //中心点
    CLLocationCoordinate2D center = mapView.region.center;
    //跨度
    MKCoordinateSpan span = mapView.region.span;
    
    NSLog(@"中心点=(%f,%f), 区域跨度=(%f,%f)", center.longitude,center.latitude,span.longitudeDelta,span.latitudeDelta);
    
}

 

© 著作权归作者所有

共有 人打赏支持
D
粉丝 0
博文 81
码字总数 41000
作品 0
西安
程序员
私信 提问
疯狂ios讲义之使用CoreLocation定位(1)

9.1 iOS的定位支持 iOS设备支持的定位方式有多种,最早期的iPhone只支持通过运营商的基站信号进行定位,后来iOS系统开始引入WiFi支持,从而允许iOS设备通过周围的WiFi信号进行定位。 从iPhon...

博文视点
2014/04/02
1K
1
[C++][IO]fstream用法

fstream用法 1. 打开文件 在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是: void open(const char* filename,int mode,int access); 参数: filename:  要打开的文件...

guitar_zp
2011/08/09
0
0
Phonegap各类商业插件

【Phonegap商业插件服务】[目前插件已经支持到Phonegap最新版本] 1.phonegap-百度社会化分享-andriod插件 v2.0 【该插件支持微信分享和朋友圈分享,qq好友分享,微博分享】 2.phonegap百度社...

夜澜小雨
2015/07/15
1K
0
疯狂ios讲义之使用CoreLocation定位(2)

9.2 获取定位信息 iOS开发者使用CoreLocation.framework框架进行定位非常简单,CoreLocation框架的常用API主要有如下几个。 Ø CLLocationManager:定位管理器类。 Ø CLLocationManagerdel...

博文视点
2014/04/03
11.3K
0
C++ fstream/ifstream/ofstream文件读写操作

版权声明:本文为博主 一銤阳光 学习整理的文章,如需转载,请注明出处、附上CSDN博文链接。 https://blog.csdn.net/CSDNhuaong/article/details/85281404 文章目录 写在前面 在C++中,对文件...

一銤阳光
2018/12/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud搭建微服务架构----流量回放

前言 系统微服务化后,传统的自测/测试方式都变得比较困难: 依赖的服务可能不稳定。 服务无法提供期望的响应数据。 缺少场景构造标准。 随着整体业务越来越复杂,微服务依赖的越来越多,测试...

春哥大魔王的博客
9分钟前
0
0
记一次springboot模块配置问题导致读取Apollo配置中心配置文件始终错误的问题

现在正在做的一个项目采用的是微服务,主框架是spring cloud,配置中心用的是携程的Apollo。 项目下有多个服务,在测试服务器上启动用户服务的时候发现在eureka中心另一个服务被启动了,尝试...

zcqshine
10分钟前
2
0
流处理和批处理框架的异同

分布式流处理需求日益增加,包括支付交易、社交网络、物联网(IOT)、系统监控等。业界对流处理已经有几种适用的框架来解决,下面我们来比较各流处理框架的相同点以及区别。 分布式流处理是对...

hblt-j
14分钟前
0
0
spring cloud 面试题

什么是springboot 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件) 创建独立的spring引用程序 main方法运行 嵌入的Tomcat 无需部署war文件 简化...

狼王黄师傅
15分钟前
0
0
前嗅ForeSpider教程:采集黄页88

以黄页88为例,采集当前列表页新闻的正文数据: 第一步:新建任务 ①点击左上角“加号”新建任务,如图1: 【图1】 ②在弹窗里填写采集地址,任务名称,如图2: 【图2】 ③点击下一步,选择进...

forespider
20分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部