一、常见定位技术
1.基站定位
每个手机基站都有一个ID标识符,插上sim卡的手机或其他终端可以搜集周围所有收到信号的基站和其ID,查询定位服务器可知基站位置。再通过计算基站信号传播到终端的角度、时间和强度等信息,就可以确定终端的位置。基站定位速度快,但准确度较低,精度为平均200米左右,视运营商基站覆盖范围而定。
无网基站定位:传统的基站定位需要连接云端服务器,产生网络流量,苹果在iOS 4开始对其进行了优化,预先将一些重要基站提前存储在iOS系统中,在无网情况下,不用上网也能通过这些本地基站信息定位到用户位置,但这个误差范围更大,在10公里到50公里。
2.Wi-Fi定位
每一个Wi-Fi热点都有一个独一无二的MAC地址,智能手机等设备开启Wi-Fi后就会自动扫描附近热点并上传它们的地理位置信息,这样就建立了一个庞大的热点位置数据库。反过来讲,如果你的设备连上了某个Wi-Fi热点,那么就可以调用服务器或离线数据中附近所有热点的地理位置信息,而服务器会参考每个热点的信号强弱计算出设备的大致地理位置,最后再返回给用户。Wi-Fi定位精度为20米左右。
无网WIFI定位:传统的WIFI定位需要网络,但是iOS对其进行了优化,在设备有网络连接时,会大致定位出设备的位置,并自动下载所在地区周围(几个街区宽度或者更多)所有的WIFI热点的信息到本地。之后,当设备在周围移动并进行WIFI定位的时候,即使没有网络,iOS照样可以利用之前下载的WIFI热点信息定位出设备的位置。
3.GPS定位
GPS定位需要GPS硬件支持,直接和卫星交互来获取当前经纬度与准确时间。接收机在户外接收到天上的定位卫星发射出来的信号,得到卫星的位置,推算出接收机到每颗卫星的距离,进而推算出手机的位置。通过GPS方式定位准确度是最高的(10米左右,取决于芯片),但是从GPS模块启动到获取第一次定位数据(冷启动),可能需要比较长的时间,并且GPS模块耗电量大,且在室内几乎无法使用。
4.AGPS定位(Assisted GPS)
AGPS利用网络,首先将基站定位或者WIFI定位获得的大概位置发到远程服务器,有服务器进行查询和计算,得出这个位置下当前卫星信息,反馈给设备,设备就可以直接用这些信息来接受卫星信号,不用等待漫长的卫星轨道信息广播完毕后,才能知道卫星的位置,大大缩短搜星时间。GPS解决方案的优势主要体现在其定位精度上,在室外等空旷地区,其精度在正常的GPS工作环境下,可以达到10米左右,堪称目前定位精度最高的一种定位技术。该技术的另一优点为:首次捕获GPS信号的时间一般仅需几秒,不像GPS的首次捕获时间可能要2~3分钟。
二、iOS与Android的定位实现
1.iOS的定位实现
iOS定位使用都是Core Location框架,然后用CLLocationManager类来实现定位,系统会自动分配使用哪种定位方式,并且还会有缓存。
iOS设备能提供3种不同途径进行定位:Wi-Fi、蜂窝式移动电话基站、GPS卫星(包括AGPS)。
iOS不像Android系统在定位服务编程时,可以指定采用哪种途径进行定位。iOS的API把底层这些细节屏蔽掉了,开发人员和用户并不知道现在设备是采用哪种方式进行定位的,iOS系统会根据设备的情况和周围的环境,采用一套最佳的解决方案。如果能够接收GPS信息,那么设备优先采用GPS定位,否则采用Wi-Fi或蜂窝基站定位。在Wi-Fi和蜂窝基站之间优先使用Wi-Fi,如果无法连接Wi-Fi才使用蜂窝基站定位。
2.Android的定位实现
Android系统API提供基站ID和WIFI的mac地址获取接口,开发者自行维护基站、mac数据库,自行查询推算位置。而GPS定位信息则可以直接调用系统API获得。
除了自行维护数据库之外,也可以使用百度、高德等地图厂商自行实现的定位SDK。该定位SDK的作用就是通过系统接口读取到原始定位信息,然后借助于各家自行部署维护的数据库,查询到当前扫描到的基站、WIFI的位置,最终计算出更准确的定位结果,通过SDK的接口,返回给开发者。
在中国,Google服务器不可用,这会造成一定的问题。一个app如果只是调用系统定位接口,那么在行货手机,由于手机厂商已经把定位的网络服务器重定向为国内定位服务商,所以肯定可以定位,但是在水货手机上因为系统底层是直接连google服务器的,就会无法定位。为了保证app在所有手机上都可以定位,开发者就会不得不使用第三方的独立定位SDK。
三、坐标信息
1.坐标偏移
WGS84是GPS全球定位系统使用的坐标系统,GPS设备直接返回的坐标即为WGS84。GCJ02则是由中国国家测绘局制定的地理信息系统的坐标,也叫“火星坐标”,国内出版的各种地图坐标系统(包括电子地图),必须至少采用GCJ02对WGS84进行首次加密。高德和搜狗等使用GCJ02,百度地图会再加密一层,编码系统叫BD09。
iOS系统上通过定位服务CLLocation相关接口获取定位信息时,获取的经纬度坐标系是WGS84地球坐标,如果直接将该坐标系在iOS系统地图中打点,会发现存在偏移,因为iOS系统地图查看国内时使用的是高德地图数据,因此只接受GCJ02火星坐标。如果在国内iOS系统地图中获取当前位置,那么获取到的坐标系是GCJ02火星坐标系。
Android系统上通常使用高德或者百度定位SDK获取定位信息。高德SDK没有坐标系参数设定,在大陆和港澳地区获取的坐标系即为GCJ02坐标系,在台湾和海外地区都是WGS84坐标系;百度SDK可以自行设定坐标系参数,即返回WGS84坐标系,还是GCJ02坐标系或者BD09坐标系(注意BD09坐标系只适用于百度地图),如果设定的是GCJ02坐标系,它在大陆+港澳台地区获取的坐标系都是GCJ02坐标系。如果没有调用第三方地图API,而是使用android.location获取的经纬度,或者是通过手持或车载的GPS终端获取的经纬度,那就是属于WGS84的真实的地理坐标,这时候,直接在百度或者高德地图上显示是会出现偏移的。
因此,若想获取到准确的坐标位置,需要对从设备获取的坐标信息进行修正。
2.坐标信息
从设备获取到的定位信息统一格式:经度在前,维度在后,经纬度间以“,”分隔,经纬度小数点后精确到6位数。
坐标转换代码:https://github.com/googollee/eviltransform
——部分内容整理自网络——