ユーザーのテーブルがあり、緯度、経度に基づいて最も近いユーザーを見つける必要があります。距離も必要です。私は 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 日間調べています。