e-commerce84
29-04-2010, 17:26
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/Geo-Distance-Search-with-MySQL
Io ho una tabella poi che contiene una lista di punti di interesse, la cui struttura è la seguente:
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:
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 |
+-------------+---------+---------+-----+-----------+-----------------------------------------------------------------+
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/Geo-Distance-Search-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
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ì:
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:
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
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/Geo-Distance-Search-with-MySQL
Io ho una tabella poi che contiene una lista di punti di interesse, la cui struttura è la seguente:
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:
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 |
+-------------+---------+---------+-----+-----------+-----------------------------------------------------------------+
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/Geo-Distance-Search-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
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ì:
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:
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