iOS 如何定位获取周围地点信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 如何定位获取周围地点信息相关的知识,希望对你有一定的参考价值。

它使用的是Wi-Fi定位技术,其原理与基站定位类似:

1、每一个无线AP都有一个全球唯一的MAC地址,并且一般来说无线AP在一段时间内是不会移动的。

2、设备在开启Wi-Fi的情况下,即可扫描并收集周围的AP信号,无论是否加密,是否已连接,甚至信号强度不足以显示在无线信号列表中,都可以获取到AP广播出来的MAC地址。

3、设备将这些能够标示AP的数据发送到位置服务器,服务器检索出每一个AP的地理位置,并结合每个信号的强弱程度,计算出设备的地理位置并返回到用户设备。

4、位置服务商要不断更新、补充自己的数据库,以保证数据的准确性,毕竟无线AP不像基站塔那样基本100%不会移动。

这样的位置服务商现在来说只有Skyhook和Google两家,他们收集位置数据的方式也是相似的。

1、主动采集:Google的街景拍摄车还有一个重要的功能就是采集沿途的无线信号,并打上通过GPS定位出的坐标回传至服务器。

Skyhook在美国及欧洲一些国家也是直接开着信号采集车采集AP和基站的信号数据,相对来说覆盖城市没有Google多,目前中国仅有少数城市有覆盖,并且他们在包括中国在内的多个国家招募有偿工作者,以协助Skyhook收集位置数据。当然你也可以直接在其网站上提交一个MAC地址。

2、用户提交:通常是以静默方式向同时拥有Wi-Fi和GPS的终端用户收集位置数据。

android手机用户在开启“使用无线网络定位”时会提示是否允许Google的定位服务手机匿名地点数据。

同样的Skyhook的最大客户Apple也在iPhone的User Guide中说明会以不能识别用户身份的方式收集位置数据。

使用这种方式定位一般来说需要与位置服务器进行即时的网络交互,Android正是如此,最好的证明就是关闭电话和GPS后,单单打开Wifi但不连接任何一个无线网络或者连接一个没有接入互联网的网络时,是无法进行定位的。实际测试的时候,发现这种情况下部分软件仍然可以定位,但是无论将设备移动到哪里,应用中的位置始终不会变化。因为Android的API中提供的方法是LocationManager.getLastKnownPosition,只要是通过这种方式获取到的位置数据,Android是不会立即定位的,而是将最后一次定位的数据返回给应用,除非应用发起更新位置的请求。

但是正是在网络交互这一点上,Apple让人觉得不可思议。前几天在touch上安装了一款地图软件,并下载了离线地图,因为touch不接入WLAN是没有其他办法联网的,有了离线地图会方便很多。一次外出时,打开地图竟发现,没有连接任何无线网络的情况下,touch竟然准确地标出了我的位置,走了几步发现地图上的标记也准确地移动到了新的坐标。但是系统自带的Google Map及部分网络软件都无法定位。

我们知道通过无线可以定位,但是Touch是如何做到在没有网络交互的情况下定位?

一开始我猜测是离线地图中包含位置元数据,地图应用自行收集环境信息进行定位测算,测试如下:

将该地图应用卸载,重新安装,安装成功后第一次打开前即断开Wi-Fi连接(不关闭),然后打开地图应用,定位成功,只不过地图无任何显示。

是不是很离奇呢,也就是说并不是离线地图的功能,难道是...ios

为此我做了个简单的实验,Safari是支持html5的,于是我想到了GeoLocation API:

javascript:navigator.geolocation.getCurrentPosition(function(position)alert(position.coords.latitude+"\n"+position.coords.longitude);,function(err)alert(err.code));

先完全退出Safari,然后打开,直接将这段js敲进地址栏访问,如果成功获取到位置信息,就显示出经纬度,否则显示错误码。

测试结果如下:

*开启wifi不连接任何网络(随着移动,坐标会变)

*关闭wifi(无论怎么移动始终是同一个坐标,后来在地图软件中测试也是如此)

可以看出,在开启Wi-Fi而不连接网络的情况下,iOS仍然何以提供定位服务,而关闭Wi-Fi后其实跟Android无网络的情况相同,不是实时的定位
实验至此,基本上可以确定,是iOS缓存了历史地点及附近一定范围内的位置数据(并且范围不小,因为曾经去到一个从未去过的10公里外的度假村,无连接状态仍然成功定位)位置的计算直接在本机进行。

PS:其实还有一点挺困惑的,内置的Google Map为什么不能定位呢?难道是因为Google用自己的服务而不用与Apple合作的Skyhook的服务吗(Google Map在已有地图缓存的情况下定位时有与Google服务器交互的数据包,但不能断定就一定是用于定位的数据)?再者,GoogleMap在定位时状态栏会显示系统的定位服务图标,表明调用了系统Api,却始终无法定位。

既然谈到HTML5定位,必然不能不提桌面浏览器,目前主流的浏览器都已经支持HTML5。W3C所提出的Geolocation API是个访问地理位置信息的高层接口,该接口与实现设备紧密相关,API本身对下面的位置信息一无所知。常见的位置信息来源主要包GPS、IP、RFID、AP MAC、cell ID等。
参考技术A 它使用的是Wi-Fi定位技术,其原理与基站定位类似:

1、每一个无线AP都有一个全球唯一的MAC地址,并且一般来说无线AP在一段时间内是不会移动的。

2、设备在开启Wi-Fi的情况下,即可扫描并收集周围的AP信号,无论是否加密,是否已连接,甚至信号强度不足以显示在无线信号列表中,都可以获取到AP广播出来的MAC地址。

3、设备将这些能够标示AP的数据发送到位置服务器,服务器检索出每一个AP的地理位置,并结合每个信号的强弱程度,计算出设备的地理位置并返回到用户设备。

4、位置服务商要不断更新、补充自己的数据库,以保证数据的准确性,毕竟无线AP不像基站塔那样基本100%不会移动。

这样的位置服务商现在来说只有Skyhook和Google两家,他们收集位置数据的方式也是相似的。

1、主动采集:Google的街景拍摄车还有一个重要的功能就是采集沿途的无线信号,并打上通过GPS定位出的坐标回传至服务器。

Skyhook在美国及欧洲一些国家也是直接开着信号采集车采集AP和基站的信号数据,相对来说覆盖城市没有Google多,目前中国仅有少数城市有覆盖,并且他们在包括中国在内的多个国家招募有偿工作者,以协助Skyhook收集位置数据。当然你也可以直接在其网站上提交一个MAC地址。

2、用户提交:通常是以静默方式向同时拥有Wi-Fi和GPS的终端用户收集位置数据。

Android手机用户在开启“使用无线网络定位”时会提示是否允许Google的定位服务手机匿名地点数据。

同样的Skyhook的最大客户Apple也在iPhone的User Guide中说明会以不能识别用户身份的方式收集位置数据。

使用这种方式定位一般来说需要与位置服务器进行即时的网络交互,Android正是如此,最好的证明就是关闭电话和GPS后,单单打开Wifi但不连接任何一个无线网络或者连接一个没有接入互联网的网络时,是无法进行定位的。实际测试的时候,发现这种情况下部分软件仍然可以定位,但是无论将设备移动到哪里,应用中的位置始终不会变化。因为Android的API中提供的方法是LocationManager.getLastKnownPosition,只要是通过这种方式获取到的位置数据,Android是不会立即定位的,而是将最后一次定位的数据返回给应用,除非应用发起更新位置的请求。

但是正是在网络交互这一点上,Apple让人觉得不可思议。前几天在touch上安装了一款地图软件,并下载了离线地图,因为touch不接入WLAN是没有其他办法联网的,有了离线地图会方便很多。一次外出时,打开地图竟发现,没有连接任何无线网络的情况下,touch竟然准确地标出了我的位置,走了几步发现地图上的标记也准确地移动到了新的坐标。但是系统自带的Google Map及部分网络软件都无法定位。

我们知道通过无线可以定位,但是Touch是如何做到在没有网络交互的情况下定位?

一开始我猜测是离线地图中包含位置元数据,地图应用自行收集环境信息进行定位测算,测试如下:

将该地图应用卸载,重新安装,安装成功后第一次打开前即断开Wi-Fi连接(不关闭),然后打开地图应用,定位成功,只不过地图无任何显示。

是不是很离奇呢,也就是说并不是离线地图的功能,难道是...iOS?

为此我做了个简单的实验,Safari是支持HTML5的,于是我想到了GeoLocation API:

javascript:navigator.geolocation.getCurrentPosition(function(position)alert(position.coords.latitude+"\n"+position.coords.longitude);,function(err)alert(err.code));

先完全退出Safari,然后打开,直接将这段js敲进地址栏访问,如果成功获取到位置信息,就显示出经纬度,否则显示错误码。

测试结果如下:

*开启wifi不连接任何网络(随着移动,坐标会变)

*关闭wifi(无论怎么移动始终是同一个坐标,后来在地图软件中测试也是如此)

可以看出,在开启Wi-Fi而不连接网络的情况下,iOS仍然何以提供定位服务,而关闭Wi-Fi后其实跟Android无网络的情况相同,不是实时的定位
实验至此,基本上可以确定,是iOS缓存了历史地点及附近一定范围内的位置数据(并且范围不小,因为曾经去到一个从未去过的10公里外的度假村,无连接状态仍然成功定位)位置的计算直接在本机进行。

PS:其实还有一点挺困惑的,内置的Google Map为什么不能定位呢?难道是因为Google用自己的服务而不用与Apple合作的Skyhook的服务吗(Google Map在已有地图缓存的情况下定位时有与Google服务器交互的数据包,但不能断定就一定是用于定位的数据)?再者,GoogleMap在定位时状态栏会显示系统的定位服务图标,表明调用了系统Api,却始终无法定位。

既然谈到HTML5定位,必然不能不提桌面浏览器,目前主流的浏览器都已经支持HTML5。W3C所提出的Geolocation API是个访问地理位置信息的高层接口,该接口与实现设备紧密相关,API本身对下面的位置信息一无所知。常见的位置信息来源主要包GPS、IP、RFID、AP MAC、cell ID等。

IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息

 

IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息

/**当获取到定位的坐标后,回调函数*/

- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{

    

    BMKCoordinateRegion region;

    

    region.center.latitude  = userLocation.location.coordinate.latitude;

    region.center.longitude = userLocation.location.coordinate.longitude;

    region.span.latitudeDelta = 0;

    region.span.longitudeDelta = 0;

    NSLog(@"当前的坐标是:%f,%f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);

    

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];

    [geocoder reverseGeocodeLocation: userLocation.location completionHandler:^(NSArray *array, NSError *error) {

        if (array.count > 0) {

            CLPlacemark *placemark = [array objectAtIndex:0];

            if (placemark != nil) {

                NSString *city = placemark.locality;

                

                NSLog(@"当前城市名称------%@",city);

                BMKOfflineMap * _offlineMap = [[BMKOfflineMap alloc] init];

                _offlineMap.delegate = self;//可以不要

                NSArray* records = [_offlineMap searchCity:city];

                BMKOLSearchRecord* oneRecord = [records objectAtIndex:0];

                //城市编码如:北京为131

                NSInteger cityId = oneRecord.cityID;

 

                NSLog(@"当前城市编号-------->%zd",cityId);

                //找到了当前位置城市后就关闭服务

                [_locService stopUserLocationService];

                

            }

        }

    }];

    

}

以上是关于iOS 如何定位获取周围地点信息的主要内容,如果未能解决你的问题,请参考以下文章

获取用户当前位置周围的地点列表

利用H5构建地图和获取定位地点

微信小程序怎么开定位

如何通过经纬度坐标获取附近的地址信息?

如何实现 PlaceAutocompleteFragment 和 PlaceAutocompleteActivity 以获取地点详细信息

百度地图,自动获取定位,拖拽获取地点,模糊查询获取当前位置