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    |       | 
+-----------+--------------+------+-----+---------+-------+
e che contiene dei record del tipo:
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/Basilic...ro_in_Vaticano | 
| Pantheon    | 41.9554 | 12.5876 |   0 |         0 | http://it.wikipedia.org/wiki/Pantheon_%28Roma%29                | 
+-------------+---------+---------+-----+-----------+-----------------------------------------------------------------+
Praticamente devo implementare una query che usando la funzione haversine mi restituisce tutti i POI (i punti di interesse) presenti entro un certo raggio dalla posizione dell'utente (espressa sotto forma di longitudine e latitudine)

Stavo vedendo queste slide: http://www.scribd.com/doc/2569355/Ge...rch-with-MySQL ma mi sono bloccato :muro: :muro: :muro:

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
Dove 3956 dovrebbe essere il raggio della terra espresso in Km

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;
Allora...analizzando un attimo questa query:
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;
mi da il seguente messaggio di errore:
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
Andrea