2011-09-20 15 views
6

場所とその緯度と経度を持つテーブルがあります。緯度と経度を使用してSQL Server 2008の2つの場所間の戻り距離

SQL Server 2008で、特定の緯度と経度を中心点として25キロ以内の場所を一覧表示する機能を作成しようとしています。

私は、これは私達の機能を起動してテストするための良い方法である場合放浪と中心点(現在位置)と目標位置(経度@緯度/)との間の現在の距離を得ていた。

ALTER FUNCTION [dbo].[GetDistanceFromLocation] 
( 
    @myCurrentLatitude float, 
    @myCurrentLongitude float, 
    @latitude float, 
    @longitude float 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @radiusOfTheEarth int 
    SET @radiusOfTheEarth = 6371--km 

    DECLARE @distance int 
    SELECT @distance = (@radiusOfTheEarth 
     * acos(cos(radians(@myCurrentLatitude)) 
     * cos(radians(@latitude)) 
     * cos(radians(@longitude) - radians(@myCurrentLongitude)) + sin(radians(@myCurrentLatitude)) 
     * sin(radians(@latitude)))) 

    RETURN @distance 

END 

それは正しいのか、それとも何か不足していますか?

答えて

11

great-circle distanceの式を使用しているようですが、これはおそらく十分正確ですが、その裁判官になる必要があります。

あなたの数式の結果を確認したい場合は、geographyデータ型を使用することができます

declare @geo1 geography = geography::Point(@lat1, @long1, 4326), 
     @geo2 geography = geography::Point(@lat2, @long2, 4326) 

select @geo1.STDistance(@geo2) 

を、あなたがproximity searchを行っているので、あなたはさらにgeographyデータ型を調査することをお勧めします。

+0

4326とは何ですか?私はMSDNを見ようとしましたが、それに関する情報はありません。 –

+0

4326は、世界測地系参照システムの空間参照IDです。詳細については、http://technet.microsoft.com/en-us/library/bb933811.aspx http://en.wikipedia.org/wiki/SRIDおよびhttp://en.wikipedia.org/wiki/WGS84を参照してください。 –

0

有効でしょうか?

CREATE FUNCTION [dbo].[GetDistanceFromLocation] 
( 
    @CurrentLatitude float, 
    @CurrentLongitude float, 
    @latitude float, 
    @longitude float 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @geo1 geography = geography::Point(@lat1, @long1, 4268), 
      @geo2 geography = geography::Point(@lat2, @long2, 4268) 

    DECLARE @distance int 
    SELECT @distance = @geo1.STDistance(@geo2) 

    RETURN @distance 

END 

ありがとうございます!

+0

ようこそスタックオーバーフロー!これは本当にコメントであり、答えではありません。もう少し担当者がいれば、[コメントを投稿できる](// stackoverflow.com/privileges/comment)。私は削除のためにこの投稿にフラグを立てています。 –

関連する問題