sql >> データベース >  >> RDS >> Sqlserver

ms-sql で最も近い場所を見つける

    この機能を使用

    CREATE FUNCTION dbo.DictanceKM(@lat1 FLOAT, @lat2 FLOAT, @lon1 FLOAT, @lon2 FLOAT)
    RETURNS FLOAT 
    AS
    BEGIN
    
        RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371
    END
      

    この関数で注文できますが、大規模なデータセットでは非常に遅くなるため、レコードセットを事前にフィルター処理してみてください

    最新情報:

    @chopikadze のテスト データの使用:

    declare @lat float, @lng float
    select @lat = 41.0186, @lng = 28.964701
    
    declare @Location table(Latitude float, Longtitude float, Name nvarchar(50))
    insert into @Location(Latitude, Longtitude, Name) values (41.0200500000, 40.5234490000, 'a')
    insert into @Location(Latitude, Longtitude, Name) values (41.0185714000, 37.0975924000, 'b')
    insert into @Location(Latitude, Longtitude, Name) values (41.0184913000, 34.0373739000, 'c')
    insert into @Location(Latitude, Longtitude, Name) values (41.0166667000, 39.5833333000, 'd')
    insert into @Location(Latitude, Longtitude, Name) values (41.0166667000, 28.9333333000, 'e')
    
    SELECT ABS(dbo.DictanceKM(@lat, Latitude, @lng, Longtitude)) DistanceKm, * FROM @Location
    ORDER BY ABS(dbo.DictanceKM(@lat, Latitude, @lng, Longtitude))
      

    地球がジオイドではなく丸い球であると仮定すると、1m 未満の正確な公式が必要な場合は、見つけることができます。持っていない



    1. 長い文字列のOracleCLOBまたはBLOBを挿入する方法

    2. SQL Server 2008 で c# からの複数のデータベース更新を処理する

    3. PostgreSQLのSlonyレプリケーションに関するエキスパートガイド

    4. IntegrityErrorの原因となる行を無視するDjangobulk_create?