2013-04-24 4 views
2

나는이 우편 번호의 위도와 경도와 함께 미국 우편 번호가 포함 된 테이블을 만들었습니다. 위도와 경도에서 지형 열을 만들었습니다. 그 지형 열에 공간 인덱스를 만들었습니다. 난 내가 반환 된 다음 얻을이 저장 프로 시저에 위도 = 35.48330와 경도를 = -97.17340 통과 할 때 내가 그러나 다음과 같은 저장 프로 시저SQL Server 2012 공간 인덱스 가장 가까운 이웃 쿼리

CREATE PROCEDURE [dbo].[Geo_Locate] 
@Latitude DECIMAL, 
@Longitude DECIMAL 
AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE @GeogTemp NVARCHAR(200) 
DECLARE @Geog GEOGRAPHY 

-- Create a geography type variable from the passed in latitude and longitude. This will be used to find the closest point in the database 
SET @GeogTemp = 'POINT(' + convert(NVARCHAR(100), @Longitude) + ' ' + convert(NVARCHAR(100), @Latitude) + ')' 
SET @Geog = geography::STGeomFromText(@GeogTemp, 4326) 

-- Run the main query 
SELECT TOP 100 
    [Id], 
    [Country], 
    [ZipPostalCode], 
    [City], 
    [County], 
    [Latitude], 
    [Longitude], 
    [GeographyCol], 
    GeographyCol.STDistance(@Geog) AS Distance 
FROM 
    [dbo].[ZipCode] WITH(INDEX(ZipCode_SpatialIndex)) 
WHERE 
    GeographyCol.STDistance(@Geog) < 100000  -- 100 KM 
ORDER BY 
    GeographyCol.STDistance(@Geog) ASC 
END 

을 만든 위도와 경도에 가까운 100 개 우편 번호를 반환하려면

869,531 항목 55 US 73,045하라 오클라호마 OK 35.48330 -97.17340 0xE6100000010C12143FC6DCBD4140174850FC184B58C0 55894.2236191955

마지막 열은 거리이다. 기본적으로 쿼리는이 레코드가 입력 된 지점에서 거의 56KM이지만 위도와 경도는 동일하다고 말합니다.

MSDN을 읽었으며 쿼리가 올바른 것처럼 보입니다. 누구든지 제발 도와 주실 래요?

+0

[GeographyCol] 또는 다른 객체입니까? 그것이 다각형이라면 그것에 대한 위도/경도는 .EnvelopeCenter()입니다. 아마도 56km가 아니더라도 거리를 상상할 수 있습니다. – fortboise

답변

1

이것은 하나 였고 나는 그것을 가지고 있는지 잘 모르겠다. 나는 두 가지 지리 포인트 사이의 부정확 한 STDistance()를 보았다.

DECLARE @zipcode geography 
DECLARE @searchpoint geography 
SET @zipcode = geography::STPointFromText('POINT(-97.17340 35.48330)', 4326); 
SET @searchpoint = geography::STPointFromText('POINT(-97.17340 35.48330)', 4326); 

SELECT @zipcode.STDistance(@searchpoint) 

결과 정확하게 0 미터 (4326 SRID의 거리 단위로 미터를 사용하여), 그래서 머리를 긁적 유지된다. 내가 복제 할 수 없습니다 것으로 나타났습니다 유일한 것은 이것이다 :

SET @Geog = geography::STGeomFromText(@GeogTemp, 4326) 

내 코드에 난 여전히 거리에 0을 가지고 있다는 풍덩 : 당신이 지리와 기하학 (질문에서 코드) 사이에 이성을 상실. 그래서 나의 유일한 질문, 아마도 T-SQL을 게시 할 수있는 것은 공간 인덱스에 관한 것입니다. 나는 STDistance() 계산이 인덱스를 사용할 것이라고 생각한다. 따라서 인덱스를 보지 않고 적어도이 경우 Geography와 Geometry 사이를 뛰어 넘었다는 것을 알지 못하더라도 위의 코드로 복제 할 수 없으므로 이상한 결과가 있는지 궁금 할 것입니다.