2011-01-15 16 views
6

Belirli bir coğrafi konum içinde bir şeyler bulmaya çalışan bir sorgum var, ancak geri getirdiği sonuçlar biraz garip.Coğrafi konumun yakınındaki şeyler için sorgular mı?

Daha önce bu threadi yayınlamıştım ve topluluk, ihtiyacım olan bir formülü bulmama yardımcı oldu: Querying within longitude and latitude in MySQL ama şimdi sorgu gerçekten tuhaf sonuçlar veriyor.

My veri vardır San Francisco kenti çevreleyen edilir

enlem/Ing 37.780182 , -122.517349

Sorgu: Yani

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 

Gördüğünüz gibi - Ben yarıçapı 10000 yapmak bile hala gelmez' Çok fazla bulmak, bu yüzden benim sorgu kapalı ise merak ediyorum. Geri getirdiği sonuçlardan bazıları, lat/lng için 0,0 değerine sahiptir, bu da bu kayıt için lat/lng olmadığımı gösterme yolumdur. İşte

formülü gibi bakmak gerekiyordu nasıl:

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; 

teşekkür ederiz ve acı uzun soru için üzgünüm! Bu arada, MySQL kullanıyorum.


Hmmm

,

Sadece verdi tam sorgu ile denenmiş ve% 50 doğrulukla çalıştı.

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 | 

Yani şimdi sorgu tüm kilometrelerce uzakta olduğunu öğeleri değil, 100 mil uzakta altındaydı ürünler iade: Burada veri setinin bir örneğidir. Bu öğe (37.787144, -122.493263) gibi, hiçbir zaman başlangıç ​​noktasından yaklaşık 50 mil olmasına rağmen iade edilmiyordu. Nedenini biliyor musun?

+3

Neden bu türden şeylere yönelik işlevleri sağlamak MySQL'in Mekansal uzantılarını kullanmıyorsunuz? http://dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html –

+1

Sadece bazı konuları burada okuyun. Henüz çok iyi anladığımdan emin değilim, ama muhtemelen ihtiyaçlarımın çok üzerinde görünüyor. Sorgulamak için işleri daha hızlı mı yapıyor? Bu iş parçasında tartıştığımızdan çok daha iyi bir çözüm olduğunu düşünüyor musunuz? Teşekkürler! – Genadinik

cevap

12

Ben, denemek size merkez noktasının enlem (37,780182) ve boylam (-122,517349) tersine düşünüyorum:

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' metriğe nasıl dönüştürülür? –