1

私は近接度をカウントするためにmysqlを使用しています。そのために、距離という名前のプロシージャを1つ作成しました。これは次のとおりですが、そのプロシージャは正しく機能していませんが、SQLステートメントは機能しています Haversine formulas。私に適切な結果。私は本当にdon't know wht i am missing in formula one.

私のテーブルのデータ構造は次のとおりです

フォーミュラワン

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

フォーミュラ 2

id  varchar(30)
userid  varchar(30)
username varchar(40)
lat float(10,6)
lan float(10,6)
radius  varchar(100)

フォーミュラワン: リファレンス

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: リファレンス

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 はキロメートル単位の半径です

4

1 に答える 1

4

式の 1 つのバージョンは ABS(X(a)) などを使用しており、もう 1 つのバージョンは使用していません。ABSを使用しているものは疑わしいです。角度の記号を無視するわけにはいきません。世界の一部の地域 (たとえば、赤道や本初子午線の近く、または極の近く) では異なる結果が得られます。

あなたの定数も異なります。

60*1.1515*1.609344

6371 * 2

1 つの式には SQRT が含まれ、もう 1 つの式には含まれません。

1 つの表現は ASIN を含み、もう 1 つの表現は 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 番目の例では、2 つの位置のうちの 1 つを 23.039574°N および 72.56602°W としてエンコードし、SQL クエリのテーブルから取得latしたように見えます。lan

于 2012-02-25T17:49:58.507 に答える