Programming

두 좌표 사이의 거리를 계산하는 기능

procodes 2020. 8. 11. 21:23
반응형

두 좌표 사이의 거리를 계산하는 기능


현재 아래 기능을 사용하고 있는데 제대로 작동하지 않습니다. Google지도에 따르면, 사이의 거리가 이 좌표 (에서 59.3293371,13.4877472까지이 59.3225525,13.4619422)있는 2.2함수 반환하면서 킬로미터 1.6거리에 있습니다. 이 함수가 올바른 거리를 반환하도록하려면 어떻게해야합니까?

function getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2) {
  var R = 6371; // Radius of the earth in km
  var dLat = deg2rad(lat2-lat1);  // deg2rad below
  var dLon = deg2rad(lon2-lon1); 
  var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2)
    ; 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
  var d = R * c; // Distance in km
  return d;
}

function deg2rad(deg) {
  return deg * (Math.PI/180)
}

jsFiddle : http://jsfiddle.net/edgren/gAHJB/


당신이 사용하고있는 것은이라고 하버 사인 공식 구에 두 점 사이의 거리를 계산, 까마귀 파리 등을 . 제공 한 Google지도 링크는 직선이 아니기 때문에 거리를 2.2km로 표시합니다.

Wolphram Alpha는 지리 계산을 수행하는 데 유용한 리소스 이며이 두 지점 사이 의 거리가 1.652km임을 보여줍니다 .

주행 거리 대 직선 거리 (빨간색 라인 광산).

직선 거리 (까마귀 파일)를 찾고 있다면 함수가 올바르게 작동하는 것입니다. 원하는 것이 운전 거리 (또는 자전거 거리, 대중 교통 거리 또는 도보 거리) 인 경우 매핑 API ( 가장 인기있는 Google 또는 Bing )를 사용하여 거리를 포함하는 적절한 경로를 가져와야합니다.

덧붙여서 Google Maps API는 google.maps.geometry.spherical네임 스페이스 에서 구형 거리에 대한 패키징 된 메서드를 제공합니다 (를 찾습니다 computeDistanceBetween). 직접 굴리는 것보다 낫습니다 (먼저 지구 반경에 더 정확한 값을 사용합니다).

우리 중 까다로운 사람들에게 "직선 거리"라고 말할 때 저는 "구의 직선"을 의미합니다. 물론 실제로는 곡선 (즉, 대원 거리)입니다.


나는 전에 비슷한 방정식을 작성했습니다. 테스트하고 1.6km를 얻었습니다.

당신의 구글지도는 운전 거리를 보여주고있었습니다.

당신의 함수는 까마귀가 날아갈 때 (직선 거리) 계산됩니다.

alert(calcCrow(59.3293371,13.4877472,59.3225525,13.4619422).toFixed(1));



    //This function takes in latitude and longitude of two location and returns the distance between them as the crow flies (in km)
    function calcCrow(lat1, lon1, lat2, lon2) 
    {
      var R = 6371; // km
      var dLat = toRad(lat2-lat1);
      var dLon = toRad(lon2-lon1);
      var lat1 = toRad(lat1);
      var lat2 = toRad(lat2);

      var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
      var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
      var d = R * c;
      return d;
    }

    // Converts numeric degrees to radians
    function toRad(Value) 
    {
        return Value * Math.PI / 180;
    }

Derek의 솔루션은 저에게 잘 작동했으며 단순히 PHP로 변환했습니다. 다른 사람에게 도움이되기를 바랍니다.

function calcCrow($lat1, $lon1, $lat2, $lon2){
        $R = 6371; // km
        $dLat = toRad($lat2-$lat1);
        $dLon = toRad($lon2-$lon1);
        $lat1 = toRad($lat1);
        $lat2 = toRad($lat2);

        $a = sin($dLat/2) * sin($dLat/2) +sin($dLon/2) * sin($dLon/2) * cos($lat1) * cos($lat2); 
        $c = 2 * atan2(sqrt($a), sqrt(1-$a)); 
        $d = $R * $c;
        return $d;
}

// Converts numeric degrees to radians
function toRad($Value) 
{
    return $Value * pi() / 180;
}

이 시도. VB.net에 있으며 Javascript로 변환해야합니다. 이 함수는 십진 분 단위의 매개 변수를받습니다.

    Private Function calculateDistance(ByVal long1 As String, ByVal lat1 As String, ByVal long2 As String, ByVal lat2 As String) As Double
    long1 = Double.Parse(long1)
    lat1 = Double.Parse(lat1)
    long2 = Double.Parse(long2)
    lat2 = Double.Parse(lat2)

    'conversion to radian
    lat1 = (lat1 * 2.0 * Math.PI) / 60.0 / 360.0
    long1 = (long1 * 2.0 * Math.PI) / 60.0 / 360.0
    lat2 = (lat2 * 2.0 * Math.PI) / 60.0 / 360.0
    long2 = (long2 * 2.0 * Math.PI) / 60.0 / 360.0

    ' use to different earth axis length
    Dim a As Double = 6378137.0        ' Earth Major Axis (WGS84)
    Dim b As Double = 6356752.3142     ' Minor Axis
    Dim f As Double = (a - b) / a        ' "Flattening"
    Dim e As Double = 2.0 * f - f * f      ' "Eccentricity"

    Dim beta As Double = (a / Math.Sqrt(1.0 - e * Math.Sin(lat1) * Math.Sin(lat1)))
    Dim cos As Double = Math.Cos(lat1)
    Dim x As Double = beta * cos * Math.Cos(long1)
    Dim y As Double = beta * cos * Math.Sin(long1)
    Dim z As Double = beta * (1 - e) * Math.Sin(lat1)

    beta = (a / Math.Sqrt(1.0 - e * Math.Sin(lat2) * Math.Sin(lat2)))
    cos = Math.Cos(lat2)
    x -= (beta * cos * Math.Cos(long2))
    y -= (beta * cos * Math.Sin(long2))
    z -= (beta * (1 - e) * Math.Sin(lat2))

    Return Math.Sqrt((x * x) + (y * y) + (z * z))
End Function

자바 스크립트에서 변환 된 함수 편집

function calculateDistance(lat1, long1, lat2, long2)
  {    

      //radians
      lat1 = (lat1 * 2.0 * Math.PI) / 60.0 / 360.0;      
      long1 = (long1 * 2.0 * Math.PI) / 60.0 / 360.0;    
      lat2 = (lat2 * 2.0 * Math.PI) / 60.0 / 360.0;   
      long2 = (long2 * 2.0 * Math.PI) / 60.0 / 360.0;       


      // use to different earth axis length    
      var a = 6378137.0;        // Earth Major Axis (WGS84)    
      var b = 6356752.3142;     // Minor Axis    
      var f = (a-b) / a;        // "Flattening"    
      var e = 2.0*f - f*f;      // "Eccentricity"      

      var beta = (a / Math.sqrt( 1.0 - e * Math.sin( lat1 ) * Math.sin( lat1 )));    
      var cos = Math.cos( lat1 );    
      var x = beta * cos * Math.cos( long1 );    
      var y = beta * cos * Math.sin( long1 );    
      var z = beta * ( 1 - e ) * Math.sin( lat1 );      

      beta = ( a / Math.sqrt( 1.0 -  e * Math.sin( lat2 ) * Math.sin( lat2 )));    
      cos = Math.cos( lat2 );   
      x -= (beta * cos * Math.cos( long2 ));    
      y -= (beta * cos * Math.sin( long2 ));    
      z -= (beta * (1 - e) * Math.sin( lat2 ));       

      return (Math.sqrt( (x*x) + (y*y) + (z*z) )/1000);  
    }

자바 스크립트에서 두 점 사이의 거리 계산

function distance(lat1, lon1, lat2, lon2, unit) {
        var radlat1 = Math.PI * lat1/180
        var radlat2 = Math.PI * lat2/180
        var theta = lon1-lon2
        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
        if (unit=="K") { dist = dist * 1.609344 }
        if (unit=="N") { dist = dist * 0.8684 }
        return dist
}

자세한 내용은 다음을 참조 하십시오 : 참조 링크

참고 URL : https://stackoverflow.com/questions/18883601/function-to-calculate-distance-between-two-coordinates

반응형