egyébként én is gondolkoztam egy ideig realtime google/geonames API használatán, szükség alapján. a nagy gond az, hogy egyrészt permanens ID-ket szeretnék az egyes helyekhez rendelni (volt egy olyan ötletem is, hogy md5($orszag_neve.$tartomany_neve.$telepules_neve); képezzen permanens ID-t), másrészt az, hogy ezt a 10-25-50-100-250km-es körzeten belüli többi felhasználó cuccot úgy képezném, hogy a user belépésekor(meglevők)/regisztrációjakor(újak) csinálnék neki egy cache file-t, amiben a bizonyos távolságon belüli települések kódjait eltárolnám.
maga az algoritmus egyébként elég egyszerű:
- az adott település koordinátái alapján meg lehet állapítani, hogy 250km az hány fok/szögperc hosszúságban és szélességben, ez alapján rohadt egyszerű egy négyzetlapot képezni, és ezek alapján két between záradékkal lekérdezni sql-ből a szóba jöhető települések rekordjait;
- a meglevő adatokat pedig már csak le kell szűrni egy pontosabb matematikai képlettel (ez is egyszerű, a végén postolom a php-s funkciókat), és akkor konkrétan tudom már, hogy melyik település hány km-re van.
a php funkciók (van egy precízebb és egy durvább, persze a durvább gyorsabb is (de nem sokkal)):
function calc_fine_distance($p1,$p2) {
$rp1lat = ($p1[0]*M_PI/180); // deg2rad replacement
$rp1lon = ($p1[1]*M_PI/180);
$rp2lat = ($p2[0]*M_PI/180);
$rp2lon = ($p2[1]*M_PI/180);
$R = 6371; // km
$dist = acos(sin($rp1lat)*sin($rp2lat)+cos($rp1lat)*cos($rp2lat)*cos($rp2lon-$rp1lon))*$R;
return($dist);
}
function calc_rough_distance($p1,$p2) {
$rp1lat = ($p1[0]*M_PI/180); // deg2rad replacement
$rp1lon = ($p1[1]*M_PI/180);
$rp2lat = ($p2[0]*M_PI/180);
$rp2lon = ($p2[1]*M_PI/180);
$R = 6371; // km
$x = ($rp2lon-$rp1lon)*cos(($rp1lat+$rp2lat)/2);
$y = ($rp2lat-$rp1lat);
$dist = sqrt($x*$x+$y*$y)*$R;
return($dist);
}