服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - 在iOS App中实现地理位置定位的基本方法解析

在iOS App中实现地理位置定位的基本方法解析

2021-01-19 15:11李刚 IOS

这篇文章主要介绍了在iOS App中实现地理位置定位的基本方法解析,包括获取当前位置和计算两点间距离等基本功能的实现,需要的朋友可以参考下

ios系统自带的定位服务可以实现很多需求。比如:获取当前经纬度,获取当前位置信息等等。
其定位有3种方式:
1,gps,最精确的定位方式
2,蜂窝基站三角定位,这种定位在信号基站比较秘籍的城市比较准确。
3,wifi,这种方式貌似是通过网络运营商的数据库得到的数据,在3种定位种最不精确

首先你要在你的xcode中添加两个连接库,mapkit和corelocation,如图

在iOS App中实现地理位置定位的基本方法解析

core location提供了定位功能,能定位装置的当前坐标,同时能得到装置移动信息,最重要的类是cllocationmanager,定位管理。
ios8开始,core location framework的变化主要有以下几点:
1. 在定位状态中引入always 和wheninuse的概念。
2. 加入visit monitoring的特性, 这类特性特别适合旅行类别的应用,当用户到达某个指定的区域内,monitor开始作用。
3.加入室内定位技术,增加clfloor, 在室内可以得到楼层信息。

获取当前经纬度

首先导入#import <corelocation/corelocation.h>,定义cllocationmanager的实例,实现cllocationmanagerdelegate。

复制代码 代码如下:


@interface viewcontroller ()<cllocationmanagerdelegate>
{
    cllocationmanager *_locationmanager;
}

 

@end


开始定位的方法:

复制代码 代码如下:

- (void)startlocating
{
    if([cllocationmanager locationservicesenabled])
    {
        _locationmanager = [[cllocationmanager alloc] init];
        //设置定位的精度
        [_locationmanager setdesiredaccuracy:kcllocationaccuracybest];
        _locationmanager.distancefilter = 100.0f;
        _locationmanager.delegate = self;
        if ([[[uidevice currentdevice] systemversion] floatvalue] > 8.0)
        {
            [_locationmanager requestalwaysauthorization];
            [_locationmanager requestwheninuseauthorization];
        }
        //开始实时定位
        [_locationmanager startupdatinglocation];
    }
}


实现代理方法:

复制代码 代码如下:

-(void)locationmanager:(cllocationmanager *)manager didchangeauthorizationstatus:(clauthorizationstatus)status
{
    nslog(@"longitude = %f", manager.location.coordinate.longitude);
    nslog(@"latitude = %f", manager.location.coordinate.latitude);
    [_locationmanager stopupdatinglocation];
}


获取当前位置信息

 

在上面的代理方法中

复制代码 代码如下:


-(void)locationmanager:(cllocationmanager *)manager didchangeauthorizationstatus:(clauthorizationstatus)status
{
    nslog(@"longitude = %f", manager.location.coordinate.longitude);
    nslog(@"latitude = %f", manager.location.coordinate.latitude);
    [_locationmanager stopupdatinglocation];

 

    clgeocoder * geocoder = [[clgeocoder alloc] init];
    [geocoder reversegeocodelocation:manager.location completionhandler:^(nsarray *placemarks, nserror *error) {
        for (clplacemark * placemark in placemarks) {
            nsdictionary *test = [placemark addressdictionary];
            //  country(国家)  state(城市)  sublocality(区)
            nslog(@"%@", [test objectforkey:@"country"]);
            nslog(@"%@", [test objectforkey:@"state"]);
            nslog(@"%@", [test objectforkey:@"sublocality"]);
            nslog(@"%@", [test objectforkey:@"street"]);
        }
    }];

}


这样就很简单获取了当前位置的详细信息。

 

获取某一个地点的经纬度

复制代码 代码如下:

- (void)getlongitudeandlatitudewithcity:(nsstring *)city
{
    //city可以为中文
    nsstring *oreillyaddress = city;
    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 = [placemarks objectatindex:0];
            nslog(@"longitude = %f", firstplacemark.location.coordinate.longitude);
            nslog(@"latitude = %f", firstplacemark.location.coordinate.latitude);
        }
        else if ([placemarks count] == 0 && error == nil)
        {
            nslog(@"found no placemarks.");
        }
        else if (error != nil)
        {
            nslog(@"an error occurred = %@", error);
        }
    }];
}


计算两个地点之间的距离

复制代码 代码如下:

- (double)distancebylongitude:(double)longitude1 latitude:(double)latitude1 longitude:(double)longitude2 latitude:(double)latitude2{
    cllocation* curlocation = [[cllocation alloc] initwithlatitude:latitude1 longitude:longitude1];
    cllocation* otherlocation = [[cllocation alloc] initwithlatitude:latitude2 longitude:longitude2];
    double distance  = [curlocation distancefromlocation:otherlocation];//单位是m
    return distance;
}


首先我们可以用上面的getlongitudeandlatitudewithcity方法获取某一个地点的经纬度。比如我们获取北京和上海的经纬度分别为:北京longitude = 116.405285,latitude = 39.904989 上海longitude = 121.472644, latitude = 31.231706, 那么北京和上海之间的距离就是:

复制代码 代码如下:

double distance = [self distancebylongitude:116.405285 latitude:39.904989 longitude:121.472644 latitude:31.231706];
nslog(@"latitude = %f", distance);


计算的是大概的距离,可能没有那么精准。输入结果为:

 

?
1
distance = 1066449.749194

 

延伸 · 阅读

精彩推荐
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28