geolokáció - világ településeinek adatbázisa

hej,

elég nagy gondba kerültem. az egyik közösségi portálunknál be akarjuk vezetni az X kilométeren belül levő felhasználókra való szűrést.

az algoritmusokkal nincs baj, azok már megvannak, sőt, a lat/lon információt is le tudom szívni a google maps api-ról, ha ez lenne a legfőbb gond... de nem ez az.

kellene egy adatbázis/adatforrás, amiben kb. ilyen formában van az info:
ország (iso kód/név) -> régió/tartomány/tagállam -> (esetleg alrégió ->) település
és ahol a nevek utf8-ban vannak kódolva. esetleg pluszban a településhez tartozó lat/lon koordinátapár is legyen benne.

egy darabig kísérleteztem a geonames adatbázisával, de arra kell rájönnöm, hogy az használhatatlan, mert a települések nincsnek hozzárendelve a régiókhoz (adminisztratív divíziókhoz), így a 2.-3. pontnál megszakad a lánc.

valaki csinált már ilyet? ha igen, milyen adatforrást használt?

találtam egyet, ami talán használható, és "csak" 80 tallér, de nem tudom, mennyire megbízható; viszont kb. pont úgy van benne az info, ahogy szeretném. ez ez: http://worldcitiesdatabase.com/world-city-latitude-longitude.aspx . használta ezt valaki közületek, és ha igen, mik a tapasztalatai?

köszi előre is,
p

Hozzászólások

Ha az X nem túl nagy (< 30--50 km), akkor elég a település neve és a koordinátája. Ilyen kis távolságon belül nincs (Magyarországon) két azonos nevű település, így az ország és a megye információ lényegtelen. Tartomány és tagállam pláne nincs.

Kiegészítés:
Sőt, ha ismert az X maximális értéke, akkor elég a körzeten belüli települések nevét összegyűjteni. Ha valaki az ismert települések egyikét adja meg, akkor átmegy a szűrőn. Ha a név ismeretlen, akkor fennakad a szűrőn. Így bármilyen alakú (nem csak kör) területre lehet szűrni.

-----
A kockás zakók és a mellészabások tekintetében kérdezze meg úri szabóját.

A legegszerűbb, ha mindenki megböki Gugli Mapson, hol lakik.

Ezek altalaban a Natural Earth-bol jonnek, ott nezz korul.

Ill. Mo-ra lehet meg mindig geocode adatokat kapni, nemtom meg mindig millios nagysagrend-e.

Vagy szepen vegigsetalsz a googel geocoderen egyesevel szerveroldalon..

geo2ip mapping nem kell. néztem a maxmind adatbázisát, de sok sebből vérzik.

ez a natural earth érdekes, de valaki már használta arra konkrétan, amit írtam?

mivel nem csak magyarországról, hanem potenciálisan az egész világból jöhetnek felhasználók, így a csak magyarországi adat elégtelen (és az spec még meg is van), és mint mondtam, az algoritmus megvan, tehát nem az a gond... google mapson való bejelölés meg azért nem játszik, mert 1) felesleges kör (elég lenne egy pont olyan dropdownos megoldás, mint ami a linkem demojában van), 2) jónéhány felhasználónk sztem lazán eltévedne a térképen :).

naturalearth: 7300 rekord a világ városaira. hát ez bizony kevés. :( megnéztem, "hángöri" eléggé kevés van benne, sajna ez nem lesz jó. a végén tényleg a worldcitiesdatabase marad, az a tesztek alapján eléggé alapos. (bár lehet, hogy az importom cseszett el valamit. azért ez a 30MB kicsit soknak tűnik ennyi rekordra.)

a tilemill még érdekes lehet, mert az, ahogy látom, nem csak a naturalearthdata-ról tud adatot szívni. a hétvégén játszom vele egyet. köszi a tippet!

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);
}

Minek szamolsz polarban?? Tudom, a Fold kerek, de a terkep lapos!

Szamold at mercatorba, es hirtelen lecsokken az egy sorra juto PI-k es szinuszok szama.

Rough tavolsag: fogod es leszeded a kornyezo csempeket (tile) valamelyik zoomlevelen, ez alapjan tarolsz.

Igy mukodik az altalam ismert osszes GeoDB...

A Tissox-at ha megnezed, a tevedese mindig a kozepponttol fugg.

De a szelessegi-magassagi ovek is durvan tevednek, ha meggondolod... egy "ovnegyzet" a terkepen eszakon egy nagyon keskeny trapez, mig az egyenlitonel egy ugyanolyan magas, de sokkal szelesebb...

Kod:
http://pastebin.com/afPNBMcP

Itt vannak a unittesztjei:

http://pastebin.com/2TvWvu4v