紧急啊~!~~
请问谁知道用经纬度计算距离的公式?
我在网上找到了这条命令
d=111.12cos{ 1/[sinΦAsinΦB十 cosΦAcosΦBcos(λB—λA)]}
其中A点经度,纬度分别为λA和ΦA,B点的经度、纬度分别为λB和ΦB,d为距离。可是答案不对啊 
还有  这里面的111.12是怎么算出来的?
请达人们赐教啊 !!!

解决方案 »

  1.   

    假设地球是一个标准球体,半径为R,并且假设东经为正,西经为负,北纬为正,南纬为负, 
    则 A(x,y)的坐标可表示为(R*cosy*cosx,R*cosy*sinx,R*siny) 
    B(a,b)可表示为(R*cosb*cosa,R*cosb*sina,R*sinb) 
    于是,AB对于球心所张的角的余弦大小为 
    cosb*cosy*(cosa*cosx+sina*sinx)+sinb*siny=cosb*cosy*cos(a-x)+sinb*siny 
    因此AB两点的球面距离为 
    R*{arccos[cosb*cosy*cos(a-x)+sinb*siny]} 注:1.x,y,a,b都是角度,最后结果中给出的arccos因为弧度形式。 
    2.所谓的“东经为正,西经为负,北纬为正,南纬为负”是为了计算的方便。 
    比如某点为西京145°,南纬36°,那么计算时可用(-145°,-36°) 
    3.AB对球心所张角的球法实际上是求<OA>和<OB>两向量的夹角K。 
    用公式<OA>*<OB>=|OA|*|OB|*cosK 
    可以得到。
      

  2.   

    根据地球上两个地点的经度和纬度,如何获得这两点的球面距离或直线距离? 假设前提是两个地点均在地表面的零海拔,且地球为理想球体。 
    假设A点的经度、纬度分别为λA和ΦA, B点的经度、纬度分别为λB和ΦB,d为距离。 
    D = arc cos((sin北纬A×sin北纬B)+(cos北纬A×cos北纬B×cosAB两地经度差绝对值) )×地球平均半径 
    其中地球平均半径为6371.004 km,D的单位为km 
    ------------------------------------------------------- 
    代入公式,得到你给出的甲乙两地的距离是:322.59548844824 公里(由于地球乃近似球体,所以后面精确的小数位其实并无意义) 
    ------------------------------------------------------ 
    至于网上流传的以下公式,经推导验证都是错误的。 
    D=111.12×cos-1[sinΦAsinΦB十cosΦAcosΦBcos(λB—λA)] 
    D = arc cos(sin北纬A×sin北纬B+cos北纬A×cos北纬B×cosAB两地经度差绝对值)÷360×2PI×6371 
    验证条件: 
    经度或者纬度只差1度时的距离为 
    D1 = 地球经线或赤道周长÷360 
    = 6371.004×2×3.1415926536÷360 
    = 111.19499645809008 km 
    约111.2千米。 被这条否决掉了
    不过不明白这条公式里 arc 是什么意思
    D = arc cos((sin北纬A×sin北纬B)+(cos北纬A×cos北纬B×cosAB两地经度差绝对值) )×地球平均半径 
    其中地球平均半径为6371.004 km,D的单位为km 
      

  3.   

    下面的可以参考一些: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;
    }