文档章节

iOS中的定位

D
 Dumplings
发布于 2016/05/16 17:37
字数 893
阅读 25
收藏 1
点赞 2
评论 0

地理编码 与 反地理编码:

#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
博文 68
码字总数 36665
作品 0
西安
程序员
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊 ⋅ 05/26 ⋅ 0

iOS 线上版本图片资源格式的问题导致的闪退

近段刚刚上传了app新版本 ,上线前也是各种真机调试,包括公司一位同事的iOS9.2系统的iPhone6s , 一点问题都没有 可是两天后审核通过了 我们公司其他人下载app都非常流畅 ,也没有闪退的情况...

奥卡姆剃须刀 ⋅ 2017/05/01 ⋅ 0

常见的移动端H5页面开发遇到的坑和解决办法

手机共通问题 问题一:用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经研究发现是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显示网页字会非常小,所以苹果...

webmirror ⋅ 05/02 ⋅ 0

IOS12开发者预览版第二版使用评测

     手头有一部iPhone 6s Plus,因为之前看同学和朋友们升到IOS 11后手机变得非常卡顿所以没有升级。最近偶然看到IOS 12针对旧机型做了性能优化,号称提升70%相机打开速度、50%键盘显示...

张旭乾 ⋅ 昨天 ⋅ 0

【AR】开始使用Vuforia开发iOS(2)

原 设置iOS开发环境 安装Vuforia iOS SDK 如何安装Vuforia iOS示例 编译并运行Vuforia iOS示例 支持iOS金属 iOS 64位迁移 设置iOS开发环境 适用于iOS的Vuforia引擎目前支持运行iOS 9及更高版...

lichong951 ⋅ 06/11 ⋅ 0

iOS ZipperDown 漏洞来袭,我们该如何应对?

  昨天傍晚盘古实验室负责任的披露了针对 iOS 应用的 ZipperDown 漏洞,并提供了检索、查询受影响应用的平台: zipperdown.com。基于目前公开的信息,该漏洞的影响面比较大,15000 多个应用...

FreeBuf ⋅ 05/16 ⋅ 0

HDU ~ 6297 ~ CCPC直播 (模拟,输出格式控制)

思路:模拟就行了,注意Running和RTE的开头字母一样。 iomanip是I/O流控制头文件,就像printf的格式化输出一样。 以下是一些常用的: dec 置基数为10 相当于"%d" hex 置基数为16 相当于"%X" oc...

zscdst ⋅ 05/29 ⋅ 0

面试官自述:面向高级开发人员的iOS面试问题

当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。 这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。 这些问题涉及iOS开发的...

菇哒微课 ⋅ 04/26 ⋅ 0

苹果对体无完肤的 iOS 11 最后的弥补

点击上方“CSDN”,选择“置顶公众号” 关键时刻,第一时间送达! 距离万众瞩目的苹果开发者大会(WWDC 2018)的召开还有不到一周时间,苹果公司于今天凌晨,正式发布了 iOS 11 的第十四次更...

csdnnews ⋅ 05/30 ⋅ 0

iOS宇宙大战游戏、调试工具、各种动画、AR相册、相机图片编辑等源码

iOS精选源码 日期时间选择器,swift(http://www.code4app.com/thread-30244-1-1.html) Space Battle 宇宙大战 SpriteKit游戏源码(http://www.code4app.com/thread-30246-1-1.html) LLDebugTo......

sunnyaigd ⋅ 06/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何使用serverchan微信推送告警

之前实现推送告警信息到微信的方法有如下几种: 1、通过企业公众号实现----收费: 2、通过QQ邮箱,在微信平台上开启收到邮件进行提醒; 3、第三方告警平台API,一般也是收费的; 不过最近看文...

问题终结者 ⋅ 11分钟前 ⋅ 0

TCP的RPC

RPC就是远程方法调用(Remote Process Call ),包含了客户端和服务端,涉及了对象的序列化传输。 1.服务端启动,注册远程调用的类2.客户端发送请求信息包含类、方法、参数的一些信息、序列化传...

Cobbage ⋅ 32分钟前 ⋅ 0

IOS-UI UI初步代码布局添加事件

ISO开发界面,UI是必须学习的一部分,其实很早之前想学来了,一直没有沉下心来学习。看到IOS的代码风格和布局就别扭的不行,跟java代码和android布局比较显得不是那么方便,所以一直到现在。...

京一 ⋅ 42分钟前 ⋅ 0

浅谈OpenDaylight的二次开发

OpenDaylight作为一款开源SDN网络控制器,依托于强大的社区支持以及功能特性,成为了目前主流的SDN网络控制器开发平台。在比较稳定的OpenDaylight Helium版本中,已经为开发者提供了大量的网...

wangxuwei ⋅ 51分钟前 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在config/jwt.php默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更...

等月人 ⋅ 52分钟前 ⋅ 0

Java NIO之文件处理

程序要操作本地操作系统的一个文件,可以分为以下三个部分: 对文件位置的操作 对文件的操作 对文件内容的操作 其中,对文件内容的操作在 Java NIO之Channel 中已经有了介绍,通过FileChann...

士别三日 ⋅ 57分钟前 ⋅ 0

Maven的pom.xml配置文件详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.......

小海bug ⋅ 今天 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 今天 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部