如何从两个位置的经度和纬度找到距离?

我有一套纬度和经度的位置。

  • 如何找到从一个位置到另一个位置的距离
  • 有配方吗?

  • Haversine公式假设球形地球。 但是,耳朵的形状更复杂。 扁球模型会给出更好的结果。

    如果需要这样的精确度,你最好使用Vincenty逆公式 。 详情请参阅http://en.wikipedia.org/wiki/Vincenty's_formulae。 使用它,您可以获得0.5毫米的球体模型精度。

    没有完美的公式 ,因为地球的真实形状太复杂,无法用公式表达。 此外,由于气候事件,地球的形状也会发生变化(见http://www.nasa.gov/centers/goddard/earthandsun/earthshape.html),并且随着时间的推移会由于地球的旋转而发生变化。

    你还应该注意,上面的方法并没有考虑到海拔高度,并且假定了一个海平面扁球体。

    编辑2010年7月10日:我发现有一些罕见的情况下Vincenty逆公式不会收敛到声明的精度。 更好的主意是使用GeographicLib(参见http://sourceforge.net/projects/geographiclib/),它也更加准确。


    这里有一个:http://www.movable-type.co.uk/scripts/latlong.html

    使用Haversine公式:

    R = earth’s radius (mean radius = 6,371km)
    Δlat = lat2− lat1
    Δlong = long2− long1
    a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
    c = 2.atan2(√a, √(1−a))
    d = R.c 
    

    应用Haversine公式来查找距离。 请参阅下面的C#代码来查找2个坐标之间的距离。 更好的是,如果您想要查找某个半径内的商店列表,则可以将SQL中的WHERE子句或C#中的LINQ过滤器应用于它。

    这里的公式是以公里为单位,您将不得不更改相关的数字,它将以英里为单位。

    例如: 将6371.392896转换为英里。

        DECLARE @radiusInKm AS FLOAT
        DECLARE @lat2Compare AS FLOAT
        DECLARE @long2Compare AS FLOAT
        SET @radiusInKm = 5.000
        SET @lat2Compare = insert_your_lat_to_compare_here
        SET @long2Compare = insert_you_long_to_compare_here
    
        SELECT * FROM insert_your_table_here WITH(NOLOCK)
        WHERE (6371.392896*2*ATN2(SQRT((sin((radians(GeoLatitude - @lat2Compare)) / 2) * sin((radians(GeoLatitude - @lat2Compare)) / 2)) + (cos(radians(GeoLatitude)) * cos(radians(@lat2Compare)) * sin(radians(GeoLongitude - @long2Compare)/2) * sin(radians(GeoLongitude - @long2Compare)/2)))
        , SQRT(1-((sin((radians(GeoLatitude - @lat2Compare)) / 2) * sin((radians(GeoLatitude - @lat2Compare)) / 2)) + (cos(radians(GeoLatitude)) * cos(radians(@lat2Compare)) * sin(radians(GeoLongitude - @long2Compare)/2) * sin(radians(GeoLongitude - @long2Compare)/2)))
        ))) <= @radiusInKm
    

    如果你想在C#中执行Haversine公式,

        double resultDistance = 0.0;
        double avgRadiusOfEarth = 6371.392896; //Radius of the earth differ, I'm taking the average.
    
        //Haversine formula
        //distance = R * 2 * aTan2 ( square root of A, square root of 1 - A )
        //                   where A = sinus squared (difference in latitude / 2) + (cosine of latitude 1 * cosine of latitude 2 * sinus squared (difference in longitude / 2))
        //                   and R = the circumference of the earth
    
        double differenceInLat = DegreeToRadian(currentLatitude - latitudeToCompare);
        double differenceInLong = DegreeToRadian(currentLongitude - longtitudeToCompare);
        double aInnerFormula = Math.Cos(DegreeToRadian(currentLatitude)) * Math.Cos(DegreeToRadian(latitudeToCompare)) * Math.Sin(differenceInLong / 2) * Math.Sin(differenceInLong / 2);
        double aFormula = (Math.Sin((differenceInLat) / 2) * Math.Sin((differenceInLat) / 2)) + (aInnerFormula);
        resultDistance = avgRadiusOfEarth * 2 * Math.Atan2(Math.Sqrt(aFormula), Math.Sqrt(1 - aFormula));
    

    DegreesToRadian是我自定义创建的函数,它是"Math.PI * angle / 180.0的简单1班轮

    我的博客条目 - SQL Haversine

    链接地址: http://www.djcxy.com/p/70961.html

    上一篇: How to find distance from the latitude and longitude of two locations?

    下一篇: How can I sort a List<Issue> by date