2012-02-25 9 views
1

私は近接を数えるためにmysqlを使用していますが、以下のようなdistanceという名前のプロシージャを作成しましたが、プロシージャは正しく動作しませんが、SQL文が動作しています両方とも私はHaversine formulasだと思いますが、私には適切な結果を与えていません。 I式のためHaversine公式の結果が異なる

を次のように実際に私のテーブルのdon't know wht i am missing in formula one.

データ構造は、1

ある
id varchar(100)  
userid varchar(100)  
username varchar(100) 
currLoc point   
radius int(10) 

に式2用

フォーミュラワン:reference

sql statement to execute distance function 

SELECT userid, username, distance(userstatus.currLoc, 
GeomFromText('POINT(23.039574 72.56602)')) AS cdist 
    FROM userstatus HAVING cdist <= 0.6 ORDER BY cdist LIMIT 10 


RETURN 6371 * 2 * 
    ASIN(SQRT(POWER(SIN(RADIANS(ABS(X(a)) - ABS(X(b)))), 2) + 
       COS(RADIANS(ABS(X(a)))) * COS(RADIANS(ABS(X(b)))) * 
        POWER(SIN(RADIANS(Y(a) - Y(b))), 2))); 

式2:reference

SELECT *,(((acos(sin((23.039574*pi()/180)) * 

     sin((lat *pi()/180))+cos((23.039574*pi()/180)) * 

     cos((lat *pi()/180)) * cos(((72.56602- lon)*pi()/180))))* 

    180/pi())*60*1.1515*1.609344) as distance 

FROM status HAVING distance <= 0.6 

ここで0.6は、発現の

答えて

3

一つのバージョンはABS(X(A))などを使用しており、他のではないキロにおける半径です。 ABSを使用しているのは容疑者です。あなたは角度のサインを無視する余裕がありません。あなたは、世界のいくつかの地域で(赤道や元の子午線の近く、または極の近くなど)異なる結果を得ます。

定数も異なります。

60*1.1515*1.609344 

6371 * 2 

一つの式はSQRTを含み、他にはありません。

一方の発現にはASINが関与し、他方にはACOSが用いられる。両者の間に共通するものは基本的にありません

...

は、ウィキペディア'Haversine Formula'での議論を参照してください、特に数値的安定性への参照点間の距離が小さい場合。

半読み式を使用している数式を線で分割して作成することで、人々の手助けの機会を増やすこともできます。

RETURN 6371 * 2 * 
     ASIN(SQRT(POWER(SIN(RADIANS(ABS(X(a)) - ABS(X(b)))), 2) + 
        COS(RADIANS(ABS(X(a)))) * COS(RADIANS(ABS(X(b)))) * 
         POWER(SIN(RADIANS(Y(a) - Y(b))), 2))); 

そして:例えば

(((acos(sin((23.039574*pi()/180)) * sin((lat *pi()/180)) + 
     cos((23.039574*pi()/180)) * cos((lat *pi()/180)) * 
     cos(((72.56602-lan)*pi()/180)) 
     ) 
    ) * 180/pi()) * 60 * 1.1515 * 1.609344) 

後者の文献 'LAN'。それは 'lon'であることを意味していますか? 2番目の例では、23.039574°Nと72.56602°Wの2つの位置のいずれかを符号化したように見え、latlanがSQLクエリのテーブルから来ています。

+0

+1私の注意を引くために、さて、それでは、私はどのような標準と適切なものを使用する必要がありますか? – Hunt

+0

式2は有効なHaversine式ですが、 – Hunt