Calendar of Development

come on

  博客园 :: 首页 :: 新随笔 ::  ::  :: 管理 ::
  17 随笔 :: 2 文章 :: 34 评论 :: 2 Trackbacks

从google maps的脚本里扒了段代码,没准啥时会用上。大家一块看看是怎么算的。

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;
}

posted on 2006-07-04 20:14 Calendar 阅读(6552) 评论(11)  编辑 收藏 所属分类: 所有随笔

评论

#1楼  2006-07-04 20:44 浪人|努力      
路过,先收藏下。虽然也不懂。
  回复  引用  查看    

#2楼  2006-07-05 11:23 马维峰      
按照球体来算?
  回复  引用  查看    

#3楼  2006-07-07 08:34 懒狮      
地球表面的大圆距离,hehe,高中地理好像就有的内容.
  回复  引用  查看    

#4楼 [楼主] 2006-07-12 20:30 pany之家      
按一个圆球进行计算,结果比Microsoft MapPoint计算出来的多好几个有效数字.
  回复  引用  查看    

#5楼  2006-10-07 14:48 yunping [未注册用户]
非常感谢,帮了我大忙了:)
虽然我也没看明白到底原理是什么,但验算了A(60,30),B(60,90)两点之间,此段代码和我用余弦定理算出来的结果很一致。
余弦定理的步骤是:1、算A、B弦长:地球半径R*cos(经度差60)=R/2;
2、算角AOB,O为地球圆心,利用余弦定理,
cosAOB=(2R*R-(R/2)^2) /2*R*R=7/8;
3、弧AB的长为:R*arc cos(7/8);求毕
  回复  引用    

能给个传入的经纬度值来看看吗?
我是菜鸟,
我现在有两个经纬度
(经)度.分.秒-(纬)度.分.秒
108.18.58 - 22.49.18
108.18.59 - 22.49.19

如何换成double 值?
  回复  引用    

#7楼  2006-10-18 16:20 rainbow [未注册用户]
如果考虑到地球是椭圆的话,这个公式应该是不正确的
因为计算中没有用到长轴和短轴
具体我还没有试过


  回复  引用    

#8楼  2007-01-12 15:11 李珈瑜 [未注册用户]
任意两点的经纬度怎么算距离
  回复  引用    

#9楼  2007-08-02 14:31 rian [未注册用户]
s = Math.Round(s * 10000) / 10000;
其中的Round是什么意思呀,不太明白?
  回复  引用    

@l.yun@163.com
你把分秒都换算成°的小数点形式就行了, 60进制的
  回复  引用