利用经纬度计算距离

一、公式

对上面的公式解释如下:

1.Lat1 Lung1 表示A点经纬度,Lat2 Lung2 表示B点经纬度;
2.a=Lat1 – Lat2 为两点纬度之差  b=Lung1 -Lung2 为两点经度之差;
3.6378.137为地球半径,单位为千米;

计算出来的结果单位为千米。

二、代码实现(oracle)

Create Or Replace Function get_earth_distance(lon1 Number,
                                              lat1 Number,
                                              lon2 Number,
                                              lat2 Number) Return Number As
  rad_lon1     Number(12, 8);
  rad_lat1     Number(12, 8);
  rad_lon2     Number(12, 8);
  rad_lat2     Number(12, 8);
  a            Number(12, 8);
  b            Number(12, 8);
  pi           Number := 3.14159265;
  s            Number(20, 8);
  EARTH_RADIUS Number := 6378.137;
Begin
  rad_lat1 := lat1 * pi / 180.0;
  rad_lat2 := lat2 * pi / 180.0;
  rad_lon1 := lon1 * pi / 180.0;
  rad_lon2 := lon2 * pi / 180.0;
  a        := rad_lat1 - rad_lat2;
  b        := rad_lon1 - rad_lon2;
  s        := 2 * asin(sqrt(power(sin(a / 2), 2) +
                            cos(rad_lat1) * cos(rad_lat2) *
                            power(sin(b / 2), 2)));
  s        := s * EARTH_RADIUS;
  s        := round(s * 100000) / 100000;
  s        := s * 1000;
  Return s;
End get_earth_distance;

计算精度与谷歌地图的距离精度差不多,相差范围在0.2米以下。

三、关于经纬度十进制表示法

对于两个点,在纬度相等的情况下:

经度每隔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米。

 

以上内容都是从网上转载而来,那么我觉得更为重要的是第三点,关于经纬度的十进制表示法。

我们将一个地点的经纬度分别存入数据库的经度和纬度字段,如果我们需要获取用户当前位置一定范围内的地点,我们需要从数据库中很大区域范围(一个城市)的地点都取出来,然后再通过经纬度计算距离,将超出范围的地点排除,这个量可能是巨大的。所以如果我们之间通过经度或者纬度的计算,将一定超过选定距离的地点直接用SQL语句排除,再对剩下的地点集合进行经纬度距离计算,所需要计算的结果集就会小的多的多。

你可能感兴趣的