在做LBS的应用的时候考虑到了这样一个问题,经纬度后面的小数的位数对于精度影响有多少?
通过百度或者Google,可以获得如下信息:
在纬度相等的情况下:
- 经度每隔0.00001度,距离相差约1米;
- 经度每隔0.0001度,距离相差约10米;
- 经度每隔0.001度,距离相差约100米;
- 经度每隔0.01度,距离相差约1000米;
- 经度每隔0.1度,距离相差约10000米。
在经度相等的情况下:
- 纬度每隔0.00001度,距离相差约1.1米;
- 纬度每隔0.0001度,距离相差约11米;
- 纬度每隔0.001度,距离相差约111米;
- 纬度每隔0.01度,距离相差约1113米;
- 纬度每隔0.1度,距离相差约11132米。
但是上诉的答案是否是正确的呢?我们先来了解下地球的一些基本信息:
- 地球的赤道半径 = 6378.1 公里
- 地球的极半径 = 6356.8 公里
- Latitude的范围是:-90 到 +90
- Longitude的范围:-180 到 +180
- 地球参考球体的周长:40075016.68米
经纬度划分规则如下图:

从上述的图片中可以看到,经度和纬度的划分规则是不一样的。所以网上搜索的经纬度经度对于精度的影响并不正确的。
纬度每格1度影响的距离 = 极半径*π/180=110.95 km
经度每隔1度影响的距离(赤道)= 赤道半径*π/180 = 111.32 km,维度越靠近南北极,影响的距离越小。
如何计算经纬度之间的距离?
基于球面模型的地理空间距离计算公式。

该模型将地球看成圆球,假设地球上有A(ja,wa),B(jb,wb)两点(注:ja和jb分别是A和B的经度,wa和wb分别是A和B的纬度),A和B两点的球面距离就是AB的弧长,AB弧长=R*角AOB(注:角AOB是A跟B的夹角,O是地球的球心,R是地球半径,约为6367000米)。如何求出角AOB呢?可以先求AOB的最大边AB的长度,再根据余弦定律可以求夹角。
如何求出AB长度呢?
google maps脚本中的计算距离代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
private const double EARTH_RADIUS = 6378.137; private static double rad(double d) { return d * Math.PI / 180.0; } public static double GetDistance(double lat1, double lng1, double lat2, double lng2) { double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) + Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2))); s = s * EARTH_RADIUS; s = Math.Round(s * 10000) / 10000; return s; } |
还原成公式为:
拓展信息:

地球其实不是圆的,当然也不是平的,地球虽是个球体,但是由于受到自转时的惯性及离心力的作用,他并非完美的圆形。所以地球最高点并不是珠穆朗玛峰,虽然其海拔有8848米,由于地球不是完美的球型,所以赤道附近的山峰其实离星空更近一些,因此地球最高点理论上是厄瓜多尔博拉索山(Mount Chimborazo),它的海拔虽然有6272米,却比珠峰”高“出2400米。
打赏作者微信支付

支付宝

李鑫力 => 离心力