2011-01-15 8 views
6

Ho una query che tenta di trovare le cose all'interno di una determinata geolocalizzazione, ma i risultati che riporta sono un po '... strani.Richiesta di informazioni in prossimità di una geolocalizzazione?

Avevo già postato questa discussione e la comunità mi ha aiutato a trovare una formula di cui avevo bisogno: Querying within longitude and latitude in MySQL ma ora la query fornisce risultati davvero stravaganti.

miei dati è che circonda la città di San Francisco che ha il lat/lng 37.780182 , -122.517349

Query:

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 

Quindi, come si vede - anche se faccio raggio 10000 ancora doesn' Trovo molto, quindi mi chiedo se la mia query è disattivata. Alcuni dei risultati che riporta hanno anche 0,0 per lat/lng che è il mio modo di indicare che non ci sono lat/lng per quel record.

Ecco come si suppone che la formula per assomigliare:

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; 

Grazie e scusa per il lungo dolorosamente domanda! A proposito, sto usando MySQL.


Hmmm,

ho appena provato con la query esatta hai dato e ha funzionato con il 50% di precisione. Ecco un esempio di set di dati:

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 | 

Così ora la query restituiti tutti gli elementi che erano molte miglia di distanza, ma non anche le voci che erano sotto 100 miglia di distanza. Come questo articolo (37.787144, -122.493263) non è mai stato restituito anche se si trova a circa 50 miglia dal punto di origine. Sapresti perché?

+3

Perché non stai usando estensioni spaziali di MySQL che forniscono funzioni per questo genere di cose? http://dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html –

+1

Basta leggere alcuni degli argomenti presenti. Non sono sicuro di averlo capito troppo bene, ma forse sembra eccessivo per i miei bisogni. Rende le cose molto più veloci da interrogare? Pensi che sia una soluzione molto migliore di quella di cui stiamo discutendo in questo thread? Grazie! – Genadinik

risposta

12

penso che si invertito la latitudine (37,780,182 mila) e la longitudine (-122,517349) del punto centrale, provare:

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

Come convertire 'distance' in metri? –

Problemi correlati