SOとGoogleを検索しましたが、決定的な答えが実際には見つからなかったので、SOコミュニティに公開しました。
基本的に、私は特定の関心のあるポイントの経度と緯度のテーブルを持っています.SQLクエリは、現在どの場所にいるのかを知ることができます(パラメータとして渡されたテーブル内の場所の1つになります)。渡された緯度と経度に最も近い 1 行を返します。
SQLは通常、.NETよりもそのようなクエリの処理がはるかに速いと聞いたので、呼び出し元のアプリケーション(.NET)ではなく、MSSQL(2012 /ストアドプロシージャ)でこれをすべて行う必要がありますか?
編集:
次のような場所間のマイル数を示す STDistance 関数を見つけました。
DECLARE @NWI geography, @EDI geography
SET @NWI = geography::Point(52.675833,1.282778,4326)
SET @EDI = geography::Point(55.95,-3.3725,4326)
SELECT @NWI.STDistance(@EDI) / 1000
ただし、テーブル内のすべての緯度/経度を反復する必要はありません。これは確かにパフォーマンスにとってひどいのでしょうか?
また、以下のコメント リンクの 1 つ (MSSQL ではなく MYSQL) で指摘されている例の 1 つを変換しようとしましたが、エラーが発生しました。コードは次のとおりです。
DECLARE @orig_lat decimal(6,2), @orig_long decimal(6,2), @bounding_distance int
set @orig_lat=52.056736;
set @orig_long=1.14822;
set @bounding_distance=1;
SELECT *,((ACOS(SIN(@orig_lat * PI() / 180) * SIN('lat' * PI() / 180) + COS(@orig_lat * PI() / 180) * COS('lat' * PI() / 180) * COS((@orig_long - 'lon') * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS 'distance'
FROM [DB1].[dbo].[LatLons]
WHERE
(
'lat' BETWEEN (@orig_lat - @bounding_distance) AND (@orig_lat + @bounding_distance)
AND 'lon' BETWEEN (@orig_long - @bounding_distance) AND (@orig_long + @bounding_distance)
)
ORDER BY 'distance' ASC
受け取ったエラーは次のとおりです。
メッセージ 8114、レベル 16、状態 5、行 6 データ型 varchar から数値への変換エラー。
上記のコードを解決したり、より良い解決策を思いついたりできる人はいますか?