0

ユーザーのテーブルがあり、緯度、経度に基づいて最も近いユーザーを見つける必要があります。距離も必要です。私は 2 日間、harsine 式と代替案に苦労してきましたが、いくつかのエラーに直面しています。

例として、マレーシアのクアラルンプール (およそ 3.2, 102) の緯度経度を使用するとします。

ピタゴラスの使用:

SELECT top 10 *, 
    SQRT(SQUARE(ABS(latitude - 3.2)) + SQUARE(ABS(longitude - 102))) AS distance 
FROM lfuser 
ORDER BY distance

「正しい」結果が得られます(その時点に近いユーザー)。しかし、そこからの距離 (KM) を取得することはできません。完全に正しいわけではないことはわかっています。だから私はhaversineを使用しようとしました:

SELECT TOP 10 *, 
    ROUND(2 * ASIN(SQRT(POWER(SIN(((3.2 / 180) * PI() 
        - (latitude / 180) * PI()) / 2) ,2) + COS((3.2 / 180) * PI()) 
        * COS((latitude / 180) * PI()) * POWER(SIN(((102 / 180) * PI() 
        - (longitude / 180) * PI()) / 2), 2))) * 6367, 4) AS distance 
FROM lfuser 
ORDER BY distance

奇妙なことは、これによりユーザーが別の場所にいることです。実際、トップ 1 の結果は、緯度 = 5.55、経度 = -0.20 のガーナのユーザーです。

これは私を夢中にさせています...もちろん、ピタゴラスの結果に110 kmを掛けることでおおよその距離を計算できますが、より正確な結果が欲しいです。

誰かが間違っていることを指摘してくれることを願っています。

haversine 式などのさまざまな実装へのリンクを投稿しないでください。私はそれらを 2 日間調べています。

4

2 に答える 2

2

過去に使用Haversine in SQL 2005していたので、手順を変換してあなたのケースに適応させようとしました。うまくいったら教えて

正しいクアラルンプールの経度と緯度もあると思います3.139003, 101.686855

declare @myLatitude decimal(12,6), @myLongitude decimal(12,6), @EarthRadius decimal(12,6)
select @myLatitude = 3.139003, @myLongitude = 101.686855, @EarthRadius = 6378.137

SELECT top 10 *, 
    (@EarthRadius * ACOS((SIN(PI() *  @myLatitude /180) 
     * SIN(PI() * Latitude/180))
     + (COS(PI() *  @myLatitude /180) 
     * COS(PI() * Latitude/180) 
     * COS(PI() * Longitude/180 - PI() * @myLongitude /180))))
    as distance
FROM lfuser 
ORDER BY distance

それが役に立てば幸い

于 2011-06-14T08:51:30.267 に答える
0

とりあえず簡単に答えます。SQL Server 2008 を使用している場合は、地理タイプ (あなたの場合はポイント) を使用して場所を保存する必要があります。ポイント間の距離を処理するための組み込みメソッドがあります。ここここから始める

この質問は、この分野を専門とする gis.stackexchange.com で行うことができます。

于 2011-06-14T06:30:59.407 に答える