7

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 から数値への変換エラー。

上記のコードを解決したり、より良い解決策を思いついたりできる人はいますか?

4

5 に答える 5

5

I wrote a blog a couple years ago that explains how this can be done without using the spatial data types. Since it appears as though you have a table of longitude/latitude values, this blog will likely help a lot.

SQL Server Zipcode Latitude Longitude Proximity Search

Same page saved from Archive.org

于 2013-07-09T16:03:06.823 に答える
2

私のテーブルには、[Name]、[Timings]、[Description]、[Lattitude]、[Longitude] の 5 つのフィールドがあります。ここで、ユーザーは現在の場所と、結果が必要な距離を渡すことができます。

declare @latitude float, @longitude float, @distance float 
select @latitude = 28.6493, @longitude = 77.2217 , @distance = 5
;with RestroomLocationsWithDistance as
    (
        select
        [Name]   ,[Timings]     ,[Description],   
        ( 3959 * acos( cos( radians(@latitude) ) * cos( radians( [Lattitude] ) ) * cos( radians( [Longitude] )
       - radians(@longitude) ) + sin( radians(@latitude) ) * sin( radians( [Lattitude] ) ) ) )  As Distance            
        FROM [dbo].[Locations]
    )
    select
    [Name]   ,[Timings]     ,[Description],    Distance        
    from RestroomLocationsWithDistance
    where Distance <= @distance
于 2015-08-27T10:09:42.917 に答える
0

ここで、上記のMikeの関数をどのように使用したか:

    SELECT TOP 1 [State], [City], [AddressID], sqrt(square(abs(la.Latitude-@lat)) + square(abs(la.Longitude-@lng))) as Distance
    FROM [LocationAddresses] la     
    ORDER BY Distance
于 2016-05-27T02:15:31.997 に答える