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

后端 未结 12 2403
情歌与酒
情歌与酒 2020-11-29 02:40

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 f
相关标签:
12条回答
  • 2020-11-29 03:11

    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.

    E.g: 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

    0 讨论(0)
  • 2020-11-29 03:11

    Use the Great Circle Distance Formula.

    0 讨论(0)
  • 2020-11-29 03:14

    Are you looking for

    Haversine formula

    The haversine formula is an equation important in navigation, giving great-circle distances between two points on a sphere from their longitudes and latitudes. It is a special case of a more general formula in spherical trigonometry, the law of haversines, relating the sides and angles of spherical "triangles".

    0 讨论(0)
  • 2020-11-29 03:16

    here is a fiddle with finding locations / near locations to long/lat by given IP:

    http://jsfiddle.net/bassta/zrgd9qc3/2/

    And here is the function I use to calculate the distance in straight line:

    function distance(lat1, lng1, lat2, lng2) {
            var radlat1 = Math.PI * lat1 / 180;
            var radlat2 = Math.PI * lat2 / 180;
            var radlon1 = Math.PI * lng1 / 180;
            var radlon2 = Math.PI * lng2 / 180;
            var theta = lng1 - lng2;
            var radtheta = Math.PI * theta / 180;
            var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
            dist = Math.acos(dist);
            dist = dist * 180 / Math.PI;
            dist = dist * 60 * 1.1515;
    
            //Get in in kilometers
            dist = dist * 1.609344;
    
            return dist;
        }
    

    It returns the distance in Kilometers

    0 讨论(0)
  • 2020-11-29 03:17

    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.

    0 讨论(0)
  • 2020-11-29 03:17

    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 
    
    0 讨论(0)
提交回复
热议问题