37. FEJEZET - A NÉGYFA ALGORITMUSOK ÉS A TÉRBELI INDEXELÉS (GIS,térinformatika,térkép,geodézia)


   
 
 

37. FEJEZET - A NÉGYFA ALGORITMUSOK ÉS A TÉRBELI INDEXELÉS

 
Tartalom
<<< Előző fejezet               Következő fejezet >>>
 

37. Fejezet - A NÉGYFA ALGORITMUSOK ÉS A TÉRBELI INDEXELÉS

Magyar változat: Végső Ferenc, Erdészeti és Faipari Egyetem, Székesfehérvár

 

A. BEVEZETÉS

Meghatározások

B. TERÜLETSZÁMÍTÁSI ALGORITMUSOK

Eljárás

Példa

C. FEDVÉNY ALGORITMUSOK

Eljárás

Eredmény

D. SZOMSZÉDSÁGI ALGORITMUSOK

A feladat

Meghatározás

Két eset

Mozaik módszer

Szomszédság meghatározása

A közös határ hossza

E. AZ ÖSSZEFÜGGŐ FOLTOK TERÜLETÉNEK ALGORITMUSA

A feladat

Módszer

Műveletek

Eredmények

F. NÉGYFA INDEXEK

Indexelés a négyfák segítségével

Az index meghatározása

Az index használata

Általánosítások

G. R-FA INDEXEK

Módszer

Probléma

IRODALOM

ELLENŐRZŐ KÉRDÉSEK

 

 

 

 

MEGJEGYZÉSEK

 

Ez a fejezet nagyon hosszú, és sok összetett műveletet ismertet. A hallgatók képességeitől és érdeklődésétől függően elhagyhatjuk a harmadik és a negyedik módszert vagy kiadhatjuk külön, mint sokszorosított anyagot.

A képzettebb hallgatókkal alkalmat lehet találni a fejlettebb algoritmusok összetettségének, finomságainak tanulmányozására. Az indexelésről szóló későbbi részek függetlenek a korábban ismertetett anyagoktól.

 

 

37. Fejezet - A NÉGYFA ALGORITMUSOK ÉS A TÉRBELI INDEXELÉS

Magyar változat: Végső Ferenc, Erdészeti és Faipari Egyetem, Székesfehérvár

 

A. BEVEZETÉS

- az előző fejezet ismertette a négyfa alapgondolatát

- ebben a fejezetben megvizsgáljuk, hogyan alkalmazhatjuk a négyfát egyszerű feladatok esetén, úgymint:

- területszámítás

- fedvényműveletek

- levelek szomszédságának megállapítása

- összefüggő foltok területének számítása

- ráadásul, ebben a fejezetben megnézzük, hogy a négyfák hogyan alkalmazhatók indexelésre a vektoros objektumok gyorsabb elérése céljából

- végül áttekintjük a térbeli indexelés egyéb formáit

Meghatározás

- mozgás a négyfán:

- elindulunk a gráf bal szélső ágán az első levél felé

- miután feldolgoztunk minden levelet ezen az ágon, visszalépünk az előző elágazásra és elindulunk a jobboldali ágon

- ez vagy elvezet minket egy lejjebb fekvő levélhez, vagy visszatérünk az előző elágazási pontra

37.1. ábra - első térkép

- a további példák némelyike ugyanezen az egyszerű raszteren és a hozzátartozó négyfán alapul

 

B. TERÜLETSZÁMÍTÁSI ALGORITMUS

Eljárás

- a térkép A jelű területének kiszámításához:

- mozogjunk a négyfán és adjuk össze az A jelű leveleket, a területeket aszerint súlyozva, hogy a levél hányadik szinten van

- a minta-négyfán a 0 szinten lévő elemek területe 16, az 1-es szinten lévőké 4, a 2-es szinten lévőké 1

- ezért az A területe

1(00. levél)+1(02. levél)+1(03. levél)+4(2. levél)+1(32. levél)

azaz 8 egység

 

C. FEDVÉNY ALGORITMUS

37.2. ábra - második térkép

- megj.: ezt a fóliát ténylegesen is az első fölé tehetjük

 

 

Eljárás

- a két térkép fedésbe hozásához:

- mozogjunk a fákon egyszerre, követve minden ágat, amely valamelyik fán a kettő közül van

- ha az egyik fán hiányzik az elágazás (levél van ott, ahol a másik fán elágazások), rendeljük hozzá a levél értékét minden elágazáshoz

- pl. a 3 pont elágazik az első térképen, a másodikon nem

- az ehhez a ponthoz tartozó levelek (30, 31, 32 és 33) értékei B, B, A és B az első térképen, mindegyik 2 a második térképen

- új fa keletkezik, aminek az értékei mindkét térkép értékeit fölveszik, pl. A1, B2

Eredmény

37.3. ábra - első térkép + második térkép

 

D. SZOMSZÉDSÁGI ALGORITMUS

A feladat

- felismerni, hogy két levél (pl. a 03 és a 2) szomszédos

Következmény: felismerni egy adott levél (pl. 03) szomszédait

- megjegyezzük, hogy a vonal alapú rendszerekben a szomszédságot az adatszerkezetben tároljuk (Jobboldali és Baloldali szomszédok), ezért ezek a műveletek egyszerűbbek a vektoros rendszerekben

Meghatározás

- itt a szomszédságot a közös él (oldal) jelenti, nem csak a közös pont

Két eset lehet

- a levelek kódja:

1. egyforma hosszú (azonos méretűek, pl. 01 és 02) vagy

2. az egyik hosszabb mint a másik (eltérő hosszúak pl. 03 és 2)

- a probléma megoldásához:

1. átszámítunk a 4-es rendszerből binárissá és vissza

- mert a négyfa létrehozásához a "négyes szabályt" alkalmaztuk

2. alkalmazzuk a bitek összefűzését

3. új alapelvet használunk, amit mozaik műveletnek nevezünk

Mozaik módszer

- a mozaik módszer egy lehetséges megoldás, amit a négyfa címzés sajátosságainak kezelésére használhatunk

- bináris számok szokásos összeadásánál a "mutató" egy hellyel balra mozdul

- pl. 0001-hez 1-et adva 0010-t kapunk

- ez ugyanaz, mint a tizes számrendszerben, kivéve, hogy az elmozdulás nem tízre, hanem már kettőre bekövetkezik

- a mozaik módszernél a "mutató" két pozícióval kerül balra

- pl. ha 0001-hez adunk 1-et, az eredmény 0100 lesz

- kivonáskor megfordul a helyzet

- 1000-ból 1-et, az eredmény 0010, nem pedig 0111, mivel a kivonás csak minden második bitet változtatja meg

- más szóval, ha megszámozzuk a biteket balról eggyel kezdődően,

- egy hozzáadása vagy kivonása csak a páros biteket változtatja

- kettő (bináris 10) hozzáadása vagy kivonása a páratlan biteket változtatja

Szomszédság meghatározása

37.1. melléklet - szomszédság meghatározása

1. azonos méretű blokkok:

- két levél szomszédos, ha bináris megfelelőik bináris 1-el vagy bináris 10-el különböznek (decimális 1 vagy 2) a mozaik aritmetikában

- példa: 01 és 03 szomszédos, mert a 0001 és 0011 bináris 10-el, illetve decimális 2-vel különböznek

- példa: 033 és 211 szomszédos, mert a mozaik módszerben 001111 + 10 = 100101, vagy 100101 - 10 = 001111

2. eltérő méretű blokkok:

- vegyük a két kód közül a hosszabbikat

- alakítsuk át négyes rendszerből binárissá

- a mozaik elv szerint adjunk hozzá és vonjunk ki 01-et és 10-et, hogy négy új kódot kapjunk

- hagyjuk figyelmen kívül azokat az eseteket, amikor a kivonás nem volt lehetséges ( "negatív" kódot kapnánk, vagy a "mutató" a balra esne a balszélső bithez képest)

- hagyjuk el a hosszabb transzformált kódok jobboldali számjegyeit

- alakítsuk vissza négyes számrendszerbe, hogy levelet kapjunk

- a két blokk szomszédos, ha az átalakított és levágott kódok bármelyike megegyezik a legrövidebb kóddal

- példa: 02 és 2 szomszédos-e ?

- alakítsuk a 02-t binárissá = 0010

0010 + 1 = 0011

0010+ 10 = 1000

0010 - 1 = (lehetetlen)

0010- 10 = 0000

- az elhagyás után marad 00 és 10

- ezek a négyes alapon 0 és 2

- ezért 02 és 2 szomszédosak ( 02 és 0 szintén szomszédos)

- példa: 033 és 2 szomszédos-e ?

- alakítsuk a 033-at binárissá = 001111

001111 + 1 = 011010

001111+ 10 = 100101

001111 - 1 = 001110

001111- 10 = 001101

- két számjegyet levágva kapjuk: 01, 10 és 00

- ezek négyes alapon: 1, 2 és 0

- ezért a 033 és a 2 szomszédosak

- példa: a fent bemutatott első térképen keressük meg a 03 szomszédait

- módszer: keressük meg az azonos hosszúságú szomszédos blokkok kódjait, majd mozogjunk lefelé a fán, hogy a megfelelő leveleket megtaláljuk

- (megjegyzés: csak egyforma vagy rövidebb kódokat tudjuk megkeresni - egyforma vagy nagyobb levélblokkokat)

0011 + 1 0110 12: 1 levél

0011+ 10 1001 21: 2 levél

0011 - 1 0010 02: 02 levél

0011- 10 0001 01: 01 levél

A közös határ hossza

- két blokk közös határának hosszát a hosszabbik kód szintje határozza meg

- ezt felhasználhatjuk olyan művelet definiálására, amely alkalmas a folt kerületének meghatározására

- pl. az A\B határának hossza az első példatérképen

 

E. A ÖSSZEFÜGGŐ FOLTOK TERÜLETÉNEK MEGHATÁROZÁSA

Feladat

- határozzuk meg az azonos értékkel rendelkező összefüggő foltok területét, pl. minden A jelűét

Következmény: Hány elkülönülő A jelű folt található ?

- megjegyzés: ez egy általános eljárás, amit egyaránt alkalmazhatunk raszteres és vektoros adatszerkezet esetén

- azaz keressük meg az összetartozó blokkok, vagy szabálytalan alakú poligonok csoportját, amelyek szomszédságát ismerjük, vagy meg tudjuk határozni

- az alábbi példában az eredeti rasztertérképet használjuk

- megjegyezzük, hogy ezen csak két összefüggő folt van; az A és B típusú területekből egyaránt egy van

Módszer

37.2. melléklet - az összefüggő foltok területe

- a fán mozogva készítsük el a levelek listáját a kódjaikkal együtt

- hagyjunk helyet egy "mutató" számára minden levélhez, és adjuk mindnek a 0 kezdeti értéket (l. másolat)

Algoritmus

- minden i jelű levélre:

- keressük meg a j jelű szomszédos leveleket, amelyek azonos hosszúságú vagy rövidebb kóddal rendelkeznek (maximum 4)

- ha a szomszédos j levélnek azonos az értéke, határozzuk meg, hogy az i vagy j levélnek van-e magasabb (nagyobb értékű) pozíciója a listán, és állítsuk a mutatóját alacsonyabb értékre

- (megjegyzés: ha a mutatót már változtattuk, tovább változtathatjuk, vagy hagyhatjuk utolsó értékén, az eredmény ugyanaz lesz)

- így létrehoztuk a végleges mutató listát

Eredmények

1. a szomszédos foltok számai nullával lesznek egyenlők

- a példában két mutató nulla, jelezve, hogy a két folt szomszédos

2. minden folt értékét meghatározhatjuk, ha elérjük azokat a leveleket, amelyek mutatója nulla

- a példában a 00 és 01 levél mutatója 0

- ezek értéke egyenként A és B

3. a foltok területének meghatározásához válasszuk ki a nullákat és adjuk össze a területüket, valamint adjuk hozzá mindazon levelek területét, amelyekre közvetlenül vagy közvetve rámutat

- a foltot összetevő leveleket megtalálhatjuk, ha elindulunk a lista végén (vagy az elején) és követjük a mutatót, amíg nullát nem találunk

- pl. a 10. helyen lévő levél (33-as kódú) a 8-ra mutat, amelyik a 7-re mutat, amelyik az 5-re mutat, amelyik a 2-re mutat, amelynek nulla a mutatója

- ezért, a 10-es pozíciójú levél (33-as kód) része ugyanannak a foltnak, mint a 2-es (01-es kód) és az értéke B

- a területet a levelek területének összeadásával kaphatjuk

- a példában:

"A" levelek: 00 02 03 2 32

"A" pozíciók: 1 3 4 6 9

"A" területe: 1 + 1 + 1 + 4 + 1 = 8

"B" levelek: 01 1 30 31 33

"B" pozíciók: 2 5 7 8 10

"B" területe: 1 + 4 + 1 + 1 + 1 = 8

 

F. NÉGYFA INDEXEK

Indexelés a négyfák segítségével

- az indexelést vektoros rendszerekben használjuk a térkép egyes részein lévő objektumok gyorsabb elérésére

- nagyon hasznos a lehetséges átfedő, vagy kizáró területek megtalálásához

- ezért az indexek alapvető részei a poligonok fedvényműveleteinek

- a 34. Fejezetben láthattuk az egy tengely (pl. az X) mentén végzett sorbarendezés hasznosságát a mozgó sáv módszernél, amikor kizáró objektumokat keresünk

- most olyan módszert nézünk meg, amely mindkét tengely irányában egyidejűleg tud rendezni

- ehhez kétdimenziós kódrendszert és egyszerű egydimenziós rendezést használnak

Az index meghatározása

37.4. ábra - a négyfa indexek

- a lépések:

1. az adatbázis minden objektuma (pont, vonal, terület) számára keressük meg azt a legkisebb levelet, amely tartalmazza a kérdéses objektumot

- sok nagy objektum a NULL kódot kapja, mert túlnyúlik az első elágazás négy levelén is (0, 1, 2 és 3)

- más, kis objektumok teljesen beleesnek egy kis levélbe, pl. a 031

2. rendezzük, vagy indexeljük az objektumokat a négyfa befoglaló levelei szerint

Az index használata

- ahhoz, hogy megtaláljunk minden olyan objektumot, amely keresztez egy minket érdeklő pontot, vonalat vagy területet:

- keressük meg a négyfa azon levelét, amely tartalmazza a kérdéses objektumot

- ennél a pontnál kezdve kövessük a fa ágait fölfelé minden olyan elágazáson keresztül, amely tartalmazza az eredeti cellát és mozogjunk lefelé azokon a csomópontokon és leveleken, amelyek a cella alatt helyezkednek el

- példa: a keresett terület az eredeti példában a 31-es levélben van

37.1. ábra - Első térkép

- azok az objektumok, amelyek a kérdéses területet metszhetik, a 31-es cellában vannak, vagy minden fölötte lévő levélben

- tehát ezek a 3-as vagy a nullás levelek

- a többi levélben lévő objektumok (a távoliak) nem metszhetik a kérdéses területet, tehát vizsgálni sem kell őket

- példa: a kérdéses terület a 0 levélben van

- azok az objektumok, amelyek metszhetik a 0-s levélben lévő területet, maga a nullás levél, és minden levél a 0 alatt, úgymint 00, 01, 02, 03

- itt szerepelhetnek egyéb, ezek alatti levelek, mint a 010, 011, 012, 013 stb.

Általánosítások

- a négyfa indexelés hatékonyabb kis objektumokra, önálló pontokra

- a nagy objektumok nagyobb befoglaló leveleket kívánnak, ráadásul nem töltik ki a terület nagyobb részét (pl. főutak nyomvonalai)

- ezeket az objektumokat mindig ellenőrizni kell metszés szempontjából

- ilyen esetben szükséges lehet feldarabolni az objektumot, hogy a részei teljesen beleessenek kisebb levelekbe

- az ilyen módon való indexelés sokkal hatékonyabb, mint az X és Y irányban külön-külön, mivel a négyfa index eredendően kétdimenziós

- a felosztásnak az elágazások mentén nem kell feltétlenül egyformának lenni

- használhatunk más blokkokat a kisebb területekhez és más blokkokat a nagyobb területekhez, mintsem négy egyforma négyzetet használnánk minden elágazásnál

- mindazonáltal a leggazdaságosabb blokkok a négyzetesek

 

G. R-FA INDEXEK

- az R-fa indexek a nagy területek indexelésének problémáját oldják meg

- az "R" terjedelmet (Range) jelent, az elv hasonló a MER-hez

Módszer

37.5. ábra - az R-fa

- határozzunk meg, lehetőleg átfedő, az X és Y tengellyel párhuzamos oldalú négyzetet, amelyre igaz:

- a lehetséges legtöbb objektum teljesen essen bele egyik vagy másik négyzetbe

- durván egyenlő számú objektum legyen minden négyzetben

- a négyzetek közötti átfedés minimális legyen

- az indexelést az a négyzet határozza meg, amelyik tartalmazza az objektumot

- azok az objektumok, amelyek teljesen beleesnek a négyzetbe, a négyzethez tartoznak

- azok az objektumok, amelyek nem esnek bele teljesen egyik négyzetbe sem, az osztatlan (eredeti) térképhez tartoznak

- alkalmazzuk az eljárást ismételten, két kisebb négyzetet meghatározva mindegyik meglévő négyzeten belül

- így létrejön egy fa struktúra, hasonlatosan a négyfához

- minden objektum a fa néhány csomópontjához lesz rendelve

- ahhoz, hogy megtaláljuk azokat az objektumokat, amelyek metszik a kérdéses területet:

- keressük meg az indexelési eljárás alkalmazásával azt a legkisebb négyzetet, amely teljesen tartalmazza a kérdéses objektumot

- a metsző területek tartozhatnak ehhez a négyzethez, és minden csomóponthoz, amely e fölött vagy alatt van a fán

Probléma

- bár a sebességi tesztek azt mutatják, hogy az R-fák általában sokkal hatékonyabbak, mint a négyfák, vagy az egyszerű egydimenziós rendezések, létrehozásuk számításigényesebb

 

IRODALOM

Buchmann, A., O. Gunther, T. R. Smith and Y.-F. Wang. "Design and Implementation of Large Spatial

Databases", Unit Notes in Computer Science 409, Springer Verlag, Berlin. A térbeli adatindexelésről tartalmaz fejezeteket

Guttman, A., and J.P. Lauzon, 1984. "Linear quadtrees for Geographic Information Systems," Proceedings,

International Symposium on Spatial Data Handling, Zurich, 2:412-430

Noronha V., 1988. "A Survey of Hierarchical Partitioning Methods for Vector Images," Proceedings, Third

International Symposium on Spatial Data Handling, Sydney, Australia, pp. 185-199.

Oosterom, P. van, 1990. "A modified binary space partitioning tree for geographic information systems,"

International Journal of Geographical Information Systems 4(2):133-46

A 36. Fejezet irodalomjegyzékében szereplő két Samet-könyv hasznos részeket tartalmaz a négyfával kapcsolatban.

Pataki, F. and Csernák, G. 1993. "New, fast and simple quadtree structure for vector GIS databases: the topologic quadtree", EGIS'93 Vol. 1. p. 213-216.

 

ELLENŐRZŐ KÉRDÉSEK

1. Hasonlítsuk össze az indexelés elvi megoldásait (négyfa, R-fa, 1D rendezés) a gyakorlatban alkalmazott megoldásokkal (pl. földrészek, államok, régiók, postacímek stb.).

2. Hogyan tervezne meg egy tanulmányt a különböző indexelési formák hatékonyságának összehasonlítására? Milyen adatokat használna? Mely dimenziókat hasonlítana össze?

3. A jelenlegi vektor alapú rendszerek az indexelési formák sok formáját alkalmazzák. Miért nincs egyetértés a legjobb módszert illetően? Mely módszerek milyen célokra alkalmasak és mely alkalmazási területeken?

4. Találjon ki egy Manhattan távolság mérési módszert két négyfa blokkra!(Legyen a kódjuk azonos hosszúságú!)

 
Tartalom
<<< Előző fejezet               Következő fejezet >>>
 



 
 


©GIS Figyelő