2

米国の郵便番号と、これらの郵便番号の緯度と経度を含むテーブルを作成しました。緯度と経度から地理列を作成しました。その 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 を読みましたが、クエリは正しいようです。誰でも私を助けてもらえますか?

4

1 に答える 1