Calculare distanță dintre adrese

Salutare!

Nu-mi prea iese la socoteală. Am o listă cu magazine fizice, iar fiecare magazin introdus în baza de date conține și adresa exactă (județ, stradă, nr).

Acum, utilizatorul normal intră pe site și setează o adresă (probabil adresa lui) și dintr-un select alege 10, 20, 30 de km.

Acum trebuie să-i afișez în apropiere de adresa setată (a lui) magazinele care nu-s mai departe de x km, cât a ales din select.

Cum aflu care magazine sunt în apropiere de el … pentru că singura soluție pe care o văd este să cer printr-un api distanța de la adresa setată de utilizator la adresa fiecărui magazin în parte. Ori asta înseamnă că dacă am 10.000 de magazine, fac 10k de request-uri ?

Îmi lipsește ceva. Ce anume ?

1 Like

Nu ar fi mai usor cu coordonate? https://stackoverflow.com/questions/5031268/algorithm-to-find-all-latitude-longitude-locations-within-a-certain-distance-fro

2 Likes

In primul rand, trebuie sa adaugi lat, lng pentru fiecare magazin din baza de date. Poti si fara, dar mai greu si te costa.

Haversine formula - asta iti va filtra magazinele care se afla pe o raza de x km in jurul unui punct.
Daca vrei sa mergi mai departe si sa calculezi distanta pe sosea, filtrezi rezultatele cu ajutorul unui API (de regula sunt pe bani), fie implementezi tu un routing engine.

4 Likes

Nu ai cum scăpa de un API din păcate. Pentru că trebuie să faci conversie din adrese text la coordonate GPS.

Dacă precizia nu e importantă, mai era o metodă prin țările civilizate folosind codurile poștale. Având o bază de date cu toate codurile poștale și coordonatele lor, poți face toate calculele local. Ceri userului codul său poștal și faci estimarea. Evident e mult mai puțin precisă dar poate e suficientă pentru cât ai nevoie.

Fiindcă suntem în România nu știu dacă avem o bază de date cu toate codurile poștale și cu coordonate GPS stocate pe ele.

Ca exemplu, pe orice site auto din SUA intri, primul lucru care ți-l cere este codul poștal ca să-ți arate dealerii din zonă. Încearcă să vezi.

2 Likes

Convertești adresele în coordonate geografice și apoi folosești indiciile din celelalte răspunsuri.

Altele servicii care oferă geocoding pe gratis:


1 Like

Poate asta te ajuta cu ceva.

PS: Cred ca de la anumit nr de requesturi in sus este cu bani

2 Likes

Mulțumesc pentru lămuriri. Selectez ca soluție răspunsul lui Floki pentru că m-a apropiat de rezolvare (formula).

Minimum ce se poate face este ca atunci când se introduce magazinul în baza de date să fie incluse și coordonatele geografice.

Apoi utilizatorului, când accesează site-ul, să i se ceară permisiunea de a-i folosi locația.

Din baza de date se pot obține magazinele care se află într-un perimetru în jurul utilizatorului.
Asta se poate face matematic.
MongoDb are inclusă și metoda asta.

E important sa limitezi rezultatele la cele care sunt intr-o anumita zona (de exemplu un oras sau intre anumite coordonate lat,lng) inainte sa te apuci sa faci calculul distantelor si sortarea lor dupa distanta cea mai scurta. Calculul distantei dintre doua puncte variabile e o operatiune care necesita multa procesare de aceea este util sa limitezi setul de date pentru care faci acest calcul. Daca ajungi sa calculezi distante pentru mai mult de 1000+ puncte o sa ai probleme de performanta.

Un pic off-topic: ca sa afli ceva o intrebi pe vecina de la parter :wink: