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
- 4383 megtekintés
Hozzászólások
geoip?
vagy gyujtsd ki a városok koordinátáit dbbe, onnan meg lehet sqlből fokok alapján távolságot lekérdezni. feltéve hogy megadta a városát.
$req = sprintf('http://maps.google.com/maps/geo?q=%s,+Magyarorsz%%C3%%A1g&output=json',…));
curl->jsondecode.
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
A legegszerűbb, ha mindenki megböki Gugli Mapson, hol lakik.
- A hozzászóláshoz be kell jelentkezni
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..
- A hozzászóláshoz be kell jelentkezni
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 :).
- A hozzászóláshoz be kell jelentkezni
Natural Earth: http://mapbox.com/tilemill/
Jatsszal. ;)
Ill.: http://www.naturalearthdata.com/downloads/10m-cultural-vectors/
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
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);
}
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
erre tudsz valami képletet adni?
a gond egyébként az, ahogy elnéztem, a klasszikus mercator, minél messzebb megyünk az egyenlítőtől, annál durvábban kezd tévedni, nem?
- A hozzászóláshoz be kell jelentkezni
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:
- A hozzászóláshoz be kell jelentkezni
persze, ezért is mondtam, hogy a négyzet/téglalap széleit mindig a kiinduló-pont koordinátái alapján állapítom meg -- mármint a km/szögperc arányszámot módosítom a hosszúság és a szélesség függvényében. de köszi a linkeket, megskubizom.
- A hozzászóláshoz be kell jelentkezni
[feliratkozás]
- A hozzászóláshoz be kell jelentkezni