[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.당신은 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.아래의 기능이 떨어져 두 지리 좌표 사이의 거리를 제공한다
아래의 기능이 떨어져 두 지리 좌표 사이의 거리를 제공한다
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.그것은 마이크로 소프트가 다른 모든 응답자의 뇌를 침범하고 가능한 한 복잡한 솔루션으로 쓰기 만든 것 같습니다. 여기에 추가 기능 / 선언 문없이 가장 간단한 방법은 다음과 같습니다
그것은 마이크로 소프트가 다른 모든 응답자의 뇌를 침범하고 가능한 한 복잡한 솔루션으로 쓰기 만든 것 같습니다. 여기에 추가 기능 / 선언 문없이 가장 간단한 방법은 다음과 같습니다
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.당신은 SQL 2008 이상을 사용하고, 나는 지리 데이터 유형을 체크 아웃 권하고 싶습니다. SQL은 지리 공간 쿼리에 대한 지원이 포함되어 있습니다.
당신은 SQL 2008 이상을 사용하고, 나는 지리 데이터 유형을 체크 아웃 권하고 싶습니다. SQL은 지리 공간 쿼리에 대한 지원이 포함되어 있습니다.
예를 들면 당신이 좌표의 지리 공간 표현으로 채워 것 형 지리의 테이블에 열이있을 것이다 (예는 위의 링크 된 MSDN 참조를 확인). 이 데이터 타입은 다음 방법을 사용하면 지리 공간 쿼리의 전체 호스트 (예를 들어, 두 점 사이의 거리를 찾는)을 수행 할 수 있도록 노출
-
==============================
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.이전 답변뿐만 아니라, 여기에 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)
스칼라 기능도 작동하지만 많은 양의 데이터를 계산할 때 그들은 매우 비효율적이다.
나는이 힘 도움말 사람을 바랍니다.
from https://stackoverflow.com/questions/13026675/calculating-distance-between-two-points-latitude-longitude by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 대소 문자 구분 문자열 비교 (0) | 2020.03.25 |
---|---|
[SQL] MySQL은 - 하나 개의 쿼리에서 다른 값으로 UPDATE 여러 행 (0) | 2020.03.25 |
[SQL] SQL SET UPDATE 하나의 열은 다른 열 참조하는 관련 테이블의 값과 동일하도록? (0) | 2020.03.25 |
[SQL] MYSQL 업데이트 문 내부는 테이블을 조인 (0) | 2020.03.25 |
[SQL] 관계형 데이터베이스에서 키 값 쌍 (0) | 2020.03.25 |