2017-03-22 4 views
0

이것은 쓰레기입니다. 그러나 어쨌든 나는 더 많은 경험을 가진 두뇌를 고를 것이라고 생각했습니다.t-SQL : 지리 내 select 문 POINT 문자열

아마도 다음과 같은 쿼리를 사용하여 두 좌표 집합 사이의 거리를 찾을 수 있습니다.

DECLARE @source geography = 'POINT(-93.54803 39.790132)' 
DECLARE @target geography = 'POINT(-105.0207 39.9652)' 
SELECT @source.STDistance(@target)/1609.344 AS distance_in_miles 

은 내가 하버 사인 공식을 사용하지 않고 두 우편 번호 사이의 거리를 찾을 수있는 방법을 원했다, 그래서 나는이 쓴 :

DECLARE @source GEOGRAPHY 
DECLARE @target GEOGRAPHY 
DECLARE @Szip VARCHAR(10) = '64601' 
DECLARE @Ezip VARCHAR(10) = '80023' 
SET @source = (SELECT longitude+ ' ' +latitude FROM us_loc_data WHERE @Szip = zip) 
SET @target = (SELECT longitude+ ' ' +latitude FROM us_loc_data WHERE @Ezip = zip) 
SELECT @source.STDistance(@target)/1609.344 AS distance_in_miles 

나는 위에서 작동합니다 생각하지 않고를 System.FormatException : 5 닷넷 프레임 워크 오류가 사용자 정의 루틴 또는 집계 "지리"의 실행 중에 발생

메시지 6522, 수준 16, 상태 1 라인 : 그것은 이런 이유로 작동하지 않았다 : 24114 : Th 입력 된 잘 알려진 텍스트 (WKT)의 e 레이블 -93.54803 39.790132가 유효하지 않습니다.

필자의 현재 이해는 이것이 실제로 작동하려면 괄호 안에 캡슐화 된 좌표 쌍을 문자열의 시작 부분에 POINT가있는 인용 부호 사이에 끼워 넣어야합니다.

내가하려는 일이 원격으로 가능한지 궁금합니다. 어떻게 든 select 문을 내 변수 (@source & @target)에 할당하여 명시 적으로 을 지정하는 대신 좌표를 쿼리 할 수 ​​있습니까? 좌표를 사용하고 싶습니까? (내 우편 번호 데이터베이스를 사용)

답변

1

DECLARE @Origin GEOGRAPHY 
DECLARE @Target GEOGRAPHY 
DECLARE @Szip VARCHAR(10) = '64601' 
DECLARE @Ezip VARCHAR(10) = '80023' 
Select @Origin =GEOGRAPHY::Point([latitude], [longitude], 4326) from us_loc_data WHERE @Szip = zip 
Select @Target =GEOGRAPHY::Point([latitude], [longitude], 4326) from us_loc_data WHERE @Ezip = zip 
SELECT Distance = @Origin.STDistance(@Target)/1609.344 

반환

610.093230351351 
+0

다시, 저를 도와 주셔서 감사합니다 :) 도움을 –

+0

@AnthonySims 행복 .. 다시 ... :) –