2010-07-26 2 views
32

geography.STDistance()를 사용하여 두 단일 지점 위치 사이의 거리를 반환합니다. 반환 값에 어떤 측정이 사용되는지 궁금합니다. 그것은 KM 's, 마일 또는 다른 어떤 것입니까?SQL Server 2008 GEOGRAPHY STDistance() 값

결과가 250k 이상으로 올라가고 있지만, 인스턴트 메신저 (TSQL)에 역사적인 위치 (즉, 더 이상 존재하지 않는 곳)가 있으므로 빠른 검색을 수행 할 수 없기 때문에 인스턴트 메신저로 뭔가 잘못하고 있는지 잘 모르겠습니다.

declare @p1 geography 

declare @p2 geography 

SELECT @p1 = Location from tblLocations where Id = 1 
SELECT @p2 = Location from tblLocations where Id = 2 

select @p1.STDistance(@p2) 

답변

56

나는 반환 측정이 해당 지역 데이터 유형의 Spatial Reference Identifiers (SRIDs) 에 따라 달라집니다 생각합니다. 기본값은 미터 단위의 4326입니다. DB에 테이블이 있습니다. Select * from sys.spatial_reference_systems

7

STDistance를 GEOMETRY 유형과 함께 사용하는 경우 여기에 도착한 사람들을 포괄하기 위해 결과는 "좌표 값 자체와 동일한 측정 단위로 표현됩니다"(WGS84/SRID 4326 데이터가도 단위 인 'Beginning Spatial with SQL Server 2008'에서)

다음 SQL은 SQL Server 2008 R2 이상에서 실행되어야합니다 (에딘버러 웨이 벌리 및 런던 체 링 크로스의 위치 데이터 원본 스테이션 빙지도) :

DECLARE @edinGeom GEOMETRY = GEOMETRY::STGeomFromText('POINT(-3.1917 55.9517)', 4326) 
DECLARE @cxGeom GEOMETRY = GEOMETRY::STGeomFromText('POINT(-0.1252 51.5083)', 4326) 
SELECT @edinGeom.STDistance(@cxGeom), sqrt(square(3.1917-0.1252) + square(55.9517-51.5083)) AS 'Distance from Pythagoras'; 

DECLARE @MetersPerMile FLOAT = 1609.344; 
DECLARE @edinGeog GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT(-3.1917 55.9517)', 4326) 
DECLARE @cxGeog GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT(-0.1252 51.5083)', 4326) 
SELECT @edinGeog.STDistance(@cxGeog), @edinGeog.STDistance(@cxGeog)/@MetersPerMile; 

첫 번째 검색 결과 기하 형태를 사용하여 3 개 라인은 :

STDistance 기하 구조 : 피타고라스 가입일 5.39881707506376, 거리 : 지리 유형 5.39881707506376

결과는 :

STDistance Geog : 534226.761544321 변환 된 까지 마일 : 331.953119745885

GEOGRAPHY 계산에서 '331 마일' 두 점 사이의 거리로 Bing지도에 표시된 것과 잘 일치하는 변환과의 관계가 있습니다 (분명히 이것은 어떤 증거도 아니지만 비슷한 기본 계산을 의미합니다).

GEOMETRY 계산 결과는 피타고라스를 사용하여 계산 된 결과와 함께 결과가 매우 명확하게 나타남을 보여줍니다 (점과 다각형 사이의 거리가 멀어지면 기본 계산이 더 복잡해집니다).