 |
Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Comunitatea PHP Romania
|
| Subiectul anterior :: Subiectul următor |
| Autor |
Mesaj |
un_guru
Data înscrierii: 25/Iul/2004
Mesaje: 153
Locație: Miecurea Ciuc
|
| Trimis: Mie Oct 27, 2004 11:00 pm Titlul subiectului: Zip radius |
|
|
Am o baza de date ce contine codurile zip ale localitatilor din us, de forma
(zip, longitudin, latitudine, oras,...) ...si vreu sa caut toate orasele care se afla la o anumita distanta de un oras(zip) dat.
Stiu sa-l fac in php, adica sa pun php-ul sa calculeze, dar nu e deloc eficient ... peste 40000 de inregistrari. Vreu sa fac calculul in mysql intr-un singur query. Sau poate aveti alte solutii ...
Dau o bere :wink: |
|
| Sus |
|
ExcalIbvr
Data înscrierii: 02/Mai/2004
Mesaje: 1107
Locație: Oradea
|
| Trimis: Joi Oct 28, 2004 8:20 am Titlul subiectului: |
|
|
| Cum te-ai gandit tu sa calculezi? Ti-ai facut o structura de graf si folosesti algoritmi dedicati sau babeste? |
|
| Sus |
|
arond
Data înscrierii: 11/Mar/2004
Mesaje: 580
Locație: 127.0.0.1
|
| Trimis: Joi Oct 28, 2004 1:01 pm Titlul subiectului: |
|
|
Problema se reduce la a putea exprima distanta(latitudine1,longitudine1, latitudine2,longitudine2) intr-o expresie SQL.
S-ar putea sa te ajute MySQL spatial extensions (http://dev.mysql.com/doc/mysql/en/Spatial_extensions_in_MySQL.html).
De asemenea, daca-ti permit conditiile, poti folosi MySQL 5.0 - se pot crea stored procedures/functions -> definesti functia distanta() cu manuta ta pentru ca apoi sa o folosesti in query.
A treia idee ar fi sa folosesti o structura arborescenta, gen BSP (binary space partitioning) prin care poti sa elimini repede toate punctele care nu-s intr-un patrat cu centrul in punctul central si de latura 2*r, unde r e raza cercului de interes... dupa care sa procesezi doar punctele din patratul respectiv (asta iti va reduce mult numarul de calcule necesare). Cauta dupa engine-uri grafice 3d (acolo vei gasi informatii detaliate despre BSP).
Numa' bune. |
|
| Sus |
|
stealth
Data înscrierii: 21/Iun/2004
Mesaje: 304
Locație: Timisoara
|
| Trimis: Vin Oct 29, 2004 12:29 pm Titlul subiectului: |
|
|
SELECT oras FROM tabel WHERE SQRT(POWER((69.1*(latitudine+tabel.latitudine)),2)+POWER((53*(longitudine+tabel.longitudine)),2))=distanta;
tabel=tabelul tau.
latitudine = latitudinea de referinta.
longitudine= longitudinea de referinta.
NU AM TESTAT. Teoretic ar trebui sa mearga. Asta e formula :D.
Pentru o mai mare acuratete poti incerca asa:
SQRT(POWER((69.1*(latitudine-tabel.latitudine)),2)+POWER((53*(longitudine-tabel.longitudine)* COS(tabel.latitudine/57.3)),2))=distanta; |
|
| Sus |
|
un_guru
Data înscrierii: 25/Iul/2004
Mesaje: 153
Locație: Miecurea Ciuc
|
| Trimis: Vin Oct 29, 2004 3:45 pm Titlul subiectului: |
|
|
am reusit:
an style="color: #000000"><?php SELECT city,zip FROM zip_codes where (DEGREES(acos(sin(RADIANS($latitudine)) * sin(RADIANS(latitude)) + cos(RADIANS($latitudine)) * cos(RADIANS(latitude)) * cos(RADIANS($longitudine -longitude))))*69.09)<50 GROUP BY city LIMIT 0,100;
$latitudine, $longitudine - latitudine,longitudine de referinta
latitude, longitude - campurile respective din baza de date
daca intreaba cineva, baza de date se descarca gratis de la :
http://www.cfdynamics.com/cfdynamics/zipbase/zip_codes.zip |
|
| Sus |
|
PHPRomania Bot
Bot Member
Data înscrierii: 27/Dec/2007
Mesaje: 1
Locaţie: Server Google |
| Trimis: Mie Dec 26, 2007 7:01 pm Titlul subiectului: Ad |
|
|
|
|
|
| Sus |
|
| |
|