How to find distance from the latitude and longitude of two locations?

I have a set of latitudes and longitudes of locations.

  • How to find distance from one location in the set to another?
  • Is there a formula ?

  • The Haversine formula assumes a spherical earth. However, the shape of the earh is more complex. An oblate spheroid model will give better results.

    If such accuracy is needed, you should better use Vincenty inverse formula . See http://en.wikipedia.org/wiki/Vincenty's_formulae for details. Using it, you can get a 0.5mm accuracy for the spheroid model.

    There is no perfect formula , since the real shape of the earth is too complex to be expressed by a formula. Moreover, the shape of earth changes due to climate events (see http://www.nasa.gov/centers/goddard/earthandsun/earthshape.html), and also changes over time due to the rotation of the earth.

    You should also note that the method above does not take altitudes into account, and assumes a sea-level oblate spheroid.

    Edit 10-Jul-2010: I found out that there are rare situations for which Vincenty inverse formula does not converge to the declared accuracy. A better idea is to use GeographicLib (see http://sourceforge.net/projects/geographiclib/) which is also more accurate.


    Here's one: http://www.movable-type.co.uk/scripts/latlong.html

    Using Haversine formula:

    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 
    

    Apply the Haversine formula to find the distance. See the C# code below to find the distance between 2 coordinates. Better still if you want to say find a list of stores within a certain radius, you could apply a WHERE clause in SQL or a LINQ filter in C# to it.

    The formula here is in kilometres, you will have to change the relevant numbers and it will work for miles.

    Eg: Convert 6371.392896 to miles.

        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
    

    If you would like to perform the Haversine formula in C#,

        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 is a function I custom created, its is a simple 1 liner of "Math.PI * angle / 180.0

    My blog entry - SQL Haversine

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

    上一篇: 经纬度/公里距离的简单计算?

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