路线规划提供了获取路线距离的方法,见MKRoutePlan 类的 getDistance 方法。
如果是计算任意两点的距离,自2.0.0版本开始,Android SDK为开发者提供了计算距离的接口(DistanceUtil),具体使用方法如下:
1.GeoPoint p1LL = new GeoPoint(39971802, 116347927);
2.GeoPoint p2LL = new GeoPoint(39892131, 116498555);
3.double distance = DistanceUtil.getDistance(p1LL, p2LL);
如果开发者使用的是1.3.5及以前的版本,在计算任意两点之前的距离时,有如下两种方法:一种利用勾股定理计算,适用于两点距离很近的情况;一种按标准的球面大圆劣弧长度计算,适用于距离较远的情况。
-
1.
static
double DEF_PI
=
3.14159265359
;
// PI
-
2.
static
double DEF_2PI
=
6.28318530712
;
// 2*PI
-
3.
static
double DEF_PI180
=
0.01745329252
;
// PI/180.0
-
4.
static
double DEF_R
=
6370693.5
;
// radius of earth
-
5.
public
double GetShortDistance
(
double lon1,
double lat1,
double lon2,
double lat2
)
-
6.
{
-
7.
double ew1, ns1, ew2, ns2
;
-
8.
double dx, dy, dew
;
-
9.
double distance
;
-
10.
// 角度转换为弧度
-
11.
ew1
= lon1
* DEF_PI180
;
-
12.
ns1
= lat1
* DEF_PI180
;
-
13.
ew2
= lon2
* DEF_PI180
;
-
14.
ns2
= lat2
* DEF_PI180
;
-
15.
// 经度差
-
16.
dew
= ew1
- ew2
;
-
17.
// 若跨东经和西经180 度,进行调整
-
18.
if
(dew
> DEF_PI
)
-
19.
dew
= DEF_2PI
- dew
;
-
20.
else
if
(dew
<
-DEF_PI
)
-
21.
dew
= DEF_2PI
+ dew
;
-
-
23.
dy
= DEF_R
*
(ns1
- ns2
)
;
// 南北方向长度(在经度圈上的投影长度)
-
24.
// 勾股定理求斜边长
-
-
26.
return distance
;
-
27.
}
-
28.
public
double GetLongDistance
(
double lon1,
double lat1,
double lon2,
double lat2
)
-
29.
{
-
30.
double ew1, ns1, ew2, ns2
;
-
31.
double distance
;
-
32.
// 角度转换为弧度
-
33.
ew1
= lon1
* DEF_PI180
;
-
34.
ns1
= lat1
* DEF_PI180
;
-
35.
ew2
= lon2
* DEF_PI180
;
-
36.
ns2
= lat2
* DEF_PI180
;
-
37.
// 求大圆劣弧与球心所夹的角(弧度)
-
-
39.
// 调整到[-1..1]范围内,避免溢出
-
40.
if
(distance
>
1.0
)
-
41.
distance
=
1.0
;
-
42.
else
if
(distance
<
-
1.0
)
-
43.
distance
=
-
1.0
;
-
44.
// 求大圆劣弧长度
-
-
46.
return distance
;
-
47.
}
-
48.
double mLat1
=
39.90923
;
// point1纬度
-
49.
double mLon1
=
116.357428
;
// point1经度
-
50.
double mLat2
=
39.90923
;
// point2纬度
-
51.
double mLon2
=
116.397428
;
// point2经度
-
52.
double distance
= GetShortDistance
(mLon1, mLat1, mLon2, mLat2
)
;