복붙노트

[SQL] 두 점 사이의 거리를 계산 (위도, 경도)

SQL

두 점 사이의 거리를 계산 (위도, 경도)

나는지도에서 두 위치 사이의 거리를 계산하기 위해 노력하고 있습니다. 경도, 위도, X POS, Y POS : 내 데이터에 저장했다.

나는 이전에 아래의 코드 조각을 사용하고있다.

DECLARE @orig_lat DECIMAL
DECLARE @orig_lng DECIMAL
SET @orig_lat=53.381538 set @orig_lng=-1.463526
SELECT *,
    3956 * 2 * ASIN(
          SQRT( POWER(SIN((@orig_lat - abs(dest.Latitude)) * pi()/180 / 2), 2) 
              + COS(@orig_lng * pi()/180 ) * COS(abs(dest.Latitude) * pi()/180)  
              * POWER(SIN((@orig_lng - dest.Longitude) * pi()/180 / 2), 2) )) 
          AS distance
--INTO #includeDistances
FROM #orig dest

나는 그러나 데이터가이 나오는 신뢰하지 않는, 그것은 약간 부정확 한 결과를 제공 할 것으로 보인다.

경우에 일부 샘플 데이터는 당신이 그것을 필요

Latitude        Longitude     Distance 
53.429108       -2.500953     85.2981833133896

당신은 당신이 좋은 것 이것을 달성하는 새로운 방법이 있다면 내가 이미 가지고있는 것을 해결하려는 경우 내 코드를 가진 사람의 도움이 날은, 난 상관하지 않습니다 수 없습니다.

에 측정 결과의 상태를 어떤 단위입니다하시기 바랍니다.

해결법

  1. ==============================

    1.당신은 SQL 서버 2008을 사용하고 있기 때문에, 당신은 지리 데이터가 데이터를 정확히 이런 종류의 설계된 가능한 입력있다 :

    당신은 SQL 서버 2008을 사용하고 있기 때문에, 당신은 지리 데이터가 데이터를 정확히 이런 종류의 설계된 가능한 입력있다 :

    DECLARE @source geography = 'POINT(0 51.5)'
    DECLARE @target geography = 'POINT(-3 56)'
    
    SELECT @source.STDistance(@target)
    

    부여

    ----------------------
    538404.100197555
    
    (1 row(s) affected)
    

    우리가 말하는이 (근처) 에든버러 (근처) 런던에서 538km에 관한 것입니다.

    물론이 먼저해야 할 학습의 양,하지만 당신은 그것을 훨씬 훨씬 더 쉽게 자신의 하버 사인 계산을 구현하는 것보다 알고 나면 것이다; 플러스 당신은 많은 기능을 얻을.

    기존 데이터 구조를 유지하려는 경우, 당신은 여전히 ​​포인트 방법을 사용하여 적절한 지리 인스턴스를 구성하여 STDistance을 사용할 수 있습니다 :

    DECLARE @orig_lat DECIMAL(12, 9)
    DECLARE @orig_lng DECIMAL(12, 9)
    SET @orig_lat=53.381538 set @orig_lng=-1.463526
    
    DECLARE @orig geography = geography::Point(@orig_lat, @orig_lng, 4326);
    
    SELECT *,
        @orig.STDistance(geography::Point(dest.Latitude, dest.Longitude, 4326)) 
           AS distance
    --INTO #includeDistances
    FROM #orig dest
    
  2. ==============================

    2.아래의 기능이 떨어져 두 지리 좌표 사이의 거리를 제공한다

    아래의 기능이 떨어져 두 지리 좌표 사이의 거리를 제공한다

    create function [dbo].[fnCalcDistanceMiles] (@Lat1 decimal(8,4), @Long1 decimal(8,4), @Lat2 decimal(8,4), @Long2 decimal(8,4))
    returns decimal (8,4) as
    begin
    declare @d decimal(28,10)
    -- Convert to radians
    set @Lat1 = @Lat1 / 57.2958
    set @Long1 = @Long1 / 57.2958
    set @Lat2 = @Lat2 / 57.2958
    set @Long2 = @Long2 / 57.2958
    -- Calc distance
    set @d = (Sin(@Lat1) * Sin(@Lat2)) + (Cos(@Lat1) * Cos(@Lat2) * Cos(@Long2 - @Long1))
    -- Convert to miles
    if @d <> 0
    begin
    set @d = 3958.75 * Atan(Sqrt(1 - power(@d, 2)) / @d);
    end
    return @d
    end 
    

    아래의 기능이 떨어진 두 지리 좌표 사이의 거리를 제공한다

    CREATE FUNCTION dbo.fnCalcDistanceKM(@lat1 FLOAT, @lat2 FLOAT, @lon1 FLOAT, @lon2 FLOAT)
    RETURNS FLOAT 
    AS
    BEGIN
    
        RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371
    END
    

    아래의 기능이 떨어진 두 지리 좌표 사이의 거리를 제공한다  SQL Server 2008의 도입 지리 데이터 유형을 사용

    DECLARE @g geography;
    DECLARE @h geography;
    SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);
    SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);
    SELECT @g.STDistance(@h);
    

    용법:

    select [dbo].[fnCalcDistanceKM](13.077085,80.262675,13.065701,80.258916)
    

    참조 : 전환 지시, 설정 2

  3. ==============================

    3.그것은 마이크로 소프트가 다른 모든 응답자의 뇌를 침범하고 가능한 한 복잡한 솔루션으로 쓰기 만든 것 같습니다. 여기에 추가 기능 / 선언 문없이 가장 간단한 방법은 다음과 같습니다

    그것은 마이크로 소프트가 다른 모든 응답자의 뇌를 침범하고 가능한 한 복잡한 솔루션으로 쓰기 만든 것 같습니다. 여기에 추가 기능 / 선언 문없이 가장 간단한 방법은 다음과 같습니다

    SELECT geography::Point(LATITUDE_1, LONGITUDE_1, 4326).STDistance(geography::Point(LATITUDE_2, LONGITUDE_2, 4326))
    

    간단하게 대신 LATITUDE_1, LONGITUDE_1, LATITUDE_2, LONGITUDE_2 예컨대의 데이터를 대체 :

    SELECT geography::Point(53.429108, -2.500953, 4326).STDistance(geography::Point(c.Latitude, c.Longitude, 4326))
    from coordinates c
    
  4. ==============================

    4.당신은 SQL 2008 이상을 사용하고, 나는 지리 데이터 유형을 체크 아웃 권하고 싶습니다. SQL은 지리 공간 쿼리에 대한 지원이 포함되어 있습니다.

    당신은 SQL 2008 이상을 사용하고, 나는 지리 데이터 유형을 체크 아웃 권하고 싶습니다. SQL은 지리 공간 쿼리에 대한 지원이 포함되어 있습니다.

    예를 들면 당신이 좌표의 지리 공간 표현으로 채워 것 형 지리의 테이블에 열이있을 것이다 (예는 위의 링크 된 MSDN 참조를 확인). 이 데이터 타입은 다음 방법을 사용하면 지리 공간 쿼리의 전체 호스트 (예를 들어, 두 점 사이의 거리를 찾는)을 수행 할 수 있도록 노출

  5. ==============================

    5.

    Create Function [dbo].[DistanceKM] 
    ( 
          @Lat1 Float(18),  
          @Lat2 Float(18), 
          @Long1 Float(18), 
          @Long2 Float(18)
    )
    Returns Float(18)
    AS
    Begin
          Declare @R Float(8); 
          Declare @dLat Float(18); 
          Declare @dLon Float(18); 
          Declare @a Float(18); 
          Declare @c Float(18); 
          Declare @d Float(18);
          Set @R =  6367.45
                --Miles 3956.55  
                --Kilometers 6367.45 
                --Feet 20890584 
                --Meters 6367450 
    
    
          Set @dLat = Radians(@lat2 - @lat1);
          Set @dLon = Radians(@long2 - @long1);
          Set @a = Sin(@dLat / 2)  
                     * Sin(@dLat / 2)  
                     + Cos(Radians(@lat1)) 
                     * Cos(Radians(@lat2))  
                     * Sin(@dLon / 2)  
                     * Sin(@dLon / 2); 
          Set @c = 2 * Asin(Min(Sqrt(@a))); 
    
          Set @d = @R * @c; 
          Return @d; 
    
    End
    GO
    

    용법:

    dbo.DistanceKM 선택 (37.848832506474, 37.848732506474, 27.83935546875을, 27.83905546875)

    출력 :

    0,02849639

    당신은 주석 수레와 @R 매개 변수를 변경할 수 있습니다.

  6. ==============================

    6.이전 답변뿐만 아니라, 여기에 SELECT 내부의 거리를 계산하는 방법입니다 :

    이전 답변뿐만 아니라, 여기에 SELECT 내부의 거리를 계산하는 방법입니다 :

    CREATE FUNCTION Get_Distance
    (   
        @La1 float , @Lo1 float , @La2 float, @Lo2 float
    )
    RETURNS TABLE 
    AS
    RETURN 
        -- Distance in Meters
        SELECT GEOGRAPHY::Point(@La1, @Lo1, 4326).STDistance(GEOGRAPHY::Point(@La2, @Lo2, 4326))
        AS Distance
    GO
    

    용법:

    select Distance
    from Place P1,
         Place P2,
    outer apply dbo.Get_Distance(P1.latitude, P1.longitude, P2.latitude, P2.longitude)
    

    스칼라 기능도 작동하지만 많은 양의 데이터를 계산할 때 그들은 매우 비효율적이다.

    나는이 힘 도움말 사람을 바랍니다.

  7. from https://stackoverflow.com/questions/13026675/calculating-distance-between-two-points-latitude-longitude by cc-by-sa and MIT license