|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
[MySql] Aiuto ad implementare la funzione haversine in una query:distanza tra 2 punti
Ciao ragazzi,
allora ho un bel problema dal quale non riesco proprio a venire a capo. Quello che devo fare fà in parte riferimento a queste slide: http://www.scribd.com/doc/2569355/Ge...rch-with-MySQL Io ho una tabella poi che contiene una lista di punti di interesse, la cui struttura è la seguente: Codice:
mysql> describe poi; +-----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+-------+ | nome | varchar(50) | NO | PRI | | | | lon | float | NO | PRI | 0 | | | lat | float | NO | PRI | 0 | | | alt | float | NO | PRI | 0 | | | tipologia | tinyint(4) | YES | | NULL | | | wikiLynk | varchar(100) | YES | | NULL | | +-----------+--------------+------+-----+---------+-------+ Codice:
mysql> mysql> select * from poi; +-------------+---------+---------+-----+-----------+-----------------------------------------------------------------+ | nome | lon | lat | alt | tipologia | wikiLynk | +-------------+---------+---------+-----+-----------+-----------------------------------------------------------------+ | Colosseo | 41.8913 | 12.4911 | 0.5 | 0 | http://it.wikipedia.org/wiki/Colosseo | | Foro Romano | 41.9552 | 12.6768 | 0 | 0 | http://it.wikipedia.org/wiki/Foro_Romano | | San Pietro | 41.9457 | 12.6755 | 0 | 0 | http://it.wikipedia.org/wiki/Basilica_di_San_Pietro_in_Vaticano | | Pantheon | 41.9554 | 12.5876 | 0 | 0 | http://it.wikipedia.org/wiki/Pantheon_%28Roma%29 | +-------------+---------+---------+-----+-----------+-----------------------------------------------------------------+ Stavo vedendo queste slide: http://www.scribd.com/doc/2569355/Ge...rch-with-MySQL ma mi sono bloccato ![]() ![]() ![]() Praticamente...alla slide 6 dà questa formula (Haversine Formula) che da quello che ho capito serve a calcolare la DISTANZA TRA 2 PUNTI IDENTIFICATI DALLE LORO COORDINATE GPS DI LATITUDINE E DI LONGITUDINE (almeno questo è quello che ho capito...me lo confermate?) FORMULA PER CALCOLARE LA DISTANZA TRA 2 PUNTI IMPLEMENTATA IN MySql Codice:
3956 * 2 * ASIN ( SQRT (POWER(SIN((orig.lat - dest.lat)*pi()/180 / 2), 2) + COS(orig.lat * pi()/180) * COS(dest.lat * pi()/180) * POWER(SIN((orig.lon - dest.lon) * pi()/180 / 2), 2) ) ) as distance Ora...usando questa formula devo implementare una query che mi restituisce tutti i POI in un certo raggio centrato nelle coordinate dell'utente. Quindi si passa alla slide 7 (dove mi incasino di brutto). Praticamente fà così: Codice:
set @orig_lat=122.4058; set @orig_lon=37.7907; set @dist=10; SELECT *, 3956 * 2 * ASIN(SQRT( POWER(SIN((@orig_lat - abs(dest.lat)) * pi()/180 / 2), 2) + COS(@orig_lat * pi()/180 ) * COS(abs(dest.lat) * pi()/180) * POWER(SIN((@orig_lon – dest.lon) * pi()/180 / 2), 2) )) as distance FROM hotels dest having distance < @dist ORDER BY distance limit 10; nelle prime 3 righe setta 3 variabili nel database contenenti la latitudine e la longitudine dell'utente e la distanza entro cui si vuole effettuare la ricerca (il range di ricerca appunto) Ok...fin quì ci stò...vabbè la sua tabella si chiama hotels e non poi...vabbè basta sostituire... Però in questo codice non riesco a capire per lui chi siano: dest.lat e dest.lon, cosa rappresentano? Cioè per ogni poi presente nella mia tabella ci va a mettere la rispettiva latitudine e longitudine per eseguire il test? Io ho provato a modificare la query così ma non mi funziona: Codice:
set @orig_lat=41.889758; set @orig_lon=12.4989331; set @dist=10; SELECT *, 3956 * 2 * ASIN(SQRT( POWER(SIN((@orig_lat - abs(dest.lat)) * pi()/180 / 2), 2) + COS(@orig_lat * pi()/180 ) * COS(abs(dest.lat) * pi()/180) * POWER(SIN((@orig_lon – dest.lon) * pi()/180 / 2), 2) )) as distance FROM poi dest having distance < @dist ORDER BY distance limit 10; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '– dest.lon) * pi()/180 / 2), 2) )) as distance FROM poi dest having distance <' at line 4 mmm...mi ci sono spaccato la testa ma visto che non ho mai fatto query di questo tipo non sò proprio dove andare a mettere le mani...c'è qualcuno che mi sà aiutare? Grazie |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:29.