SZEGEDI TUDOMÁNY EGYETEM Természettudományi Kar
Természeti Földrajzi és Geoinformatikai Tanszék
Földrajz Szak
SZAKDOLGOZAT
Geoinformatikai megoldások a vitorlázórepülő versenyben − − IGC fájlfeldolgozás, ábrázolás és optimalizálás
Kun Péter
Témavezető: van Leeuwen, Boudewijn
2011
ÖSSZEFOGLALÁS Szakdolgozatom témájául a vitorlázórepülő fedélzeti adatrögzítő eszközét és ahhoz kapcsolódó optimalizálási problémát választottam, mert magam is vitorlázó pilóta vagyok. Rendszeresen találkozom ezen eszközzel és az ehhez kapcsolódó térinformatikai programmal és problémákkal. Szakdolgozatomban először ezt az eszközt mutatom be, majd az általa készített fájl formátumot. Ez a fájlformátum az IGC, melyet speciálisan a vitorlázó repüléshez fejlesztettek ki. Ennek az IGC fájlnak a feldolgozását fogom bemutatni, majd átkonvertálni a geoinformatikában általánosan elterjedt ESRI shape fájllá. A vitorlázórepülő verseny során ezt az IGC fájlt értékelik ki és különböző esetekben optimalizálják a versenyre. Az optimalizációra azért van szükség, mert a vitorlázórepülő nem egyenesen repül a célja felé, hanem sokszor letér az útvonalról, hogy magasságot gyűjtsön. A repülő által bejárt úthossz egy szabálytalan görbe, melynek hossza nem mond eleget a valódi megtett útról. Így ezen optimalizáció során létrehozunk a bejárt útvonalra felszerkesztett görbét, – melynek a Magyar Vitorlázórepülő Kupa esetén öt töréspontja van és a két vége a felszállási hely valamint a leszállási hely – amely görbének hossza maximális. Ez a távolság más tényezőkkel együtt adja meg a megszerzett pontszámot, melyben az egyik legnagyobb súllyal rendelkezik, így fontos, hogy minél pontosabban számítsuk. Utolsó lépésként röviden bemutatásra kerül, hogy hogyan lehet a kapott eredményeket az IGC fájlba beküldeni és a versenyre hiteles IGC fájlt készíteni a SeeYou program segítségével.
i
TARTALOMJEGYZÉK
Összefoglalás ...........................................................................................................................i Tartalomjegyzék .................................................................................................................... ii 1. A vitorlázó repülés és adatrögzítés .............................................................................. 1 1.1. Bevezetés ............................................................................................................. 1 1.2. A Magyar Vitorlázórepülő Kupa ........................................................................ 2 1.3. Adatrögzítés módszerei....................................................................................... 5 1.4. Fedélzeti adatrögzítő ........................................................................................... 6 1.4.1. Globális navigációs műholdrendszer ........................................................ 6 1.4.2. Logger........................................................................................................ 7 2. Az IGC fájlformátum .................................................................................................10 2.1. Mértékegységek, pontosság az IGC fájlban .....................................................10 2.2. Rekordok ...........................................................................................................12 2.2.1. Egyszeri eseti rekordok ...........................................................................12 2.2.2. Többszörös eseti rekordok ......................................................................13 2.2.3. B rekord ...................................................................................................14 2.3. IGC konvertálása shape fájllá ...........................................................................15 2.3.1. Python programozási nyelv ....................................................................15 2.3.2. IGC2SHAPE ...........................................................................................16 3. IGC fájl optimalizálás ................................................................................................20 3.1. Dinamikus programozás ...................................................................................21 3.1.1. Legkisebb részfeladat: távolság számítása .............................................22 3.1.2. Optimalizációs algoritmus ......................................................................25 4. Eredmények vizualizálása .........................................................................................31 4.1. ArcGIS 10 .........................................................................................................31 ii
4.1.1. Geoprocessing toolbox ............................................................................31 4.1.2. Felhasznált térkép ....................................................................................32 4.2. SeeYou ..............................................................................................................34 4.3. Utólagos feladat megadása ...............................................................................35 5. Összegzés ...................................................................................................................38 Irodalom jegyzék ..................................................................................................................40 Mellékletek ...........................................................................................................................42 1. sz. melléklet: MVK index számok ............................................................................42 2. sz. melléklet: IGC fájl részletek ................................................................................44 3. sz. melléklet: IGC to shape python script .................................................................47 4. sz. mellékelt: IGC optimalizációs python script .......................................................49 5. sz. melléklet: Feladata kiírás SeeYouval...................................................................54 Nyilatkozat ............................................................................................................................55
iii
1. A vitorlázó repülés és adatrögzítés 1.1. Bevezetés A Wright fivérek csodás találmányának köszönhetően, már a XX. század legeleje óta lehetővé vált az emberiség számára a repülés. Napjainkra az életünk mindennapi részévé vált a légiközlekedés, ugyanakkor ezzel párhuzamosan fejlődött ki egy sportág is, a vitorlázórepülés. Azért sport a repülés ezen ága, mert itt a levegőben maradás ideje valamint a megrepült távolság a pilóta ügyességétől nagyban függ. A vitorlázó repülés, nem más, mint motor nélküli repülés, mely kihasználja a légkörben lezajló jelenségeket és azokból nyeri a magassági energiáját. Ez a meghatározás nem azt jelenti, hogy a motoros repülőgépek nem tudnak motor nélkül siklani és adott esettben biztonságosan leszállni, hanem hogy olyan kialakítással rendelkezik a vitorlázó repülő, hogy képes a légkör különböző feláramlásait olyan módon meglovagolni, hogy az abszolút magassága növekedjen. A motornélküli repülőgép állandó magasságvesztéssel repül, ha a mozgását a környező levegőhöz viszonyítjuk. Nyugvó levegőben tehát 1 m/s merülősebességgel süllyedő repülőgép 60 m magasról 60 másodperc alatt földet ér. Más lesz a helyzet akkor, ha a repülőgépet körülvevő levegőtömb valamilyen oknál fogva nincs nyugalomban, hanem emelkedik. A levegő például lejtőszél, termik1 vagy viharfront esetén végez függőleges irányú mozgást. A vitorlázó repülőgép ilyen emelkedő légtömegben a légtömeghez viszonyítva továbbra is süllyedni fog, a földről nézve azonban, a környező levegő-tömeggel együtt emelkedik. (Lendváry, 1998) A vitorlázó repülésben, mint sportban a kitűzött feladatoknak három alapfajtája van: időtartam-, magasság- és távolságrepülés, vagy ezeknek valamilyen kombinációja. Időtartam repülésnél a cél a lehető legtöbb időt egyhuzamban a levegőben tölteni, magassági feladatnál a lehető legmagasabbra történő feljutás, míg távrepülésnél a lehető legnagyobb távolság megtétele. Mint minden sportban, úgy itt is mérni kell valahogy a teljesítményt. Elmondható, 1
A termik: Termikus konvekció alatt azt a folyamatot értjük, amikor a talajfelszín felmelegedése következtében a levegő feláramlása megindul. A feláramlás kompenzációjaként a környező levegőben leáramlás indul meg, így cirkuláció jön létre, melynek feláramlási szakaszát a vitorlázó repülők termikként ismerik. (Sándor & Wantuch, 2005)
1.
hogy napjainkban az egész versenyzés lényegében az átlagsebességről szól. Szinte minden verseny különböző feltételekkel, de végeredményben a legnagyobb átlagsebességet várja el. Az átlagsebességet az egyszerű v =
s összefüggésből számítjuk, ahol a t (t: idő) a start és a cél t
elérése között eltelt idő. A megtett út (s) viszont már kérdéses, hiszen a vitorlázó nem egyenesen repül a célja felé, hanem magasságnyerés céljából letér az útvonalról (kurzusról) és megkeresi a feláramlásokat. Különböző versenyek különbözőképpen számolják a megtett utat. Szakdolgozatomban a Magyar Vitorlázórepülő Kupát (MVK) fogom bemutatni. Fontos megjegyezni, hogy ahány verseny, annyiféle szabályzattal rendelkezik, így az optimalizáció is különböző. A nagy volumenű nemzetközi versenyekre már rendelkeznek optimalizációs megoldások, amelyeket csak egy kattintással ki lehet számolni: például a vitorlázórepülésben legelterjedtebb és ismert térinformatikai programmal, a SeeYou-val. A SeeYou-t az 5. fejezetben fogom bemutatni. Az MVK-ra jelenleg nincs hivatalos optimalizációs eljárás. 1.2. A Magyar Vitorlázórepülı Kupa A Magyar Vitorlázórepülő Kupa (MVK) egy magyar nemzeti bajnokság, melyen megfelelő kvalifikációval indulhatnak a versenyzők. Ez a verseny idény verseny, a 2011-es évben április 1től szeptember 30-ig zajlott. A verseny szabályzatát az MVK honlapján teszi minden évben közzé (MVSZ, 2011). A 2011-es idényben érvényben lévő szabályzatot vettem munkám során figyelembe. A kupában alapvetően kétféle repülési taktikával lehet eredményt leadni: céltáv repüléssel és szabadtáv repüléssel. A céltáv azt jelenti, hogy a megfelelő módon felszállás előtt lett a feladat deklarálva a versenyző által, és azt végre is hajtotta. Gyakorlatilag előre kitűzött magának fordulópontokat, – legfeljebb ötöt 500 m-es sugárral – és azokat érintette is. Szabadtáv repülés esetén felszállás előtt nem volt a feladat deklarálva, csak a versenyző adatai voltak a loggerba betáplálva és arra repült a versenyző aznap, amerre legjobbnak látta az 2.
időjárást és gondolta, hogy a legnagyobb távot tudja repülni. Ezzel gyakorlatilag teljesen szabálytalan görbét ír le, ami akárhogy kinézhet, ahogy a mellékelt ábrák (1. ábra és 2. ábra) is mutatják. A kvázi megrepült távolságot pedig úgy határozzák meg, hogy ezen a szabálytalan görbén felvesznek utólag legfeljebb öt darab pontot a felszállás és leszállás helye mellé, hogy a fordulópontok és a start/cél által kijelölt görbe a lehető leghosszabb legyen. Értelemszerűen a fordulópontok sorrendjének a megrepülés sorrendjével azonosnak kellett lenni. Ezen 5 fordulópontnak a meghatározása lesz a további cél, hiszen egy olyan bonyolult képlet írná le ezen görbét, mely egyszerű matematikai eszközzel nem meghatározható.
1. ábra. MVK Szabadtáv, Víg István HA-4361 2011. Április 10, (MVK On-line)
3.
2. ábra: MVK Szabadtáv, Énekes Bálint, D-0053, 2011. Április 23. (MVK On-line)
Ezen a versenyen a pontszámításnál három fontos tényező játszik szerepet: a megrepült távolság, az átlag sebesség és a repülőgép teljesítményéből2 adódó index. A pont számítást az alább képlet mutatja, melyet az MVK on-line programja végzi (MVSZ 2011): Psebességi = [n*m{(1,3D +2V +V^2/42 +300) / (I/100}] - B Ptávolsági = [n*m*{(1,3d + 300) / (I/100)}] - B Ahol: n = 1, ha a repült feladat céltáv, minden más esetben 0,9 m = 1, ha a deklarált feladat zárt pályás, minden más esetben m = 0,8 D: kiírt távolság (céltáv esetén az előre deklarált távolság)
2
A vitorlázó repülő teljesítményét a siklószáma jellemzi, mely megmutatja hogy 1000 m magasságvesztéssel optimális sebességgel haladva hány km-t tud megtenni. (Lendváry, 1998) Kezdő gépeknél, tanuló gépeknél ez 20-23 körüli, míg nagy teljesítményűeknél akár a 60-at is elérheti!
4.
d: a versenyző által repült távolság D = d szabad távrepülés esetén Psebességi vagy Ptávolsági = 0, ha d/(I/100) < 100 km I: index szám (repülőgép típus besorolás alapján megállapított dimenzió nélküli együttható) B: büntetőpont, melyet a bizottság különböző szabálysértések alapján (pl. légtérsértés, büntető szektorban történő fordulás (sugár = 500-1000 m között), GPS integritás hiányos fájl, túl magasan történő leoldás stb...) ítél meg. A képletből látszódik, hogy a szabadtáv repülést 0,9-es szorzóval büntetik, mert arra könnyebb menni, amerre jobb idő van; mint egy előre meghatározott cél felé. Szintén látszódik, hogy az index számnál (1. számú melléklet) esetén a minél kisebb a jobb. Az a gép kapja a kisebb indexet, melynek kisebb a teljesítménye. 1.3. Adatrögzítés módszerei Az időtartam repülést viszonylag egyszerű mérni, hiszen a földön álló ember is egy stopperral ezt könnyen megteheti. A magassági gyakorlatnál egy hagyományos barográf képes rögzíteni az elért maximális magasságot. Távolság repülésnél már nem ilyen egyszerű. Leggyakoribb és egyszerűbb feladat, a háromszög repülés, ahol adott két fordulópont valamint a honos repülőtér és ennek a két pontnak az érintésével tér vissza a pilóta a felszálló helyére. Bizonyítani, hogy valóban elérte ezt a két fordulópontot, már nem egyszerű. Sokáig volt gyakorlat a fényképes módszer, hogy elérte az adott objektumot (például híd, másik repülőtér, TV torony) amit jellegzetességéről felismert, és lefényképezte. Ennek hátrányai, hogy nehéz bizonyítani, hogy valóban az adott objektum X méteres sugarú körzetében volt (például 3000 m) és nem mondjuk 100 méterrel kintebb. Távoli objektumnál, ha nincs a hitelesítő személynek (szakosztályvezetőnek vagy sportbírónak) kellő helyismerete szintén probléma lehet, hogy valóban az volt-e a célobjektum vagy sem. Újabb kérdéseket vet fel, ha terepre szállás történt, – vagyis nem érte el a célrepülőteret a versenyző–, hogy pontosan mikor ért földet. Ha nincs a
5.
puszta közepén senki, aki látta, hogy mikor landolt, akkor szintén kétségek merülhetnek fel. Ekkor persze a leszállás helyét könnyű igazolni. Az MVSZ 2010-es Szabályzata teljesen eltörölte a fényképezős módszert repülések igazolásaként egy jelvény3 megszerzéséhez. Távolság repüléseknél loggert vagy meghatározott GPS eszközöket fogad el, utóbbi esetben barográfot is alkalmazni kell egyéb feltételek mellett. (MVSZ, 2010, FAI Jelvények) 1.4. Fedélzeti adatrögzítı 1.4.1. Globális navigációs műholdrendszer A globális helymeghatározás napjainkban a köznyelvben még az amerikai Globális Helymeghatározó Rendszerrel (Global Positioning System, GPS) azonos, de valójában többről van már szó. A GPS műholdas rendszeren kívül még léteznek más műholdas navigációs rendszerek, például az európai fejlesztésű Galileo, vagy az orosz GLObal'naya NAvigatsionnaya Sputnikovaya Sistema (GLONASS). Összefoglalóan a navigációs műhold rendszernek nevezzük (Global Navigation Satellite System, GNSS) (Hoffmann-Wellenhof et.al 2008). Viszont, hogy pontosan mely rendszerek érthetők ide, vagy pontosan mit takar ez az összefoglaló név, már bonyolultabb. A GNSS űralapú (space-based) rádiós helymeghatározó rendszer, amely magában foglal egy vagy több műholdrendszert, és ha szükséges, kiegészítő rendszereket annak érdekében, hogy a megkívánt működést szolgálják, azaz biztosítsák a folyamatos (24-hour) háromdimenziójú helyzet-, sebesség- és időinformációt a megfelelő vevőberendezéssel rendelkező felhasználó számára, legyen az a földfelszín bármely pontján, vagy a földfelszín közelében (gyakran a Föld körüli térségben) (Hoffmann-Wellenhof et.al 2008). Ezen meghatározás alapján manapság már elmondható, hogy mind a Galileo és GLONASS is beletartozik, mert már mindegyik rendelkezik fellőtt műholddal. (Inside GNSS, 2011)
3
A jelvények hasonlatosak az autóvezetésnél a jogosítvány kategóriákkal, B, C, D, E, F. Különböző szintű teljesítmény után adják őket. A D vizsgával egyidejűleg szerezhető meg a vitorlázórepülőgép-vezetői szakszolgálati engedély és egyben az ezüstkoszorú is, utóbbinak inkább csak szimbolikus értéke van.
6.
A GPS-t az Amerikai Egyesült Államok Védelmi Minisztériuma (USA Deparment of Defense, DoD) hozta létre 1973-ban katonai célra. Polgári célra egészen 2000. május 1-ig korlátozták az elérhetőségét (Selective Availability, S/A). Az S/A eltörlésével robbanásszerű fejlődés ment végbe és terjedt el a GPS/GNSS használata az egész világon. Jelenleg 30 műhold üzemel, (Inside GNSS, 2011) 2000-től így vált lehetővé, hogy a sportcélú repülésben is kialakuljon egy GPS alapú fedélzeti adatrögzítő eszköz (flight recoreder, FR). Célszerűvé vált, hogy a GPS-es helymeghatározást vegyék alapul repülési adatok rögzítésére a vitorlázó sportban. Jelenleg egy vevővel 10-15 m a pontosság. Finomabban fogalmazva, az esetek kétharmadában 10 méternél pontosabb, öt százalékában viszont 20 méternél is nagyobb lehet a hiba. (Borza T. et al 2005) A Galileo rendszert az Európai Unió fejleszti, jelen pillanatban két műhold van pályán, azok is csak teszt üzemmódban. A rendszer várható teljes kiépítését állandó pénzügyi és politikai problémák árnyékolják be. Jelen állás szerint 2014-re lesz kész. (Inside GNSS, 2011) 1.4.2. Logger A vitorlázórepülésben a fedélzeti adatrögzítő eszközt köznyelvben loggernak (3. ábra) nevezzük, hogy ne legyen összekeverhető a „fekete dobozzal”, ami ugyan hasonló célokat szolgál, de a polgári légiközlekedésben használatos, így a szakdolgozatban továbbiakban loggerként fogok rá hivatkozni.
3. ábra: SDI PosiGraph típusú logger
7.
Mint minden sportban, úgy ebben az esetben megengedett és hitelesített eszközöknek szigorú követelményeknek kell megfelelniük. Jelen esetben a Fédération Aéronautique Internationale (FAI) és az International Gliding Commission (IGC) határozza meg és a honlapján teszi közzé. A FAI/IGC GNSS Flight Recorders-ként határozza meg a loggert, melyből következik is, hogy nemcsak GPS rendszert használhat, hanem a FAI/IGC ide érti a GLONASS és a Galileo műholdas rendszereket is és csak ezeket (FAI, 2011). FAI/IGC részletesen deklarálja, milyen pontosságot kell egy ilyen eszköznek elérnie, milyen interfésszel lehet csatlakoztatni számítógéphez, hova helyezzük el a pilótafülkében, stb. A legfontosabb ezek közül, hogy a kimeneti fájl állomány „IGC” kiterjesztésű legyen és szintén részletesen leírja az IGC fájl kritériumait. Hogy mely eszközök felelnek meg eme kritériumoknak, az IGC GNSS Flight Recorder Approval (GFA) Committee (GFAC) teszteli és értékeli és végül teszi közzé a FAI honlapján: http://www.fai.org/gliding/gnss. Néhány technikai követelmény a teljesség igénye nélkül egy loggerral szemben (FAI 2011): „2.2.2. Letöltött adatok: Mindannak ellenére, hogy az IGC fájl formátum az előnyben részesített, a kezdetben letöltött adatállomány lehet köztes formátumban, úgy mint binárisban. Akármilyen köztes formátumban van, lehetővé kell tenni különálló IGC fájlformátumba való konvertálást vagy azonnal vagy később, biztosítva az adatok IGC fájlban való teljességét és sértetlenségét.” (8. oldal) „2.2.3. Vonatkoztatási rendszerek GNSS adatokra és az IGC fájlra: Hogy IGC hiteles legyen, az a vonatkozó Föld modellek, amiben rögzítik a repülési szélességet és hosszúságot, WGS84 ellipszoidnak kell lennie. Az idő dátuma UTC.” (8. oldal) „ 2.2.4. Nyomás-magasság rögzítés: egy IGC fedélzeti rögzítő eszköznek tartalmaznia kell egy olyan szenzort, aminek az outputja nyomásalapú magasság, és az International Civil Aviation Organisation (ICAO) - International Standard Atmosphere (ISA) szerint van kalibrálva. A nyomás magassági rendszernek kompenzálnia kell a hőmérsékleti változásokat és a szenzornak a GFAC által elfogadottnak kell lennie. ...” (8. oldal)
8.
„ 3.3 GNSS vevő és műhold kapacitás: … IGC-hitelesként … képesnek kell lennie egy időben 12 műholdról adatot fogadnia” (10. oldal) „ 3.9.1 Repülés előtt deklaráció: … az IGC-hiteles rögzítőnek „minden repülés” szintjén, egy elektronikus deklarációs egységet követel.... „ (14. oldal) „6.1 IGC Biztonság – Általános: a hardverre, szoftverre, firmvare-re vontakozó biztonsági folyamatokat úgy kell használni, hogy bármilyen módosítás a repülési adatokban detektálható legyen. Az IGC fájlnál, ez úgy érhető el, hogy a rendszer egy digitális aláírást generál. Ez a rendszer hozza létre a G- (biztonsági) rekordot a fájl végén, ami lehetővé teszi a repülési adatok érvényességének ellenőrzését az IGC elektronikus érvényesítési programján keresztül. …” (15. oldal)
9.
2.
Az IGC fájlformátum Az IGC fájlformátumot szintén a FAI/IGC teszi közzé, jellemzően a logger specifikációval
együtt a fentebb említett honlapon. Az aktuális specifikáció (FAI 2011) 1. sz. melléklete (A1.) tartalmazza, ebből néhány fontos kritérium: “A1 1.1.1 Repülési adat fájl készítése: Lehetségesnek kell lennie különböző és teljes IGC fájl készítésének minden egyes repüléshez, magában foglalva az összes rekordtípust, mely lényeges az adott repüléshez, úgymint fejlécrekord, pozíciók, biztonsági rekord stb. …” ( 30. oldal) Gyakorlatban azt jelenti, hogy minden egyes repülés fel- és leszállástól kezdve külön IGC fájlba kerüljön, ami önállóan is teljes értékű. “A1 2.1. Fájlszerkezet: egy IGC fájlformátum karakter sorokból tevődik össze, minden egyes sor egy önálló adatot jelent, úgy mint egy GNSS pozíció. Minden sor egy nagybetűvel kezdődik, ami megjelöli a rekord típust (lásd 2.2 fejezet) és kocsivissza, sortörés karakterekkel végződik (carriage return, line feed; CR LF). Minden egyes rekord 76 karakter hosszúra van limitálva, leszámítva a CR LF-et, ami rejtve van és nem tűnik elő textformátumban. Néhány rekord egy sorból áll, úgy mint a fejléc tovább a repülés deklarációk több sort tehetnek ki. … A rekord típusok sorrendje egy IGC fájlban az A1.2.3 fejezetben van leírva [a FAI 2011-ben]. Néhány rekord típus csak egy helyen fordulhat elő a fájlban (egyszeri eseti rekordok), mások mint a pozíció rekord, újból előfordulnak az idő múltával (többszörös eseti rekordok)... “ ( 31. oldal) Ezek alapján nevezhetjük az IGC fájlt szekvenciális felépítésűnek. 2.1. Mértékegységek, pontosság az IGC fájlban Minden GPS/GNSS vevő készülék különböző módszerrel, különböző pontossággal konvertálja és tárolja el az adatokat. Az IGC fájlban a következőek (FAI 2011): Magasság: méterben megadva, külön eltárolva GNSS magasság és nyomás magasság, de egy adatsorban. Formátuma: MMMMM.mmm, ahol 5 jegy megadása kötelező, a használaton kívüli karaktereket 0-val jelöljük, a három tizedes nem mindenhol kötelező, rekord függő. 10.
Nyomás: mértékegysége hPa (mb), formátuma PPPP.pp, első karakter lehet 0, két tizedesjegy megadása kötelező. Például: 101325 (ICAO ISA tengerszinti nyomás: 1013,25 hPa) Dátum: UTC dátum, NNHHÉÉ (N - nap, H-hónap, É - év) formátumban. Pl.: 2010. január 1-je: 010110 Idő: UTC idő, ÓÓPPMM formátumban, opcionális lehet másodperc tizedesjegy, de nem kötelező. Szélesség: FF° PP,ppp’ : ahol fok-perc típusban, három tizedesjegy pontossággal kötelezően megadva. •
Magyarország kb. 46-48°szélesség között fekszik, így számolhatunk a 47° szélességen.
•
A WGS84 egyenlítői sugara 6 378 137 m, ebből az egy fok távolság (6 378 137*2*pí) / 360 = 111 319 m, kb. 111 km az Egyenlítőn.
•
Egy foktávolság a 47° szélességen gömb alakkal számolva:
•
cos(47°) * 111 k m = 75,7 km →
•
egy perctávolság 75,7 km / 60, 1’ = 1 261 m.
•
Ennek az ezred része 1,262 m; vagyis elmondható, hogy egy ezred perc szélességi távolság kb. 1 méter.
Hosszúság: FF° PP,ppp’, fok-perc alakban, ahol három tizedesjegy kötelező. Három perc tizedesjegy pontosság esetén egy ezred perc különbséggel azonos hosszúsági körön lévő pontok hozzávetőleges távolsága a következőképpen alakul: •
Ennek a koordinátának a pontossága a szélességhez hasonlóan alakul, viszont itt a foktávolság minden hosszúsági körön kb. 111 km, mert a hosszúsági körök gömbként tekintve a Földet, azonosak
•
1 perctávolság 111 km / 60 km = 1850 m,
•
ebből következik, hogy az ezred perc hosszúsági távolság 1,8 m, kb. 2 m.
11.
Összességében elmondható, hogy nagyságrendileg 1-2 m-es pontossággal tároljuk el az adott pozíciók koordinátáját. Legfeljebb 60 másodpercenként kell rögzíteni az aktuális pozíciót, a legkisebb, amit tárolni tud az 1 másodperces intervallum. Termikben körözésnél halad leglassabban a gép,min. kb. 60 km/h, leggyorsabban pedig a célegyenesben akár 250 km/h órával is. Jellemzően 2-5 mp-es intervallumra szokták a logger rögzítési gyakoriságát állítani. Így leggyorsabb haladás és leghosszabb mentési idővel (250 km/h / 3,6 * 5 mp) = kb 347 m és leglassabb haladás és legrövidebb rögzítéssel (60/ 3,6 * 2 ) = kb. 35 m. Így elmondható, hogy két rögzített pont között a távolság 30-300 m között változhat. 2.2. Rekordok A különböző rekordok különböző jellegű információkat tartalmaznak. Alapvetően két csoportba soroljuk a rekordokat: egyszeri eseti rekordok (A, G, H, I, J, C) valamint többszörös eseti rekordok (B, E, F, K, L, D). A különbség, hogy az egyszeri eseti rekordok csak egyszer és egy adott helyen fordulhatnak elő, ugyanakkor lehetnek több sorosak is. A többszörös eseti rekordok egymást váltva többször is előfordulhatnak, sorrendjük változhat. A rekordok sorrendjét a FAI 2011-es specifikáció A1 2.3-as bekezdése tartalmazza (31. oldal), a rekordok tartalmát a A1 3. fejezet és az A1 4. fejezet tartalmazza 35-44 oldalak. A különböző adatokat egy hárombetűs rövidítés jelöli (three-letter codes, TLC), melyek feloldását a FAI specifikációja tartalmaz (FAI 2011, A1 7. 46-47. oldalak). Ugyanaz az adat különböző rekordokban is előfordulhat, pl. FXA a B, I, J, K rekordban, ami a pozíció pontosságát adja meg. A rekordok tartalma röviden a következők (FAI 2011): 2.2.1. Egyszeri eseti rekordok Az A rekord mindig a legelső a fájlban és a logger széria számát valamint a gyártót tartalmazza. G rekord a biztonsági rekord, mely független a repülés adataitól. A G rekord feladata, hogy a fájl integritását megőrizze, lehet akárhány sor, a tartalmát csak speciális programmal lehet értelmezni. 12.
A H rekord a fejléc (header), ami fontos metaadatokat tartalmaz, például időzóna, dátum, pilóta neve, gép típusa, GPS típusa, nyomásmérő szenzor stb. Némely adat kötelező, de vannak kiegészítő alváltozók is. I rekord opcionálisan megtoldhatja néhány extra adattal a B rekordot (lásd következő fejezet), például környezeti zajszint, motor zajszint, opcionális decimális karakterek. Az I rekord a J rekordhoz hasonlóan csak egyszer fordul elő, a H rekord után, ahol deklarálja, hogy a B rekord hányadik karaktere mit jelenet, amelyek nincsenek benne alapértelmezetten a B rekordba. J rekord az I rekordhoz hasonlóan a K rekordot egészíti ki, azokkal az adatokkal, amelyeket nem szükséges a B rekord gyakoriságával egyszerre rögzíteni (vagyis ritkábban elégséges), de szükséges a repülés alatt folyamatosan frissíteni, például szélsebesség, földhöz viszonyított sebesség, pozíció pontossága, a kurzus iránya stb. Néhány adat lehet az I-ben is és a J-ben is eltárolva, beállítás valamint logger függő. A C rekord felelős a feladat deklarációjáért. Tartalmazza a felszállás, a start, a fordulópontok, a cél és a leszállás helyét. Szabad táv esetén általában leszállás és felszállás helyét deklarálják (honos repülőtér) és a start és a cél megegyeznek velük. 2.2.2. Többszörös eseti rekordok A B rekord a legfontosabb. Ez tárolja a repülési adatokat, útvonalat. A tárolás módja, hogy adott időközönként (2-10 mp.) rögzíti az adott pozíciót és a magasságot valamint az I rekordban definiált egyéb adatokat. A B rekord részletesen a következő fejezetben lesz tárgyalva. Az E rekord a repülés közben bekövetkezett eseményeket (events) rögzíti. Az E rekerod a B rekordokkal együtt fordul elő, és egy időpillanatban vannak rögzítve. Az E rekord megelőzi a vele egy időben rögzített B rekordot. Ilyen események például a GNSS eszközhöz való kapcsolódás, lekapcsolódás, cél elérése, motor indítás, leállítás stb. Az F rekord egy kötelezően rögzített rekord, melyet legfeljebb öt perces időközönként frissíteni kell és az a műholdak helyzetéről ad információt. K rekord az J rekordban meghatározott információkat naplózza, ritkábban, mint a B rekord. Például, ha a B rekord 5 mp-es gyakorisággal rögzít, akkor elégséges a K rekordnak 20 mp is. 13.
L rekord egy napló rekord, ahol szabadon lehet kommentelni, egyéb információkat beírni. Az integritás ellenőrzésénél az L rekordot nem veszik figyelembe, mert nem tartalmaz repülési információkat. D rekord abban az esetben használatos, hogyha differenciál GPS (DGPS4) módszert is alkalmazzák a helymeghatározásban. A D rekord hiánya jelenti, hogy DGPS nem volt használva. Egy IGC fájl részletei az 2. sz. számú mellékeltben megtalálható. 2.2.3. B rekord B rekord tartalmazza adott időpillanatban a pontos időt,, szélességet, hosszúságot, nyomás magasságot, GNSS magasságot. Az idő és a magasság is csak attribútumként fog a dolgozatban megjelenni, így ezen adatoknak az opcionális tizedesjegyeik is elhanyagolhatóak. A B rekordok sorrendje a fájlban időrendben történik, vagyis amelyik sor előrébb van a fájlban, azt rögzítették hamarabb. A B rekord formátuma: ÓÓPPMM
FFPPppp
N/S
FFFPPppp
E/W
V/A
PPPPP
GGGGG
CR
LF
114412
4617200
N
02001758
E
A
00827
00864
sortörés
A V/A jelenti, hogy A esetén rendelkezünk GPS magassággal, V esetén nem rendelkezünk GPS magassággal. N/S északi vagy déli félgömbön vagyunk, E/W keleti vagy nyugati félgömbön vagyunk. Ebből adódik, hogy UTC idő szerint 11:44:22-kor a 46° 17,2” É. sz.-en és 20° 1,758” K. h.on A→GPS magasság van,
nyomás magassága 827 m, a GPS magassága 864 méter. A
későbbiekben a GPS magasságot nem fogjuk figyelembe venni, mert a nyomásmagasság a
4
A DGPS alatt olyan valós idejű, relatív, elsősorban kódmérést felhasználó rendszert értünk, amelybe referencia-állomás adatait szolgáltatásként tudjuk fogni valamilyen kommunikációs csatornán. Az abszolút mérésnek – bekapcsolt S/A esetén biztosított– 100 m-s (Habil & Lénárt, 2003)
14.
repülésben a mérvadó és a pontosabb is. Egy magassági érték elégséges, mert csak leíró attribútumként fog szerepelni. 2.3. IGC konvertálása shape fájllá 2.3.1. Python programozási nyelv A Python egy portábilis, dinamikus, bővíthető, ingyenes nyelv, ami lehetővé teszi a programozás moduláris és objektum orientált megközelítését. 1989 óta fejleszti Guido van Rossum és számos önkéntes. A Python portábilis nemcsak különböző Unix változatokra, hanem MacOS, BeOS, NeXTStep, MS-DOS és különböző Windows változatokra is. Egy új fordítót írtak Java-ban – Jpython-nak hívják – ami Java bytekódot hoz létre. (Swimmen, 2005) Szintaxisa nagyon egyszerű, fejlett adattípusokat kombinál (listákat, szótárakat, ...). Nagyon tömör, ugyanakkor jól olvasható programok írhatók vele. Az azonos funkciójú C és C++ (vagy éppen Java) program hosszának gyakran a harmada, ötöde az egyenértékű (bőségesen kommentált és a standard szabályoknak megfelelően prezentált) Python program, ami általában 5-10-szer rövidebb fejlesztési időt és lényegesen egyszerűbb karbantartást jelent. (Swimmen, 2005) Szakdolgozatomban végig a Python programozási nyelvet használtam és ArcGIS-ben 10-ben dolgoztam. Azért választottam elsősorban a Python nyelvet, mert ezzel könnyen lehet az ArcGIS eszköztárát kezelni és magát a Python scriptet egyszerűen lehet ArcGIS-ba importálni. A Python mellett szólt még az is, hogy sokkal lazább szintaxist használ, mint például a C/C++, valamint elég magas szintű5 nyelvnek számít. További előnynek számít, hogy a Python támogat több geoinformatikai alkalmazást, például a Quantum GIS-t is. A Pythonnál gyakran előnyként hozzák fel a dinamikus típusadást is, de munkám során inkább hátránynak tapasztaltam. "A Python a változót automatikusan azzal a típussal hozza létre, ami a legjobban megfelel az értéknek (Swimmen, 2005.)" Többször előfordul, hogy rosszul ismerte fel a kívánt típust, ezért
5
A magas szintű nyelvek már feladatorientáltak, megjelenik a típus és a változó fogalma, kifejezések kiértékelésével komoly számításokat lehet elvégezni egyszerűen, megjelennek a ciklusok, elágazások. A nyelvek eljárásokat, függvényeket tudnak használni , és komoly paraméteradó mechanizmusokkal vannak felruházva. (Kovács D. L. I. 2004)
15.
típus kényszerítéssel kellett a változónak megadni az értéket. Akkor volt leginkább hátrányos, amikor egész vagy valós szám között kell különbséget tenni. További hátránya, hogy listákat kezel tömb helyett. Egy listának lehetnek különböző típusú értékei, ami rontja a lista elemeinek elérhetőségének gyorsaságát. Nagy elemszámú listánál pedig rendkívül lelassul a program és nem kezeli a más nyelveknél megszokott több dimenziós tömböket hatékonyan. Hogy valódi több dimenziós tömböket tudjak használni, különösen hogy számokat tároljak benne, egy NumPy kiegészítő csomagot használtam. (Scientific Computing Tools For Python, 2011) Ezzel a módszerrel a C/C++-hoz hasonló több dimenziós tömböket tudtam létrehozni, nagy elemszámmal ~ 10 000. A nagy elemszámot az indokolta, hogy a minden egyes B rekordot külön elemként tároljam el az összes releváns adattal. Munkám során több Python verziójú programmal is dolgoztam, mind a Python 2.x és a Python 3.x verziókkal is. A Python 2.6-t az ArcGIS használja, míg a Python 3.x-t a Python fejlesztői erőltetik és nem teszik lehetővé már a 2.x verziójú Python letöltését. Mivel az ArcGIS nem ad elég információt egy hibáról és nem támogatja a hibakeresést és a lépésenkénti futtatást, így a program fejlesztése során WinPythont használtam (Python for Windows, 2011). Néhány külső csomag különböző a 2.x és 3.x v. Pythonban, de ugyanazokat az utasításokat6 tartalmazza, a CD mellékleten rendre külön mappában tároltam a program kóddal együtt Python2 vagy Python3 nevű könyvtárban. 2.3.2. IGC2SHAPE Legfőbb program, amit használtam, az ArcGIS 10 volt, egy rendkívül sokoldalú és kifejezetten térinformatikai problémákra kifejlesztett program. Az egyik legnagyobb erőssége, hogy rendkívül sokoldalú eszközkészlettel rendelkezik (geoprocessing tools), melyeket célszerűen geoinformatikai problémák megoldására hoztak létre.
6
Az utasítások ugyanazt az eredményt adják, de nem a teljes programkód egyezik meg. A Python2 könyvtárban az ArcGIS által használt és futtatott scriptek vannak, míg a Python3 könyvtárban a WinPythonban futtatható scriptek vannak.
16.
ArcGIS-ban létrehoztam egy saját geoprocesszing toolboxot, melynek alapjául a python scriptjeim szolgálnak. Ehhez szükséges az ArcGIS python könyvtárát is beimportálni a pythoncsriptbe: import arcgisscripting
A toolnak két argumentuma van, a bemeneti fájl teljes elérése és egy feature class file mentésének a teljes elérése névvel együtt (4.): inputsource = sys.argv[1] outputfile = sys.argv[2]
4. ábra: IGC2shape tool dialógalbak (bal) és paraméter lista (jobb)
Ahhoz, hogy shape fájlt készítsünk, szintén egy nyílt forrás kódú külső könyvtárat használtam, a shapefile.py-t (Python Shapefile Libary, 2011). Ez a külső könyvtár tartalmazza a shapefile leírását, felépítését, shapefile író- és olvasófüggvényeket. import shapefile
A shapefile könyvtár beimportálása, a program scripttel egy mappában kell lennie.
17.
Így
könnyen
létre
tudok
hozni
egy
shapefilet
úgy,
hogy
a
könyvtár
a
shapefile.Writer() utasítását használom, mely shapefilet egy shapefile típusú változóban tárolok el, attribútumként megadom a geometriáját (pont, vonal, poligon stb.). Pl.: w = shapefile.Writer(shapefile.POLYLINE)
A shape filehoz létre tudok hozni attribútumokat is, különböző típusokkal a w.field() utasítással. (w a shapefile típusú változó neve, a további példákban is) Pl.: w.field('Altitude','N', 10, 1) #szám típus w.field('Ido','C','40') #szöveg típus
Egy új elemet geometriától függően a w.line() vagy w.point() eljárásokkal tudok hozzáfűzni és az aktuális elemhez tudok attribútumot a w.record() eljárással csatolni. Pl.: w.line(parts=[[[27.1234,47.111],[27.234,47.2222]]]) #7!!! elıször mindig a vízszintes koordináta w.record(Altitude=110, Ido="11:23:44")
A program megnyitja, majd beolvassa a fájl első sorát. Utána elindít egy while ciklust, ami először feldolgozza az aktuális sort, és a ciklus végén beolvassa a következő sort. A ciklus addig fut, amíg a beolvasott sor nem üres (vagyis elérte a fájl végét és nincs több sor). Gyakorlatilag hátultesztelős ciklusról van szó, noha a Python ezt sem ismeri önmagában. Ha a beolvasott sor első karaktere "B", tehát B rekord, akkor lép tovább, egyébként olvassa a következő sort. A B sorokat két függvény a brow_LAT() és brow_LON() dolgozza fel, melyek rendre a szélességgel és a hosszúsággal térnek vissza: def brow_LON(sor): if sor[0]=="B": LONMst=sor[18]+sor[19]+"."+sor[20]+sor[21]+sor[22] LONM=float(LONMst)
7
# jel kommentezést jelenti, ami utána következik, azt a program nem veszi figyelembe. Az adott utasítás néha magyarázatra szorul.
18.
LONDst=sor[15]+sor[16]+sor[17] LOND = float(LONDst) LOND +=LONM/60 return LOND
Ahol először szöveggé konvertálja a megfelelő pozíciójú koordinátákat, majd átszámolja fokba és egy valós típussal tér vissza. A brow_ALT() a magassággal, a brow_TIME() az idővel tér vissza, működésük alapja a brow_LON()- hoz nagyon hasonló, de az brow_TIME() a szöveg formátummal tér vissza, pl.: "11:23:45" A ciklusmagban vonal típusú shape fájlhoz adjuk az aktuális B rekord adatait úgy, hogy mind az előzőleg beolvasott koordináta páros lesz az új vonal kezdőpontja és az újonnan beolvasott sor koordinátái lesznek a végpontja, az új sor magasság és idő értékét kapja meg attribútumként. if not LATD_o: #Az elsı vonal esetén nincs kezdıpont még LATD_o = brow_LAT(rows) LOTD_o = brow_LON(rows) rows = f.readline() else: # minden más vonal esetén LATD_o = LATD_d LOTD_o = LOTD_d LATD_d = brow_LAT(rows) LOTD_d = brow_LON(rows) w.line(parts=[[[LOTD_o,LATD_o],[LOTD_d,LATD_d]]]) w.record(Altitude=brow_ALT(rows), Ido=brow_TIME(rows)) rows = f.readline()
Végül elmentjük a shape filet, w.save(outputfile)
majd hozzárendeljük arcgis tool segítségével a koordináta rendszert. coordsys
=
"Coordinate
Systems/Geographic
Systems/World/WGS 1984.prj" gp.defineprojection(outputfile, coordsys)
19.
Coordinate
3. IGC fájl optimalizálás Azt a folyamatot, mikor szabadtáv esetében megkeressük az öt fordulópontot, hogy a repült távolság hossza maximális legyen, optimalizálásnak nevezzük. A szabályzat ugyan öt pontban maximalizálja a fordulópontok számát, vagyis lehet kevesebb. Könnyen belátható, hogy a görbe csak hosszabb lehet, ha több töréspont van benne. Az optimalizálás folyamatát az 5. ábra mutatja röviden.
5. ábra: Optimalizálás folyamatábra
20.
3.1. Dinamikus programozás Az optimalizálási problémára Dr. Makay Géza (Szegedi Tudomány Egyetem, Bolyai Intézet Analízis Tanszék) tanácsára a dinamikus programozási algoritmust választottam, mely algoritmus alapvázának a megszerkesztésében is segített. A dinamikus programozás lényegében az összes részprobléma megoldását kiszámítja. A számítás a kisebb problémáktól a nagyobbak felé halad, és a válaszokat egy táblázatban tárolja. A módszer előnye onnan adódik, hogy ha egyszer egy részproblémát megoldott, a választ elraktározza, és a későbbiekben már nem számítja ki újra. ( Aho, 1982) Másképp fogalmazva a dinamikus programozás akkor alkalmazható, ha a részproblémák nem függetlenek. A dinamikus programozás minden részfeladatát pontosan egyszer oldja meg és az eredményt egy táblázatban tárolja, és ezáltal elkerüli az ismételt számítást, ha a részfeladat megint felmerül. A dinamikus programozást optimalizálási feladatok megoldására használjuk. Ilyen feladatoknak sok megengedett megoldása lehet. Mindegyiknek van értéke és mi az optimális értékűt kívánjuk megtalálni. Egy ilyen megoldást egy optimális megoldásnak nevezünk, szemben azzal, hogy az optimális megoldás, mivel más megoldások is elérhetik az optimális értéket. (Cormen, 2001.) A mi esetünkben az optimalizáció célja a repülési útvonalon legfeljebb öt olyan fordulópont megtalálása, melyek a kezdő és végponttal összekötve maximális hosszú görbét adnak eredményül. Az optimális érték ez az úthossz, melyet a fordulópontok jelölnek ki. Az adatok tárolása két táblázatban történik, az egy az f[i][j]8 tömb, melyben az i-edik pontban adja meg j db fordulópont esetén adja eredményül a maximális úthosszt.
8
A Python nyelv több más nyelvhez hasonlóan a tömbök, listák indexelését 0-tól kezdi, vagyis az első eleme valójában a nulladik. Szakdolgozatomban a félreértések és elindexelések elkerülése végett, a 0. indexet egyszerűen figyelmen kívül hagytam és az i-edik pont így mindig a tömb i-edik eleme lesz és nem az i-1-edik. Így a tömb definiálásánál is eggyel nagyobb méretű minden dimenzió esetén. Pl. ha ismert a pontok száma (nr_p), akkor a pontokat tartalmazó tömb mérete pontok[nr_p+1], és a pontok[0] = 0, valamint a pontok[1] tartalmazza az első pontot.
21.
FONTOS! Innentől kezdve, amikor a fordulópontok számát említjük, abba beleértjük a kezdő és végpontot (felszállás/leszállás helyét) is. Ha az MVK-ra 5 fordulópontot keresek, akkor valójában 5+2 fordulópontom van. Ebből következik, hogy nemcsak azt számolom ki, hogy 7 fordulópont esetén mennyi a maximális úthossz, hanem 1, 2, ... és 7 darab fordulópont esetén mennyi a maximális úthossz. Ennek a szükségességét az algoritmus fogja bemutatni. Ebből adódik, hogy ha az IGC fájl nr_p darab pontot tartalmaz és nr_t darab fordulópontunk van, akkor a maximális hossz az x=f[nr_p][nr_t] A másik táblázatban, fpontok[i][j][k] az i-edik B rekordban j darab fordulópont esetén
a
k-adik
fordulópontnak
mi
az
indexe.
Ebből
következik,
hogy
fpontok[i][j][k]<=i, mert az i-edik pontban a fordulópont sorszáma nem lehet nagyobb, mint maga az i-edik pont sorszáma, az egyenlőség pedig csak akkor megengedett, ha j = k, mert ezen azt értjük, hogy az i-edik pont a végpont. (Algoritmus során látni fogjuk, hogy majdnem minden pontot végpontnak fogunk tekinteni). Tovább következik még, hogy j>=k, hiszen, ha van j darab fordulópontunk, akkor nincs értelme j-nél nagyobb sorszámú fordulópontról beszélni. Ha j=1, akkor a kezdőpontban, ha j=k, akkor a végpontban vagyunk. Amennyiben csak az optimális értékre lenne szükségünk, feleslegessé válna az fpontok tömb, de a feladat megkívánja, hogy mondjuk meg milyen esetben kaptunk optimális értéket, vagyis hol voltak a fordulópontok. 3.1.1. Legkisebb részfeladat: távolság számítása A dinamikus programozási megoldás legkisebb részfeladata két pont közötti távolság számítására vezethető vissza, mert a repült maximális távolság visszavezethető két pont közötti távolságra. A B rekordból ismert koordinátákról már tudjuk, hogy WGS84 ellipszoidi koordináták. Mivel a versenyben a 0,1 km az elvárt távolságpontosság, így célszerű nem az ellipszoidon számolni a távolságot, mert az ellipszoid felületén szükségtelenül bonyolult, hanem egy vetületi rendszerben. Én vetületi rendszerül az UTM vetületet választottam, mert globális és WGS84-ből viszonylag könnyen átszámíthatóak a koordináták. Azért nem az EOV-t 22.
választottam, mert noha az a Magyarországon hivatalos és elfogadott vetület, WGS84-ből átszámolás jelentősen növelte volna a program bonyolultsági fokát és ezzel a futásidejét, ugyanakkor az elvárt pontosság tekintetében az UTM is elégséges. EOV torzulása: 1/10 000 az X tengely mentén míg az UTM hossztorzulás 1/2500. (Bácsatyai, 2006) UTM további előnye, hogy egyes GPS vevők lehetővé teszik, hogy az UTM-vetületre vonatkozó koordináták is közvetlenül kijelezhetőek legyenek. A koordináta transzformációra dr. Takács Bence (BME, egyetemi docens) számítási segédletét használtam fel. (Takács B, 2006). Az optimalizációs programban (5. sz. melléklet) UTM(fi_wgs84,lam_wgs84) számolja, melynek két bemeneti paramétere a WGS84 koordináta páros. Az UTM() függvény meghív egy segéd függvényt a WGS()-t, mely WGS84 koordinátákat számítja át a segédgömbi koordinátákra. A program még az adatok beolvasása során tárolja egy 4 dimenziós tömbben mind a WGS84, valamint a számított UTM koordinátákat. Amikor távolságot számol a distance(pont1, pont2) függvénnyel akkor az UTM koordinátákból számolja a derékszögű koordinátarendszerben használatos két pont közötti távolságot. A distance() függvény csak pont indexekkel dolgozik és float típussal tér vissza. A távolság számító függvény pontosságát úgy vizsgáltam meg, hogyan az öt EUREF alappont egymáshoz viszonyított összes lehetséges távolságát kiszámoltan EOV-ban (1. táblázat) is valamint UTM-ben (2. táblázat) is. Összehasonlításul vettem a két távolság különbségét és a két távolság átlagát, majd ezekből az adatokból kiszámoltam az átlagos távolságra jutó átlagos eltérést 1000 kilométerre méterenként (3. táblázat). Az EOV koordináták Takács B. jegyzetéből származnak, az UTM koordinátákat pedig az UTM függvénnyel számoltam ki egyesével.
23.
Y X–>
Csanádalberti 775016,42 109637,02
Csarnóta 585536,6 60221,29
Penc 667539,25 271786,72
Sopron 466457,99 258621,35
Tarpa 910597,72 315396,39
109637,02 60221,29 271786,72 258621,35 315396,39
195818 194535 342644 246413
195818 226902 231392 413254
194535 226902 201512 246940
342644 231392 201512 447754
246413 413254 246940 447754 -
EOV Y
X
775016,42 585536,6 667539,25 466457,99 910597,72
Csanádalberti Csarnóta Penc Sopron Tarpa
1. táblázat: EOV koordináták és távolság különbségek az EUREF alappontok között
Csanádalberti
Csarnóta
Penc
Sopron
Tarpa
474654,4697
284069,9835
371290,9166
169879,6565
615268,4272
X–> 5129607,064
5084882,659
5294345,447
5286278,852
5331859,838
UTM Y Y
X
Csanádalberti 474654,4697
5129607,064
0
195762
194481
342686
246330
Csarnóta 284069,9835
5084882,659
195762
0
226897
231516
413147
Penc 371290,9166
5294345,447
194481
226897
0
201573
246845
Sopron 169879,6565
5286278,852
342686
231516
201573
0
447715
Tarpa 615268,4272
5331859,838
246330
413147
246845
447715
0
2. táblázat: UTM koordináták UTM-EOV m/1000 m
Csanádalberti
Csarnóta
Penc
Sopron
Tarpa
Csanádalberti
0,0000
0,2843
0,2790
-0,1239
0,3356
Csarnóta
0,2843
0,0000
0,0215
-0,5372
0,2604
Penc
0,2790
0,0215
0,0000
-0,3024
0,3844
Sopron
-0,1239
-0,5372
-0,3024
0,0000
0,0866
Tarpa
0,3356
0,2604
0,3844
0,0866
0,0000
3. táblázat: Az UTM és EOV távolságok közötti különbség
Látszódik a 3. táblázatból, hogy ez még megfelel a vetületi elvárásoknak, nem haladja meg a tévedés a kilométerenkénti métert, a legnagyobb hiba az 0,53 m Csarnóta-Sopron távolságnál, ami egyébként is a legnagyobb távolság a pontoknál, 342 km. A
CD
mellékleten
tovább
található
egy
részletesebb
Excel
tábla
(\Távolságok\tavolsga_statisztika.xlsx), ahol összehasonlítom még a Takács jegyzetben található térbeli WGS84 koordinátákkal számolt távolságot mind az UTM és EOV távolságokkal.
24.
3.1.2. Optimalizációs algoritmus Az 4. sz. mellékletben található az egész optimalizáló algoritmus. Első lépésben beolvassuk az optimalizálni kívánt shape fájlt, majd az numRecords() metódussal lekérjük a rekordok számát. Mivel vonal geometriájú shape fájlról van szó, így eggyel több pontunk van, mint ahány vonal szakaszunk. sf = shapefile.Reader(inputsource) inshape = sf.shapes() nr_p = sf.numRecords+1
Létrehozunk egy 4 dimenziós tömböt, pontok száma + 1 nagyságú tömböt (0. indexet nem vesszük figyelembe) és kinullázzuk a zeros()9 függvény segítségével. ponts = zeros((nr_p+1,4))
Végig megyünk a tömbön és feltöltjük az összes vonal szakasz kezdő koordinátáival a második dimenziót, ahol a 0.10 (fi) és 1. (lambda) elembe a WGS84 koordinátákat, majd a 2. (Y) és 3. (X) elembe pedig a számolt UTM koordináták kerülnek. for i in range (1, nr_p): ponts[i][0] = float(inshape[i-1].points[0][1]) ponts[i][1] = float(inshape[i-1].points[0][0]) helper = UTM(ponts[i][0], ponts[i][1]) ponts[i][2] = helper[0] ponts[i][3] = helper[1]
Az ponts[][]
tömb első dimenzió utolsó elemébe kerül az utolsó vonalszakasz
végkoordinátája.
9
Azért kell kinullázni és azért a zeros() függvénnyel, mert így biztosított, hogy float típusú számokat tárolunk el, valamint már előre ismerjük a tömb méretét. A zeros() függvényt a numpy könyvtár tartalmazza.
10
Ebben az esetben van csak használva a 0. elem a második dimenzióban, mert maga a második dimenzió mindig 4 koordinátát tartalmaz, és magukkal a koordinátákkal nem dolgozik az optimalizációs algoritmus, csak a shape fájlba írás.
25.
ponts[i+1][0] = float(inshape[i-1].points[1][1]) ponts[i+1][1] = float(inshape[i-1].points[1][0]) helper = UTM(ponts[i+1][0], ponts[i+1][1]) ponts[i+1][2] = helper[0] ponts[i+1][3] = helper[1]
Létrehozzuk a megfelelő nagyságú f[][] és fpontok[][][] tömböt. f = zeros((nr_p+1,nr_t+1)) fpontok = zeros((nr_p+1,nr_t+1,nr_t+1))
Egy for ciklussal kiszámoljuk első körben az első pont és az i-edik pont közötti távolságot. Ez jelenti gyakorlatban, hogy csak két fordulópontunk van. (Vagyis start és cél, közbenső töréspont nélkül, 6. ábra). Ezt rendre el is tároljuk az f[][] és fpontok[][][] tömbben. for i in range(1, nr_p+1): f[i][2]= distance(1,i) fpontok[i][2][1]= 1 #nyílvánvaló, hogy [][2][]–> 2 fordulópont esetén az [][][1] fordulópont csak is a start lehet. Ez garantálja, hogy a kezdıpont mindig az elsı pont lesz. fpontok[i][2][2] = i #[][2][] darab fordulópont esetén [][][2] jelenti a végpontot, ami jelen esetben az i.
6. ábra: Az első és összes többi pont közötti távolság kiszámítása minta pontoknál
26.
Innen kezdődik a teljes algoritmus, ahol a legkülső for(j) ciklus folyamatosan növeli a fordulópontok számát. Mivel már két fordulópontra az előző algoritmus kiszámolta, így a harmadiknál kezdődik a keresés. "j" fogja jelölni, hogy épp hány darab fordulópontot keresünk. for j in range(3,nr_t+1):
Egy belső for (i) ciklussal végig megyünk az összes ponton, és minden i-edik pontra úgy fogunk tekinteni, mintha végpont lenne. A ciklust a minimum a j-edik ponttól kell indítani, mert a keresett fordulópont indexe nem lehet kisebb, mint ahány darab fordulópontunk van. Másképp pl. a 4. fordulópont nem lehet a 2-es indexű pontban, csak minimum a 4. pontban, mert az előző fordulópontoknak is lenniük kell valahol. Ezen a cikluson belül létrehozunk egy lokális változót, ami megmutatja, hogy j db fordulópont esetén mennyi a maximális hossz, kezdetben 0. for i in range(j,nr_p+1): mx =0
Innentől kezdve az i-edik pontra, mint egy fix pontra kell tekinteni. A következő és legbelső for(k) ciklus szintén j-1–től az aktuális végpontig (i-edikig) fog végig menni. A j-1 a rekurzivitás. Jelentése, hogy eggyel kevesebb darab számú fordulópont esetén, már ismert az optimum és a hozzá tartozó leíró értékek. Másképp, a k-adik pontban, ha eggyel kevesebb fordulópontunk lenne, akkor tudnánk, hogy k-ban, mint elméleti végpontban (NEM i-ben) eggyel kevesebb darabszámú fordulópont esetén mi az optimális megoldás és mely pontok azok (indexeik <=k). A for(k) ciklus lényege, hogy ha i a végpont, akkor j darab fordulópont van, ha k a végpont akkor j-1 és k
27.
for k in range(j-1, i): x = f[k][j-1]+distance(k,i) if x>mx: mx=x for l in range(1,nr_t+1): #ez csak átmásolja a k-ban optimális fordulópont listát i-hez. fpontok[i][j][l]=fpontok[k][j-1][l] fpontok[i][j][j] = i #mivel j db fordulópontunk van, ezért a j-edik fordulópontnak a célnak kell lennie, ami az ieidk pontban egyértelmően csak i lehet. f[i][j]=mx
Láthatjuk, hogy összefoglalva az algoritmus úgy működik, hogy megnézi, adott pontban előtte mely pontokban eggyel kevesebb fordulópont esetén mi volt az optimum és ha a vizsgált pont, valamint előtte lévő pontok távolságához hozzáadjuk az előtte lévő pontok optimumát, akkor ez mikor van maximumban (7. ábra).
7. ábra: Az új fordulópont megtalálása
28.
A teljes minta 8 darab ponttal és 4 keresett fordulóponttal (start és cél is beleszámítva) CD mellékleten található (Tesz\minta_pontok.pptx). Mivel 3 fordulópont a minimum, amit keres, így amikor megnézi az eggyel kevesebb fordulópont esetén mi volt az optimum (vagyis 2), akkor azt már egy blokkal fentebb kiszámoltuk. Mivel mindig azt nézzük, hogy mi volt az előző pontban, így visszajutunk oda, hogy legelső esetnél a 3. pontban a 2. pont 3 darab fordulópont esetén lehet-e optimum. Ekkor még mx=0, így lehet fordulópont. Innentől
kezdve
fpontok
tömbben
az
fpontok[nr_p][nr_t][]
harmadik
dimenziójában van eltárolva a fordulópontok indexe. Ezen indexeket felhasználva, a ponts[][] tömbből a megfelelő koordinátákat ( [][0. és 1.] ) felhasználva kiírjuk egy pont típusú shape fájlba, ahol attribútumként még kiírjuk a WGS84 koordinátákat, UTM koordinátákat, az adott fordulópontig a távolságot és a pont sorszámát (úgy, hogy az első pont sorszáma 1., 8. ábra) w = shapefile.Writer(shapefile.POINT) w.field('WGS84_fi','N', 18, 10) w.field('WGS84_la','N', 18, 10) w.field('flown_distance','N', 18, 10) w.field('UTM_X','N', 18, 10) w.field('UTM_Y','N', 18, 10) w.field('Turn_point_ID','N', 18, 10)
for i in range(1,nr_t+1): #i a fordulópont sorszáma j = int(fpontok[nr_p][nr_t][i]) #az i-eid fordulópont indexe LATD_o = ponts[j][0] LOTD_o = ponts[j][1] w.point(LOTD_o,LATD_o) w.record(WGS84_fi=LATD_o, float(f[j][i]),
UTM_X
=
WGS84_la=LOTD_o,
ponts[j][2],
Turn_point_ID = j)
29.
UTM_Y
flown_distance =
=
ponts[j][3],
8. ábra:Fordulópontokat tartalmazó shapefile attribútum táblája ArcGIS 10-ben
30.
4. Eredmények vizualizálása 4.1. ArcGIS 10 4.1.1. Geoprocessing toolbox A CD melléklet két toolboxot tartalmaz, az egyik a teszt.tbx a \Teszt mappában valamint a szakdolgozat.tbx-et a gyökér könyvtárban. A teszt egy tesztpontokra készített optimalizációs scriptet tartalmaz, míg a szakdolgozat.tbx tartalmazza az IGC2shape és teljes optimalizációs scriptet.
9. ábra:Szakdolgozat eszköztár(bal) és Teszt eszköztár (jobb)
A tesztprogram kéri a pontállományt (points.txt), mely létrehoz egy vonal és egy pont geometriájú shape fájlt a mintapontokkal és végül egy optimalizált shape állományt (pont geometria), mely a fordulókat tartalmazza, melyek darabszámát szintén a dialóg ablakban kell megadni (10. ábra). A bemeneti fájl első sora tartalmazza a pontok számát, majd minden páros sor az X koordinátát, a páratlan sorok pedig az Y koordinátát. A teszt pontok egy hagyományos derékszögű koordinátarendszerben értendők (X, Y). Hogy ArcGIS-ben is biztosítva legyen derékszögű koordináta rendszer, így EOV koordináta rendszert rendeltem hozzá. Így a pontok távolsága méterben lesz megadva. Fontos, hogy amikor a fordulók számát adjuk meg, akkor csak a valódi fordulók számát kéri itt is, valamint teljes optimalizációs script is, vagyis a startot és a célt nem beleszámítva. MVK esetén így maximum 5 lehet. Ekkor program kettővel megnöveli a fordulók számát.
31.
10. ábra: Teszt script dialóg ablakja ArcGIS 10-ben
4.1.2. Felhasznált térkép Mivel légügyi adatokról van szó, így a felhasznált alaptérképem nyílt forráskódú légügyi térkép (Worldwide Soaring Turnpoint Exchange, 2011). A formátuma Open Air format (User's Guide SUA, 2011). Az OsGeo4W nyílt forráskódú alkalmazás (OsGeo4W, 2011) tartalmazza a GDAL alprogramot (Geospatial Data Abstraction Library, 2011). Ez a program a különböző térbeli információs állományok között tud konverziót végezni. Ismeri az Open Air formátumot is és az ESRI shape fájlt, így egy egyszerű paranccsal átkonvertáltattam ESRI shape fájllá. A légtereket a ICAO Légiforgalmi Térkép (1:500 000, 2009. június 30) alapján szimbolizáltam. A Térkép tovább tartalmaz egy szabadtávot is az idei MVK-ról, Énekes Bálintét (11. ábra). Magasság szerint színeztem. Mivel vitorlázásban a nagyobb magasság a jobb, így kapott zöldet a magasabb pozíció, míg az alacsonyabb a piros felé erősödik. A teljes vörös az 500 m alatti területet jelzi, ami már a leszállási magasságot jelenti. Az egyéb alap adatokat, mint pl. műút, folyók, tavak stb. a DTA50 (HM Térképészeti Közhasznú Nonprofit Kft., 2011 ) térképek felhasználásával készítettem el. 32.
11. ábra, Énekes Bálint, D-0053, 2011. Április 23. (MVK On-line) fordulópontokkal
33.
4.2. SeeYou A SeeYou programot a Naviter fejleszti kifejezetten IGC fájl feldolgozásához és grafikus megjelenítéshez (12. ábra). Teljes egészében kezeli az IGC fájl minden rekordját is.
12. ábra: IGC fájl SeeYouban (FAI WGC 2011)
Repülési adatokat számol úgy mint szélsebesség, termikek száma, körözési irány a termikben és egyéb hasznos statisztikai adatokat (13. ábra).
34.
13. ábra: IGC fájl számol statisztikai adatai SeeYouban
A SeeYouban lehet loggert csatlakoztatni és adatokat kiolvasni ill. rátölteni. Így lehet benne előre feladatot is deklarálni, valamint a beolvasott IGC fájlra utólag bevenni az optimalizált fordulópontokat. A SeeYou képes néhány versenyre vagy feladatra optimalizálni. SeeYou motorral lehet például versenyre kiírást készíteni (5. sz. melléklet). 4.3. Utólagos feladat megadása Nulladik lépésként ellenőrizni kell, hogy WGS84 ellipszoidon számolunk-e, ha nem, át kell állítani az Eszközök/Egyéb lehetőségek... menüben, az "Általános lap/Távolság számítása:"
35.
opciónál. Ugyanitt célszerű beállítani szélesség/hosszúság formátumát DD.dddddd-ra, mert az optimalizációs program is ilyen formátumban adja meg (14. ábra).
, 14. ábra: Beállítások SeeYou-ban
Első lépésként adjuk hozzá az eredményül kapott fordulópontokat, célszerűen elnevezve (pl. pont 1, pont 2 stb.) a Szerkesztés/Útvonalpontok opciónál. Második lépésként a Szerkesztés/Feladat megadása... pontban megnyitjuk a Repülési tulajdonságok párbeszédablakot és hozzáadjuk az új fordulópontokat és megkeressük a listából az általunk felvett pontokat (15. ábra) majd láthatjuk az eredményt, amit a SeeYou kiszámolt. Ez az eredmény azért térhet le, mert az algoritmus az első rögzített pontot vette mint startot, és nem a repülőtérre megadott koordinátát, hasonlóan a leszállásnál is. Ez akár 1-2 km-es eltérést is okozhat a kifutó pálya függvényében, mert nem mindegy, hogy melyik végén indult és landolt, valamint ehhez képest hol helyezkedik el a repülőtéren az őt jelképező pont.
36.
15. ábra: Feladat megadása SeeYou-ban
Az
ikonokkal lehet pontokat hozzáadni vagy törölni.
37.
5. Összegzés Az elkészített programok alkalmasak az MVK optimalizációra, de nem helyettesítik a SeeYou-t. A kitűzött célt teljesítik, hiszen biztosan a leghosszabb úttal tér vissza és ezen út koordinátáit megadja valamint geoinformatikában használatos formátumra konvertálja az IGC fájlt. Ugyanakkor a z IGC2shape folyamat során rengeteg információt veszítünk el, így célszerűbb lenne a többi rekord adatait akár meta adatként, akár egy összetettebb táblázatban vagy egyéb formában tárolni, mert az így keletkezett shape fájl keveset mond el a repülés mellékes adatairól. Fontos kikötése a programnak, hogy a segédmotoros11 vitorlázók esetén nem használható, mert nem figyeli a motorindítást és leállítását. Ez a program továbbá azt sem figyeli, hogy mikor történt a fel- ill. leszállás, mert a FAI/IGC előírja, hogy milyen vízszintes vagy függőleges sebesség minimum esetén tekinthető mozgó járműnek. Így a pontos indulás és érkezési hely is kérdéses. Az optimalizáció során, célszerű lenne áttérni egy alacsony szintű nyelvre, pl. C/C++, mert hatékonyabban kezeli a nagy elemszámú tömböket, így a futás ideje csökkenhet. Jelenleg a program futásideje kb. 20 perc vagy több, ha öt valódi fordulópontot keresünk. Az optimalizációs algoritmus nem ír bele az IGC fájlba, hanem csak a SeeYouban tudjuk utólag kézzel felvenni a fordulópontokat. Mind az ArcGIS, mind a SeeYou kereskedelmi ára viszonylag magas, így legcélszerűbb lenne, ha ki lehetne váltani egy nyílt forráskódú programmal, pl. Quantum GIS-szel a megjelenítést. A Python program biztosan átültethető Quantum GIS-be is. ArcGIS használata egyébként is elhagyható, hiszen a PythonWinben is futtatható az IGC2shape és az optimalizációs program, azzal a kikötéssel, hogy nem tud koordináta rendszert hozzárendelni.
11
Segédmotort felszálláskor szoktak alkalmazni, hogy helyettesítsék a csörlést vagy a felvontatást. Segédmotor akkor is alkalmazható, amikor az időjárás következtében terepre kényszerülne szállni, ugyanakkor motorindítással még haza tud térni. Ilyen esetben a motor leállítása és indítása között naplózott pontok csak a felhasználhatóak. A segédmotoros vitorla nem összekeverendő a motoros vitorlának (MOVIT) minősített repülőkkel.
38.
Így a shape fájl bármely más programmal megnyitható, csak figyelembe kell venni, hogy első lépéssel koordináta rendszert kell hozzárendelni. Az optimalizációs algoritmus hatékonysága is javítható lenne, hogy például az útvonal töréseit is figyelembe venné és nem minden ponton menne végig, hanem csak azokon, ahol valóban jelentős irányváltoztatás történt. A vélhető termikeket is lehetne egyszerűsíteni, mert nagy a pontsűrűség bizonyos helyeken. A hatékonyság növelése csak a futásidőt rövidítené! Előnyös lenne, ha az optimalizációs program az IGC fájlt használná fel és abba bele is tudná írni a megtalált fordulópontokat, így a SeeYout-t is meg lehetne kerülni. Mindazon által, hogy IGC fájlt, vagy shape fájlt optimalizálunk, nincs jelentősége, mert a koordináták ugyanazok, csak a beolvasásban van különbség. A későbbiekben a Vitorlázórepülő Társadalmi Sportbizottsággal (VTSB) együttműködve az alap optimalizációs programot a vitorlázórepülő-társadalom számára elérhetővé lehetne tenni, és akár az MVK-ra hiteles programmá lehetne fejleszteni.
39.
IRODALOM JEGYZÉK Aho, V. A. – Hopcroft, J. E. – Ullman, J. D, ford. Surányi L, 1982, Számítógépes algoritmusok tervezése és analízise, Műszaki Könyvkiadó, Bp. 487 p. Bácsatyai L., 2006, Magyarországi vetületek, Szaktudás Kiadó Ház Zrt, Bp, 228 p. Borza T. – Gerő A. – Mohos Z. – Szentpéteri L., 2005, GPS mindenkinek, Sztrato Kft., Bp., 240 p. Cormen, T. H. – Leiserson C. E. – Rivest, R. L, 2001, Algoritmusok, Műszaki Könyvkiadó, Bp. 884 p. Dayley, B., fordította Szabó Zoltán, 2008, Python zsebkönyv, Kiadó: Kisakup Kft, Bp., 267 p. FAI/IGC TECHNICAL SPECIFICATION FOR GNSS FLIGHT RECORDERS Second Edition – December 2010 with Amendment 1 – 31 May 2011, Forrás: http://www.fai.org/gliding/gnss [2011. 10. 12] GDAL : Geospatial Data Abstraction Library, http://www.gdal.org/ [2011.11.25] Habil T. J – Lénárt Cs., 2003 Terepi térinformatika és a GPS gyakorlati alkalmazása, Debreceni Egyetem Mezőgazdaságtudományi Kar, Debrecen, 199 p. HM Térképészeti Közhasznú Nonprofit Kft., http://www.topomap.hu/webshop/index.php?menu=dta50leiras [2011.12.04] Hoffmann-Wellenhof B. – Lichtengegger H. – Wasle E., 2008, GNSS – Gobal Navigation Satellite Systems, GPS, GLONASS, Galileo and more, SpringerWien, New York, 516 p. ICAO, 2009 Légiforgalmi Térkép, (2252-B – 2251-A) Magyarország, Méretarány 1:500 000 HM Térképészeti Közhasznú Társaság Inside GNSS, http://www.insidegnss.com/aboutgps [2011.11.18] Kovács D. – Lehel I., 2004, Programozási nyelvek összehasonlító elemzése: A programozási nyelvek anatómiája, Egyetemi Kiadó, Kolozsvár, 262 p.
40.
Lendváry Cs., 1998, Kezdő vitorlázórepülő oktatási segédlet, Magyar Repülő Szövetség, Bp., 315 p. Magyar Vitorlázórepülő Szövetség (MVSZ): Magyar vitorlázórepülő kupa versenykiírás: 2010v1.0 http://www.soaringhungary.hu/download.php?view.1 [2011.11.25] MVK on-line: http://repokt.org/mvkweb/Menu.php [2011.11.25] MVSZ, 2011v1.0, FAI Jelvények és diplomák szabályzat, FAI Sportkódex 3. Szekció, 2. Fejezet, Érvényes 2010. november 1-től, Vitorlázórepülő Társadalmi Sportbizottság (VTSB), Budapest, 5p. Naviter: http://www.naviter.si [2011.11.25] OSGeo4W, http://trac.osgeo.org/osgeo4w/ [2011.11.25] Python for Windows, http://www.python.org/getit/windows/ [2011.11.25] Python Shapefile Libary, http://code.google.com/p/pyshp/ [2011.11.26] Sándor V. - Wantuch F., 2005, Repülésmeteorológia, Országos Meteorológiai Szolgálat, Bp., 272 p. Sárközy F., 1984, Geodézia, Tankönyvkiadó, Bp, 797 p. Scientific Computing Tools For Python, http://numpy.scipy.org/ [2011.11.26] Swimmen, G., Fordította: Daróczy P., 2005, Tanuljunk meg programozni Pyhton nyelven! Liège, http://python.free-h.net/spip.php?article4, [2011.12.02] Takács B.: GPS mérések feldolgozása, Budapest 2006, http://www.geod.bme.hu/szakm/gps/meresekfeld/jegyzet01.pdf, [2011.11.03] User's Guide - Sua, http://www.winpilot.com/UsersGuide/UserAirspace.asp, [2011.11.25] World Gliding Championship (WGC) 2011, http://www.flatlandcup.hu/2010/class_15m.php [2011.11.25] Worldwide Soaring Turnpoint Exchange: Airspace for Hungary, http://soaringweb.org/Airspace/HU [2011.11.26] 41.
MELLÉKLETEK
1. sz. melléklet: MVK index számok Géptípus
Magyar
KA 7, E31 Blanik, Mucha Std. Super Futár Motorfalke SF25 a-c Motorfalke SF25 e/18 m KA 8 SF 36A Super Blanik/18,2m, L Spatz 55 KA 6 A-C Pirat IS28 B2, KA6 E, SIE 3, Solo, PW5 Foka 4, Zugvogel III, Foka C Foka 5 Zugvogel IIIB, Twin Astir (fix futó), G103 Twin II., Club Astir IS-29 Twin Astir (behúzható futó) Cobra, Club Libelle, H-205, ELFE S4 Astir CS, ASW 15, Std. Cirrus TST-14M Std. Jantar, DG 100 Std. Jantar 2-3, PIK-20B,D,E, Cirrus VTC, ASW19a,b, LS1f ASW19W Ls3 std. Jantar 1 (víz nélkül), DG 300, LS 7, LS 4, Glasflügel 304cWASP Mosquito DG 303, ASW 24, SZD 55, DG 400/15m, LS3,a, Mini Nimbus, DG1000/18m, LS 8/15m, Discus 2,2abx, LAK 19, DG 400/17m (víztartály nélkül) ASW 20, DG 600, Duo Discus, S-10, DG 400/17m (viztartállyal) LAK 12 Ventus 1/15m, LS 6, DG1000/20m Jantar 2B, ,Nimbus 2 Ventus 2/15m, LAK 17/15m, ASW 27, DG 800S, Ventus 1/16.6m, HPH LS 8/18m, Diana 2, Ventus 1/17,6 m (víztartály nélkül) Ventus 1/17,6 m (víztartállyal) DG 800/18m (víztartály nélkül) LAK 17/18m, Ventus 2/18m, DG 800/18m (víztartállyal), HPH 304S/18m Nimbus 3D
72 74 75 76 77 78 79 80 82 84 86 89 90 92 93 94 95 98 99 100 101 102 105 106 107 108 109 110 111 112 113 114 115 116 118 119 122
42.
ASH25/25m, Nimbus 3/24.5m, Nimbus 4D Nimbus 3/25.5m, ASW22B, ASW22BE, ASH25E/25,6m ASH25EB/26m, ASH25EB/27m Nimbus 4, ASW22BL, ASW22BLE ASH25EB/28m Az egyéb géptípusok indexszámát a VTSB egyedileg állapítja meg a 4.3 szerint
43.
124 125 126 127 128
2. sz. melléklet: IGC fájl részletek ALXNKU4FLIGHT:1 HFDTE300710 HFFXA015 HFPLTPILOT:Ivan Novak HFGTYGLIDERTYPE:Ventus2/18m HFGIDGLIDERID:OK-0770 HFDTM100GPSDATUM:WGS-1984 HFRFWFIRMWAREVERSION:2.3 HFRHWHARDWAREVERSION:2 HFFTYFRTYPE:LXNAVIGATION,LX8000F HFGPS:uBLOX LEA-4S-2,16,max9000m HFPRSPRESSALTSENSOR:INTERSEMA,MS5534A,max10000m HFCIDCOMPETITIONID:PX HFCCLCOMPETITIONCLASS:18-meter HFTZNTIMEZONE:0 I063638FXA3941ENL4246TAS4751GSP5254TRT5559VAT J020810WDI1115WVE C300710105647300710000003 C0000000N00000000E C4614401N02008592E001SZEGEDVA C4541426N01922903E204SIVAC C4635283N02101517E189UJKIGYOS C4619305N02003197E099SZATYMAZAPT C4614432N02005517E034SZEGED34 C0000000N00000000E LLXNOZ=1,Style=2,R1=5000m,A1=180,R2=0m,A2=0,A12=224.2,Maxa=0m,Line=1,Auton ext=1 LLXNOZ=0,Style=1,R1=25000m,A1=180,R2=0m,A2=0,A12=47.7,Maxa=0m,Auton ext=0,AAT=1,Lat=4541.426N,Lon=01922.903E LLXNOZ=1,Style=1,R1=20000m,A1=180,R2=0m,A2=0,A12=239.9,Maxa=0m,Auto next=0,AAT=1,Lat=4635.283N,Lon=02101.517E
44.
LLXNOZ=2,Style=1,R1=1000m,A1=180,R2=0m,A2=0,A12=115.2,Maxa=0m,Auton ext=0,AAT=1,Lat=4619.305N,Lon=02003.197E LLXNOZ=3,Style=3,R1=1000m,A1=180,R2=0m,A2=0,A12=161.8,Maxa=0m,Line= 1,Autonext=1 LLXNTSK,TaskTime=9000s LLXNLX7000AU:1.17,SN#10477 LLXNFLARM:LX06,4.0.4,0xDDDDC9 B1056474614996N02005632EA00106000830090040174900003308-0018 F105647271522281718122609 B1056484614996N02005632EA00107000830100040202400003304-0008 B1056494614996N02005632EA0010700084009004022060000330400002 ... B1057144614856N02005675EA0011000084009108089260825416800196 B1057154614843N02005678EA0011100084009131091290850016700175 B1057164614831N02005683EA0011100084009143094070882416600185 LLXNTAKEOFFTASVARIO LLXNCOMPMODE:OFF B1057204614774N02005701EA0011300084009028105141009616700222 K10572016700018 B1057244614712N02005722EA0011700087009095113601077616400262 B1057284614649N02005748EA0012000096009006119461093016500290 B1057324614584N02005769EA0012800102009015118431124816800155 B1057364614516N02005788EA0012600111009017122491178616800272 B1057404614444N02005809EA0013300117009024125741235116900231 B1057444614371N02005830EA0014100129009054127401219016800283 B1057484614300N02005849EA0015900146007063130221166717000428 B1057524614233N02005860EA0017400163007015125971115217200301 ...B1059524612645N02004613EA0043800432009004119591237526400158 B1059564612644N02004502EA0044200439009003123701303927000243 F1059562715222817122609 B1100004612650N02004390EA0045800455008004123431265927600315 B1100044612663N02004284EA0047500473008004119871236428300351 B1100084612683N02004180EA0048700484008004118491269928600323 B1100124612710N02004073EA0048900484008003118221335429000087 B1100164612741N02003964EA0048900485008004121211391729300082
45.
B1100204612779N02003855EA0049100489008006122781415229900122 B1100244612825N02003752EA0049900498009004121581412730200147 K11002417801312 B1100284612875N02003653EA0050600506009003121381421830900206 B1100324612933N02003563EA0051700516009004120731397131300189 B1100364612994N02003481EA0052300525009004120301389931900212 B1557274614610N02005738EA00102000830090040091300007212-0001 LLXNRNGF000109C03C1F1D1D191917171717171D1D1C23426D5C6D6D6D4A4B4C4F4 F534E4545 LLXNRNGT0012982A66654F4A4445313434346B34316C476C766E917DA998A9A9999 97DE16EFF G4401F0CB7C9EEFAEB6F440AD8FDD2D66157CBDB8B8363DDCCA77F84F447A76C5B G3E054B5E3706C1F5027099433C1DB310265CB3214C2C86DFFD028252B9B17E55 GC19E7E154DBC69CB8E52CA4236F602B9A7FF214FAFCC9F44976A7F71A3987416 G1B80EB9E9B6B13E4EA47E6E0B8F811DA351AA69F20D00764DBBEE4E628F2B32C G7963 LCU::HPPLTPILOT:Ivan NOVAK LCU::HPGTYGLIDERTYPE:Ventus 2 LCU::HPGIDGLIDERID:OK-0770 LCU::HPCCLCOMPETITIONCLASS:18-meter LCU::HPCIDCOMPETITIONID:PX LCU::HPATS:101001 LCU::HPELVELEVATION:80 LCU::HPTZNTIMEZONE:2 LSEEYOU PureGlider=False LCU::C300710183236300710000003 LCU::C4615042N02005330E016SZEGED16
Forrás: http://www.flatlandcup.hu/2010/competition/18m/07U/07U_PX.igc, 2011.11.22
46.
3. sz. melléklet: IGC to shape python script import shapefile import sys def brow_LON(sor): if sor[0]=="B": LONMst=sor[18]+sor[19]+"."+sor[20]+sor[21]+sor[22] LONM=float(LONMst) LONDst=sor[15]+sor[16]+sor[17] LOND = float(LONDst) LOND +=LONM/60 return LOND def brow_LAT(sor): if sor[0]=="B": LATMst = sor[9]+sor[10]+"."+sor[11]+sor[12]+sor[13] LATM = float(LATMst) LATDst = sor[7] + sor[8] LATD = float(LATDst) LATD += LATM/60 return LATD def brow_ALT(sor): if sor[0]=="B": ALTst = sor[25]+sor[26]+sor[27]+sor[28]+sor[29] ALT = float(ALTst) return ALT else: return 0 def brow_TIME(sor): if sor[0]=="B": time = sor[1]+sor[2]+":"+sor[3] +sor[4]+":"+sor[5]+sor[6] return time w = shapefile.Writer(shapefile.POLYLINE) w.field('Altitude','N', 10, 1) w.field('Ido','C','40')
47.
gp = arcgisscripting.create() gp.Overwriteoutput = 1 inputsource = sys.argv[1] outputfile = sys.argv[2] f = open (inputsource) LATD_o = LATD_d = LOTD_o = LOTD_d = None rows = f.readline() while rows: if rows[0]=="B": if not LATD_o: # Az elsı vonal esetén LATD_o = brow_LAT(rows) LOTD_o = brow_LON(rows) rows = f.readline() else: # minden más vonal esetén LATD_o = LATD_d LOTD_o = LOTD_d LATD_d = brow_LAT(rows) LOTD_d = brow_LON(rows) w.line(parts=[[[LOTD_o,LATD_o],[LOTD_d,LATD_d]]]) w.record(Altitude=brow_ALT(rows), Ido=brow_TIME(rows)) rows = f.readline() else: rows = f.readline() continue w.save(outputfile) coordsys
=
"Coordinate
Systems/Geographic
Systems/World/WGS 1984.prj" gp.defineprojection(outputfile, coordsys)
48.
Coordinate
4. sz. mellékelt: IGC optimalizációs python script # -*- coding: Latin-1 -*import shapefile import arcgisscripting import sys from numpy import * import math def WGS(FII, LAMB): #FII, LAMB fokban megadva!! #A
függvény
áttranszformálja
a
WGS84
felületre if (LAMB>=18): LAMB0 = 21 else: LAMB0 = 15 a = 6378137 b = 6356752.314 eps = math.sqrt((a*a-b*b)/(a*a)) seg1 = 1-eps*math.sin(math.radians(FII)) seg2 = 1+eps*math.sin(math.radians(FII)) seg3 =(seg1/seg2)**(eps/2) seg4 = math.tan(math.radians(45 + FII/2)) seg5 = math.atan(seg4*seg3) fi = 2*seg5-math.radians(90) lam = math.radians(LAMB-LAMB0) coor = zeros(2) coor[0] = fi coor[1] = lam return coor def UTM(fi_wgs84,lam_wgs84): # k=n=1, LAMBDA0 = 21° mert 34. sávba esik orb = WGS(fi_wgs84, lam_wgs84) fi = orb[0] lam = orb[1]
49.
koordinátákat
gömbi
a = 6378137 b = 6356752.314 ksi = math.atan ( math.tan(fi)/math.cos(lam)) eta = 0.5 * math.log( ( 1+math.cos(fi)*math.sin(lam) )/( 1math.cos(fi)*math.sin(lam) ), math.e ) m = (a-b)/(a+b) R = a/(1+m) * (1 + math.pow(m, 2)/4 + math.pow(m, 4)/64 + math.pow(m, 6)/256) a2 = 0.5*m - 2/3*math.pow(m,2) + 5/16*math.pow(m, 3) + 41/180 * math.pow(m, 4) a4 = ((13/48) * math.pow(m,2)) - ((3/5) * math.pow(m,3)) + ((557/1440)*math.pow(m, 4)) a6 = 61/240*math.pow(m,3) - 103/140*math.pow(m,4) a8 = 49561/161280* math.pow(m,4) m0 = 0.9996 x = R*m0 * (ksi+ a2* math.sin(2*ksi)*math.cosh(2*eta) + a4* math.sin(4*ksi)*math.cosh(4*eta)
+
a6*math.sin(6*ksi)*math.cosh(6*eta)
+
a8*math.sin(8*ksi)*math.cosh(8*eta) ) y
=
R*m0
*
(eta
+
a2*math.cos(2*ksi
a4*math.cos(4*ksi
)*math.sinh(2*eta)
)*math.sinh(4*eta)
a6*math.cos(6*ksi)*math.sinh(6*eta) a8*math.cos(8*ksi)*math.sinh(8*eta) ) X = x Y = y + 500000 coor = zeros(2) coor[0] = Y coor[1] = X return coor def distance (pont1, pont2): fi1 = ponts[pont1][2]
50.
+ + +
la1= ponts[pont1][3] fi2 = ponts[pont2][2] la2 = ponts[pont2][3] return sqrt((fi1-fi2)**2+(la1-la2)**2) gp = arcgisscripting.create() gp.Overwriteoutput = 1 inputsource = sys.argv[1] outputfolder = sys.argv[2] nr_t = int(sys.argv[3]) + 2 sf = shapefile.Reader(inputsource) inshape = sf.shapes() nr_p = sf.numRecords+1 #minden vonal szakasz elsö kezdö koordinátái + az utolso szakasz vég koordinátái ponts = zeros((nr_p+1,4)) for i in range (1, nr_p): ponts[i][0] = float(inshape[i-1].points[0][1]) ponts[i][1] = float(inshape[i-1].points[0][0]) helper = UTM(ponts[i][0], ponts[i][1]) ponts[i][2] = helper[0] ponts[i][3] = helper[1] ponts[i+1][0]
=
float(inshape[i-1].points[1][1])
#utolsó
szakasz
végkooridnátáinak beolvasása ponts[i+1][1] = float(inshape[i-1].points[1][0]) helper = UTM(ponts[i+1][0], ponts[i+1][1]) ponts[i+1][2] = helper[0] ponts[i+1][3] = helper[1] f = zeros((nr_p+1,nr_t+1)) fpontok = zeros((nr_p+1,nr_t+1,nr_t+1)) for i in range(1, nr_p+1): #kiszomolja az elsö es az i-eik pont közötti tavolsagot
51.
f[i][2]= distance(1,i) #print(str(f[i][2])) fpontok[i][2][1]= 1 #fpontok[i][2][2] = i j = 1 k = 1 l = 1 for j in range(3,nr_t+1): for i in range(j,nr_p+1): mx=0 #maximum for k in range(j-1, i): x = f[k][j-1]+distance(k,i) if x>mx: mx=x for l in range(1,nr_t+1): fpontok[i][j][l]=fpontok[k][j-1][l] fpontok[i][j][j] = i f[i][j]=mx w = shapefile.Writer(shapefile.POINT) w.field('WGS84_fi','N', 18, 10) w.field('WGS84_la','N', 18, 10) w.field('flown_distance','N', 18, 10) w.field('UTM_X','N', 18, 10) w.field('UTM_Y','N', 18, 10) w.field('Turn_point_ID','N', 18, 10) for i in range(1,nr_t+1): j = int(fpontok[nr_p][nr_t][i]) LATD_o = ponts[j][0] LOTD_o = ponts[j][1] w.point(LOTD_o,LATD_o) w.record(WGS84_fi=LATD_o, flown_distance=float(f[j][i]),
WGS84_la=LOTD_o, UTM_X
ponts[j][3], Turn_point_ID = j)
52.
=
ponts[j][2],
UTM_Y
=
w.save(outputfolder) coordsys
=
"Coordinate
Systems/Geographic
Systems/World/WGS 1984.prj" gp.defineprojection(outputfolder, coordsys)
53.
Coordinate
5. sz. melléklet: Feladata kiírás SeeYouval
Forrás: http://www.flatlandcup.hu/2010/competition/15m/07U_15m_tsk.htm 54.
NYILATKOZAT Alulírott Kun Péter földrajz szakos hallgató, kijelentem, hogy a diplomadolgozatban foglaltak saját munkám eredményei, és csak a hivatkozott forrásokat (szakirodalom, eszközök, stb.) használtam fel. Tudomásul veszem azt, hogy szakdolgozatomat a Szegedi Tudományegyetem könyvtárában, a kölcsönözhető könyvek között helyezik el.
Kun Péter Szeged, 2012. január 21.
55.