2011-01-14 16 views
20

Prima di chiedere esempi di codice specifici, volevo solo chiedere se è possibile fare un qualcosa di query come questa pseudo codice:Interrogazione all'interno di longitudine e latitudine in MySQL

selezionare gli elementi da tavolo dove lat/lon = - entro x miglia da un determinato punto lat/lon-

È fattibile? O devo saltare attraverso alcuni cerchi? Qualsiasi buon approccio che potrebbe essere raccomandato sarebbe fantastico!

risposta

49

si dovrebbe cercare la formula Haversine, ma un buon inizio potrebbe essere:

Citando dal primo URL :

Ecco l'istruzione SQL che troverà le 20 posizioni più vicine all'interno di un raggio di 25 miglia fino alla coordinata 37, -122. Calcola la distanza in base alla latitudine/longitudine di quella riga e alla latitudine/longitudine obiettivo, quindi richiede solo le righe in cui il valore della distanza è inferiore a 25, ordina l'intera query per distanza e limita a 20 risultati. Per cercare per chilometri, invece di miglia, sostituire 3959 con 6371.

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; 
+0

Grazie per il suggerimento. Ho appena postato una nuova domanda qui: http://stackoverflow.com/questions/4697624/querying-for-things-near-a-geolocation – Genadinik

+2

Questo non restituisce alcuna distanza calcolata per me, solo 'NULL' per tutto il tempo . –

+0

Non si restituiscono risultati sul punto esatto. Questi risultati restituiscono la distanza come NULL che non funziona sulla clausola di avere. – Maykonn

5

Mi raccomando utilizzando SpatiaLite o PostGIS per questo tipo di operazione. Hanno costruito il tipo di funzioni che stai cercando di inserire nel codice. Hanno anche un adeguato supporto per i dati spaziali che in realtà non esistono in MySQL.

Non è esattamente una soluzione in MySQL ma una soluzione migliore se si desidera continuare a fare richieste spaziali in futuro.

Problemi correlati