Open kolesar-andras opened 9 years ago
Annak érdekében, hogy ez a fejlesztés belátható időn belül elkészüljön és józan keretek között használható is legyen, a teljes nyomvonal-adatbázissal való összehasonlítást félreteszem.
Helyette azt javaslom, hogy használjuk az OSM apit arra, amire való: adott helyen levő nyomvonalpontok letöltésére. Ez a hely lehet egészen kicsi is, akár pontszerű is. Kipróbáltam, hogy mit hoz le, ha egy nyomvonalból kiválasztok egyetlen pontot és azt teszem meg a befoglaló téglalap mindkét sarkának, lehozta.
https://api.openstreetmap.org/api/0.6/trackpoints?bbox=16.6519157,46.5779439,16.6519157,46.5779439&page=0
Mivel előfordulhatnak kerekítési hibák, sőt vannak is, ezért érdemes némi ráhagyással dolgozni. Az OSM által megkülönböztetett legkisebb egység a WGS84 koordináta 7 tizedesjegye, így néz ki a letöltésben:
<trkpt lat="46.5779439" lon="16.6519157">
<time>2010-08-11T17:08:45Z</time>
</trkpt>
Az eredetiben így volt:
<trkpt lat="46.577943983" lon="16.651915731">
<ele>299.588013</ele>
<time>2010-08-11T17:08:45Z</time>
</trkpt>
Látszik, hogy nem kerekítette a koordinátát, hanem csonkolta a hetedik tizedesjegy után. Hasonló kavarás előfordulhat OSM szerveren kívül is, például a Garmin .gdb átalakítására használt programban.
Emiatt érdemes ráhagyni néhány tizedesjegyet, első körben az öt tizedest javaslom, ami körülbelül egy négyzetméternek felel meg a valóságban. A fenti példa esetén:
https://api.openstreetmap.org/api/0.6/trackpoints?bbox=16.65191,46.57794,16.65192,46.57795&page=0
A kellően kicsi befoglaló téglalappal három legyet ütünk egy csapással:
Lekérjük tehát a vizsgált nyomvonal tetszőlegesen választott pontját, majd elemezzük a választ.
Az eredményektől függően megnézünk még egy-két koordinátát a nyomvonal teljesen más részeiről is. Ha mindegyik megvan, akkor teljesen biztosak lehetünk. Ha néhány megvan, a többi nincs, akkor lehet hogy megszűrték vagy vágták a nyomvonalat.
A végén elmondjuk a felhasználónak, hogy mit találtunk, bizonytalanság esetén döntsön. Ha éppen tömeges feldolgozást végzünk, akkor valószínűséget összehasonlítjuk a beállított küszöbértékkel és aszerint megyünk tovább.
Nem fárasztanám a gépet a gpx fájl teljes kiolvasásával, felhasználhatjuk hogy a gpsbabel és az osm api is szépen soronként formázza a szöveges állományt, így kedvenc posix/unix/linux szövegfeldolgozó parancsainkkal hatékonyan tudunk mintát venni a nagy állományokból is. Az első nyomvonalpont koordinátái így kaphatjuk meg:
$ grep -m 1 "<trkpt " track.gpx
<trkpt lat="46.540449467" lon="16.694484567">
A fenti módszerrel ideális esetben a másodperc töredéke alatt eldönthető, hogy fel van-e már töltve az OSM nyomvonalai közé. A legnagyobb időigénye az OSM API válaszának van, addig egy kicsit pihen a gép a feldolgozás közben.
Ha nyomvonalanként (vagy azon belül fájlonként?) megússzuk néhány API lekérésből, akkor nem jelentünk különösebben nagy terhelést az OSM szervernek. A feltöltés ennél sokkal megerőltetőbb számukra. Annak érdekében hogy ne okozzunk dugót az utófeldolgozónak, úgyis be kell építenünk várakozást az automatizmusba.
Megpróbáljuk kitalálni, hogy nincs-e már fent a nyomvonal. Ehhez okos programot kell írnunk, ami vesz néhány reprezentatív mintát az adott csomagból, megnézi hogy megvan-e az adatbázisban, szükség esetén tovább vizsgálódik és a végén ad valami valószínűségi értéket. Ha ez magas, akkor inkább hagyja ki és írjon listát róla.