2013-04-24 6 views
2

Я создал таблицу, содержащую американские zipcodes, а также широту и долготу этих почтовых индексов. С широты и долготы я создал географическую колонку. Я создал пространственный индекс в этом столбце географии. Я хочу, чтобы вернуть ближайшие 100 почтовых индексы до широты и долгот, поэтому я создал следующую хранимую процедуру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 

Однако, когда я прохожу широту = 35.48330 и долготы = -97.17340 к этой хранимой процедуре я получаю следующее возвращенной в пункте 55

869531 US 73045 Harrah Oklahoma OK 35,48330 -97,17340 0xE6100000010C12143FC6DCBD4140174850FC184B58C0 55894,2236191955

в последней колонке расстояние. В основном запрос говорит, что эта запись почти на 56 км от введенной точки, но широта и долгота одинаковы.

Я прочитал MSDN, и мой запрос выглядит правильно. Кто-нибудь может мне помочь?

+0

Является ли [ГеографияCol] точкой или каким-либо другим объектом? Если это многоугольник, а ваш lat/lng - это .EnvelopeCenter(), я могу себе представить расстояние ... хотя, вероятно, не 56 км. – fortboise

ответ

1

Это был doozy, и я не уверен, что получил его. Я начал с попытки тиражировать в чистом виде то, что вы видели: неправильное 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 метров (SRID 4326 использует метров в качестве единицы расстояния), поэтому я постоянно чесать голову. Единственное, что я заметил, что я не могу повторить это: вы переворачивается между географией и геометрией (ваш код от вопроса):

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

Когда я шлепнулся, что в моем коде я все еще получил 0 на расстоянии. Поэтому мой единственный вопрос и, возможно, вы можете разместить T-SQL, это ваш пространственный индекс. Я думаю, что расчет STDistance() будет использовать индекс. Поэтому, не увидев индекс и зная, что вы прыгали между Географией и Геометрией, по крайней мере, в этом случае, я задаюсь вопросом, есть ли нечетные результаты, так как я не могу воспроизвести его с помощью моего выше кода.

Смежные вопросы