基站定位算法

定位技术有

两种,一种是基于 GPS 的定位,一种是基于移动运营网的基站的定位。

基于移动运营网基站定位服务又叫做移动位置服务(LBS——Location Based

Service
),它是通过电信移动运营商的网络(如 GSM 网)获取移动终端用户的位置信息

(经纬度坐标),在电子地图平台的支持下,为用户提供相应服务的一种增值业务[1]

在手机上不需要增加任何功能,向运营商开通相关服务就可以实现。

本文所说的基站定位,是采用 google 的数据,在功能手机上实现的定位功能(另

一种方法是:内置基站位置信息,然后查询。这需要购买第三方的数据库,并且由于运营

商的网络优化,数据会变得不准确。当然,在智能手机的实现那就更简单了)。这方面的

文章网上也有不少,大多偏向于理论,将它转化成代码,还是有些内容需要自己恩考。

本文尽量将自己实现代码的过程及注意点写下来,目的是:看了本文,就知道该如何

写代码了(如果还看不懂,就先查看网上原理性的东东,呵呵)。

其基本原理是:1、调用手机协议栈函数,获取当前服务小区和邻近小区的 CellID

mnc
mcclacrssi 值,至少需要要 3 组。2、通过手机的 HTTP 协议,将上述小区信

息传到 Google Gelocation Server 获取相对应小区的经纬度。3、根据无线电传播路径损

耗理论公式,将 RSSI 值转化成相对应的距离。4、运用三角形质心算法,采用3 组小区的

坐标信息和距离,得出手机当前的位置信息。下面具体描述实现过程。

一、获取服务小区和邻近小区的相关信息。由于手机平台的不同,调用的协议栈函数不

同。但必须获得以下的数据:小区 ID 号:CellID,移动网络号码(用于识别移动客户所

属的移动网络):mnc;移动国家号码(用于唯一地标识移动客户属于的国家):mcc;位

置区码(用于标识不同的位置区):lac;接收的信号强度指示:RSSI。根据三角形算法的需

要,至少要 3 组小区信息。在展讯平台中,一般情况下能够获得 6 组小区信息,这给挑选可

信任度较高的数据,提供了便利。

二、通过手机的 HTTP 协议,将上述小区信息传到 Google Gelocation Server 获取相

对应小区的经纬度。获取位置信息时,必须遵照网络位置提供者协议(Network Location

Provider Protocol)
,详细的协议在 google 的网站上做了说明。其要点有:

1
、使用 HTTP POST,请求和响应的格式都是JSON ,请求的内容示例如下:

{

"version": "1.1.0",

"host": "maps.google.com",

"home_mobile_country_code": 310,

"home_mobile_network_code": 410,

"radio_type": "gsm",

"carrier": "Vodafone",

"request_address": true,

"address_language": "en_GB",

"location": {

"latitude": 51.0,

"longitude": -0.1

},

"cell_towers": [

{

"cell_id": "42",

"location_area_code": 415,

"mobile_country_code": 310,

"mobile_network_code": 410,

"age": 0,

"signal_strength": -60,

"timing_advance": 5555

},

{

"cell_id": "88",

"location_area_code": 415,

"mobile_country_code": 310,

"mobile_network_code": 580,

"age": 0,

"signal_strength": -70,

"timing_advance": 7777

}

],

"wifi_towers": [

{

"mac_address": "01-23-45-67-89-ab",

"signal_strength": 8,

"age": 0

},

{

"mac_address": "01-23-45-67-89-ac",

"signal_strength": 4,

"age": 0

} [2]

]

}

其中,"version""host"字段是必须有的,当然,里面要求的信息尽可能全面提供。

响应的示例如下:

{

"location": {

"latitude": 51.0,

"longitude": -0.1,

"altitude": 30.1,

"accuracy": 1200.1,

"altitude_accuracy": 10.1,

"address": {

"street_number": "100",

"street": "Amphibian Walkway",

"postal_code": "94043",

"city": "Mountain View",

"county": "Mountain View County",

"region": "California",

"country": "United States of America",

"country_code": "US"

}

}

} [2]

如果请求的数据格式不正确,服务器返回 HTTP 的状态为 400,并在响应的文本中

有详细描述。如果请求的数据格式正确,服务器返回 HTTP 的状态为 200。如果定位成

功,就有返回经纬度信息;如果定位不成功,经纬度信息就为空。

2
POST 时,URL 地址是:http://www.google.com/loc/json

3
HTTP 发送时,对应的 IP 就是解析www.google.com 得到的“74.125.71.105”,端口:

80

4
、将上述请求的数据组织成 HTTP 数据包格式,才能发送成功。如果手机软件本身已

经集成了 HTTP 协议的相关代码,这一步就省了。由于是在展讯 modem 版本的软件上实现

此功能,HTTP 协议没有被集成,因此必须自己组织 HTTP 数据包。HTTP 数据包包含以下几

个字段:

"POST /loc/json HTTP/1.1"

"Host:www.google.com"

"Content
Type: application/requestJson"

"User Agent: user name" "Content
Length: " + 内容的长度


每个字段间都要加上回车换行符,实际内容与上述字段间要加 2 个回车换行符。这些数

据组织完成,再调用 socket API 发送出去就行了。

三、根据无线电传播路径损耗理论公式,将 RSSI 值转化成相对应的距离。自由空间

无线电传播路径损耗模型为:

式中,d 为距信源的距离,单位为kmf 为频率,单位为 MHzk 为路径衰减因子,范围在

2
5 之间。对数一常态分布模型,其路径损耗的计算公式为:

式中,是平均值为 O 的高斯分布随机变数,其标准差范围为 410PL(d0),是式(1

d=1 时,算出的 Loss值。根据式(1)和式(2),得出信号强度为:

RSSI=
发射功率(Pt)+天线增益(Pf)一路径损耗(PL(d))

根据上面的理论公式,推算出距离与 RSSI 的关系公式:

D = 10^((Pt+Pf-RSSI-PL(d0)-X0)/(10*K))

PL(d0) = 32.44 + 10*K*log10 (f)
,根据发射频率算出 PL(d0)

A = Pt + Pf –X0,则A 是一常数,距离 D 的公式变成:

D = 10^((A-PL(d0))/(10*K)) [
计算中,K 取中间值 3]

四、计算前的单位转换。

由于经纬度信息单位度与根据 RSSI 算出的距离公里,是不同的单位,不能直接计算,

必须转换成统一的单位。方法是:找出离目标最近的一点作为参考点(原点),其它点参考

原点换算出相对的经纬度差值,再将该差值根据刻度与实际距离的关系,换算成公里数,就

得到其它点相对原点的坐标值,单位也统一成公里。地球的子午线总长度大约 40008km,平

均:纬度 1 = 大约 111km,纬度 1 = 大约 1.85km,纬度1 = 大约30.9m[4]。我们

知道,地球的半径大概是 6378.137公里,那么经度与距离的关系如下式进行换算:

经度 1 = 2*pi *6378.137*cos(当前的纬度) km

五、找出可信度相对较高的三组数据。

由于距离越远,根据RSSI 算出的距离误会越大,我们认为可信度较高的数据就是距离

最小的数据。据此,选出距离最小的三组数据作为下面三角形质心算法的数据。

六、运用三角形质心算法,得出手机当前的位置信息。三角形质心定位算法的基本思想是:计算三圆交叠区域的 3 个特征点的坐标,以这三个点为三角形的顶点,未知点即为三


角形质心。特征点为 EFG,特征点E 点的计算方法为[3]



同理,可计算出 FG,此时未知点的坐标为。但是二次

方程,求解过程计算量较大,将式(3)中的方程式两两相减,则分别得到每条交线的直线

方程,特征点 E 的坐标则可以通过这些直线方程求解,如下三个直线方程式:

1: 2(Xb-Xa)Xe+2(Yb-Ya)Ye=ra*ra-rb*rb-Xa*Xa+Xb*Xb-Ya*Ya+Yb*Yb

2: 2(Xb-Xc)Xe+2(Yb-Yc)Ye=rc*rc-rb*rb-Xc*Xc+Xb*Xb-Yc*Yc+Yb*Yb

3: 2(Xa-Xc)Xe+2(Ya-Yc)Ye=rc*rc-ra*ra-Xc*Xc+Xa*Xa-Yc*Yc+Ya*Ya

根据上面算出的未知点的坐标是相对于原点的公里数,先将公里数转化成经纬度,然后再

与原点的经纬度相加,就得到了手机的位置信息。

基于 GPS 的定位方式是利用手机上的 GPS 定位模块将自己的位置信号发送到定位

后台来实现定位的,精度比较高,在空旷的地方表现优越;而在大厦内部,由于

信号微弱,无法实现定位功能。基站定位则是利用基站对手机的距离的测算距离来确

定手机位置的,不需要手机具有 GPS 定位能力,但是精度很大程度依赖于基站的分布

及覆盖范围的大小,本文实现的基站定位误差在 200m 之内,在一定程度上弥补了 GPS

信号无法覆盖区域的定位缺憾。

你可能感兴趣的:(JAVA,算法)