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

지도에서 두 위치 사이의 거리를 계산하려고 합니다. 내 데이터에 저장했습니다: 경도, 위도, X 위치, Y 위치.

이전에는 아래 스니펫을 사용했습니다.

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

누구든지 제 코드를 도와 주실 수 있나요? 제가 이미 가지고있는 것을 수정하고 싶다면 새로운 방법이 있다면 괜찮습니다.

결과가 어떤 측정 단위로 표시되는지 알려주세요.

질문에 대한 의견 (3)
해결책

SQL Server 2008을 사용 중이므로 이러한 종류의 데이터에 맞게 설계된 지리 데이터 유형을 사용할 수 있습니다:

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

SELECT @source.STDistance(@target)

Gives

----------------------
538404.100197555

(1 row(s) affected)

(가까운) 런던에서 (가까운) 에든버러까지 약 538km입니다.

당연히 먼저 배워야 할 것이 많지만, 일단 알고 나면 직접 하버신 계산을 구현하는 것보다 훨씬 쉬울 뿐만 아니라 많은 기능을 사용할 수 있습니다.


기존 데이터 구조를 유지하려는 경우 Point 메서드를 사용하여 적절한 지리 인스턴스를 구성하여 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
해설 (11)

아래 함수는 두 위치 정보 좌표 사이의 거리를 마일 단위로 제공합니다.

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에 도입된 Geography 데이터 유형 사용

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)

Reference: Ref1,Ref2

해설 (6)

마이크로소프트 (ms) 가 그 다음으로 쓰기, 브라운아저씨의 달려 들어 마치 다른 모든 복잡한 솔루션을 수 있다. 가장 간단한 방법은 슬라이드에서는 없이 추가 기능 / 너희가운데 명령문입니다:

'지역 점 선택 (, longitude_1 latitude_1 4326) 이스타디스턴스 (지역 점 (, longitude_2 latitude_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
해설 (1)

SQL 2008 이상을 사용하는 경우 GEOGRAPHY 데이터 유형을 확인하는 것이 좋습니다. SQL에는 지리적 공간 쿼리에 대한 지원이 내장되어 있습니다.

예를 들어 테이블에 좌표의 지리 공간 표현으로 채워지는 GEOGRAPHY 유형의 열이 있다고 가정해 보겠습니다(예제는 위에 링크된 MSDN 참조를 참조하세요). 이 데이터 유형은 다양한 지리공간 쿼리(예: 두 지점 사이의 거리 찾기)를 수행할 수 있는 메서드를 노출합니다.

해설 (1)
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
  • Usage:*

dbo 선택합니다. 트리스탄스크마 (37.848832506474, 37.848732506474, 27.83935546875, 27.83905546875)

  • Outputs:*

0,02849639

  • @R 매개변수입니다 floats.* 대해) 로 변경할 수 있습니다.
해설 (1)

또한 이전 답변, 슬라이드에서는 거리를 계산할 수 있는 길을 선택합니다.

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)

하지만 이들은 스칼라 함수 또한 매우 비효율적인 작업 때 많은 양의 데이터를 컴퓨팅용으로.

누군가 이 도움이 됐으면 좋겠다 "고 말했다.

해설 (0)