지도에서 두 위치 사이의 거리를 계산하려고 합니다. 내 데이터에 저장했습니다: 경도, 위도, 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
누구든지 제 코드를 도와 주실 수 있나요? 제가 이미 가지고있는 것을 수정하고 싶다면 새로운 방법이 있다면 괜찮습니다.
결과가 어떤 측정 단위로 표시되는지 알려주세요.
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
아래 함수는 두 위치 정보 좌표 사이의 거리를 마일 단위로 제공합니다.
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)
마이크로소프트 (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
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 선택합니다. 트리스탄스크마 (37.848832506474, 37.848732506474, 27.83935546875, 27.83905546875)
0,02849639
또한 이전 답변, 슬라이드에서는 거리를 계산할 수 있는 길을 선택합니다.
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)
하지만 이들은 스칼라 함수 또한 매우 비효율적인 작업 때 많은 양의 데이터를 컴퓨팅용으로.
누군가 이 도움이 됐으면 좋겠다 "고 말했다.