2011-01-15 8 views
6

私は特定のジオロケーション内で物事を見つけようとするクエリを持っていますが、結果は少し奇妙です。ジオロケーションの近くにあるものを照会しますか?

私はこのスレッドを以前に投稿していましたが、私は必要な数式を見つけるのに役立ちました:Querying within longitude and latitude in MySQLしかし、このクエリは本当に不吉な結果をもたらします。

私のデータがあり、サンフランシスコの街を囲むされ

緯度/経度37.780182 , -122.517349

クエリ:だから

SELECT 
    id, 
    hike_title, 
    lat, 
    lng, 
    (3959 * acos( cos(radians(37)) 
        * cos(radians(lat)) 
        * cos(radians(lng) - radians(37.780182)) 
        + sin(radians(-122.517349)) * sin(radians(lat)) 
       ) 
    ) AS distance 
FROM 
    my_awesome_table 
HAVING 
    distance < 10000 
ORDER BY 
    distance 
LIMIT 
    0 , 50 

あなたが見るように - 私は半径10000を作る場合でも、それはまだdoesnの」多くを見つけるので、私は私のクエリがオフになっているのだろうかと思います。それが戻った結果の中にはlat/lngの値が0,0であっても、そのレコードのlat/lngがないことを示す私の方法です。ここで

は、式が見えるようになっている方法です。

SELECT 
    id, 
    (3959 * acos( cos(radians(37)) 
        * cos(radians(lat)) 
        * cos(radians(lng) - radians(-122)) 
        + sin(radians(37)) * sin(radians(lat)) 
       ) 
    ) AS distance 
FROM 
    markers 
HAVING 
    distance < 25 
ORDER BY 
    distance 
LIMIT 
    0 , 20; 

はありがとうと痛々しいほど長い質問には申し訳ありません!ところで、私はMySQLを使用しています。


うーん、

私はちょうどあなたが与えた正確なクエリを使用してみました、それは50%の精度で働いていました。ここでは、データ・セットのサンプルです:

lat   lng  
| 37.223465 | -122.090363 | 
| 39.320980 | -111.093735 | 
| 38.031715 | -84.495132 | 
| 37.787144 | -122.493263 | 
| 52.975361 | -1.458620 | 
| 40.848557 | -111.906883 | 
| 40.572498 | -111.859718 | 

は、だから今のクエリは、すべての多くのマイル離れたアイテムではなく、離れて100マイル下にあったアイテムが返されました。この項目(37.787144、-122.493263)のように、起点から約50マイル離れていても返されることはありませんでした。なぜあなたは知っていますか?

+3

なぜあなたは原料のこの種のための機能を提供MySQLの空間の拡張機能を使用していませんか? http://dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html –

+1

トピックのいくつかを読んでください。私はそれをあまりにもよく理解しているかどうかはわかりませんが、おそらく私の必要には過剰なものです。物事をより迅速にクエリすることができますか?このスレッドで議論しているソリューションよりはるかに優れたソリューションだと思いますか?ありがとう! – Genadinik

答えて

12

私は、してみてください、あなたの中心点の緯度(37.780182)と経度(-122.517349)を逆に考える:

select 
    id, 
    hike_title, 
    lat, 
    lng, 
    (3959 * acos( cos(radians(37)) 
        * cos(radians(lat)) 
        * cos(radians(lng) - radians(-122.517349)) 
        + sin(radians(37.780182)) * sin(radians(lat)) 
       ) 
    ) AS distance 
FROM 
    my_awesome_table 
HAVING 
    distance < 10000 
ORDER BY 
    distance 
LIMIT 
    0 , 50 
+0

'distance'をメートルに変換するには? –

関連する問題