米国の郵便番号と、これらの郵便番号の緯度と経度を含むテーブルを作成しました。緯度と経度から地理列を作成しました。その geography 列に空間インデックスを作成しました。最も近い100の郵便番号を緯度と経度に返したいので、次のストアドプロシージャを作成しました
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 ハラー オクラホマ OK 35.48330 -97.17340 0xE6100000010C12143FC6DCBD4140174850FC184B58C0 55894.2236191955
最後の列は距離です。基本的にクエリは、このレコードが入力されたポイントからほぼ 56KM 離れているが、緯度と経度は同じであると言っています。
MSDN を読みましたが、クエリは正しいようです。誰でも私を助けてもらえますか?