2011-01-15 16 views
6

Mam zapytanie, które próbuje znaleźć rzeczy w określonej geolokalizacji, ale wyniki, które przynosi, są trochę ... dziwne.Zapytanie o rzeczy w pobliżu geolokalizacji?

Wcześniej opublikowałem ten wątek, a społeczność pomogła mi znaleźć formułę, której potrzebowałem: Querying within longitude and latitude in MySQL, ale zapytanie daje teraz naprawdę zwariowane wyniki.

Moje dane są otaczające miasto San Francisco, który ma lat/lng 37.780182 , -122.517349

Zapytanie:

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 

Więc jak widać - nawet jeśli robię promień 10000 wciąż robi” t znaleźć wiele, więc zastanawiam się, czy moje zapytanie jest wyłączone. Niektóre z rezultatów, które przynosi, mają nawet 0,0 dla lng/lng, co oznacza, że ​​nie ma lat/lng dla tego rekordu.

Oto jak formuła ma wyglądać następująco:

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; 

Dziękuję i przepraszam za boleśnie długi pytanie! Przy okazji, używam MySQL.


Hmmm,

Próbowałem tylko z dokładnym zapytania dałeś i to działało z dokładnością 50%. Oto przykład zestawu danych:

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 | 

Więc teraz zapytanie zwróciło wszystkie elementy, które były wiele mil, ale nie przedmioty, które były pod 100 mil. Podobnie jak ten przedmiot (37.787144, -122.493263) nigdy nie został zwrócony, mimo że znajduje się około 50 mil od punktu początkowego. Czy wiesz, dlaczego?

+3

Dlaczego nie używasz rozszerzenia Spatial MySQL, które zapewniają funkcje dla tego typu rzeczy? http://dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html –

+1

Po prostu przeczytaj niektóre z tematów. Nie jestem pewien, czy rozumiem to zbyt dobrze, ale prawdopodobnie wydaje się przesadny dla moich potrzeb. Czy to sprawia, że ​​zapytania są o wiele szybsze? Czy uważasz, że jest to o wiele lepsze rozwiązanie niż to, które omawiamy w tym wątku? Dzięki! – Genadinik

Odpowiedz

12

Chyba odwrócone szerokość geograficzną (37.780182) i długość (-122.517349) swojego punktu centralnego, spróbuj:

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

Jak przekonwertować "odległość" na metry? –