HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Paikkatiedon hallinta ja analyysi 5. Kyselyn käsittely Antti Leino <antti.leino@cs.helsinki.fi> 7. huhtikuuta 2005 Tietojenkäsittelytieteen laitos
Sisältö Kyselyt R-puun avulla Paikkaliitokset Yannis Manolopoulos Alexandros Nanopoulos Apostolos N. Papadopoulos 2003: R-trees Have Grown Everywhere Philippe Rigaux Michel Scholl Agnès Voisard 2002: Spatial Databases, luku 7
Kysely indeksin avulla Sijaintitieto indeksissä approksimoituna Haku tyypillisesti kaksiosainen 1. Etsitään indeksistä minimisuorakulmion perusteella 2. Tarkistetaan osumista, täyttävätkö hakuehdon Vrt. GiST-puun Consistent: osumat epävarmoja, hylkäykset varmoja Joissakin tapauksissa lopullinen tieto jo indeksistä Esim. sisältyykö kohde suorakulmioon?
Topologiset kyselyt R-puun yhteydessä oli jo algoritmi aluekyselyä varten Mitkä kohteet leikkaavat suorakulmion x 1 x x 2, y 1 y y 2? Sama algoritmi käytettävissä muihinkin topologisiin suhteisiin R-puussa kohteen suorakulmioapproksimaatio Tarkat suhteet joka tapauksessa selvitettävä erikseen Puusta haettaessa mahdollisesti käytössä puskuri Mitkä kohteet leikkaavat suorakulmion (x 1 ε) x (x 2 + ε),(y 1 ε) y (y 2 + ε)? Näin saadaan varmasti mukaan vierekkäiset kohteet
Suuntakyselyt Myös suuntasuhteisiin perustuvat kyselyt mahdollisia R-puussa Suuntasuhteet neljään pää- ja neljään väli-ilmansuuntaan suorakulmion nurkkapisteiden perusteella Kaksiosainen haku 1. Haetaan jo(ide)nkin suuntasuhte(id)en mukaan 2. Haetaan tuloksesta uudelleen eri suhte(id)en mukaan Esim. vahvasti koilliseen 1. north (p s, q s ) east (p s, q s ) 2. north (p f, q s ) east (p f, q s )
Naapuruuskyselyt Tehtävä: etsitään kohteen k lähintä naapuria Hyödyllisiä mittoja: Piste P, kohde O ja sen minimisuorakulmio R MINDIST (P, R): lyhin etäisyys P:stä R:ään MINMAXDIST (P, R): etäisyys P:stä lähimpään sellaiseen R:n nurkkapisteeseen, joka on samalla sivulla kuin kauimmainen R:n nurkkapiste P:n ja O:n kauimmaisen pisteen etäisyys vähintään MINMAXDIST (P, R)
Minimietäisyyksien hyötykäyttöä Kyselypiste P, kohteet O,O ja niiden minimisuorakulmiot R,R Jos MINDIST (P,R) > MINMAXDIST (P,R ), R voidaan hylätä Jos distance (P,O) > MINMAXDIST (P,R ), O voidaan hylätä Jos MINDIST (P, R) > distance (P,O), R voidaan hylätä Näitä havaintoja voi käyttää apuna algoritmin naapurien etsinnässä
Lähimmän naapurin etsintä NN_search(node, poi nt,nearest) if leaf (nod e) then foreach e node do di st distance (poi nt,e MBR ); if di st < nearest di st then nearest di st di st; nearest ent r y e; else branch_li st sort_branch_list(node); last prune_list(poi nt,nearest,branch_li st); foreach new_node {branch_li st i }, i [1, last] do NN_search(new_nod e, poi nt, nearest); last prune_list(poi nt,nearest,branch_li st);
Kohteiden järjestäminen etäisyyden mukaan NN_sear ch on helpohko muuttaa etsimään k lähintä naapuria Pidetään kirjaa k naapurista Hylätään joka kierroksella kaukaisin Joskus tarpeen kohteiden järjestäminen etäisyysjärjestykseen Oliot jonona, joka on järjestetty etäisyyden mukaan Haarautumasolmun lapset sijoitetaan jonoon MINDIST :n mukaan
Yleinen järjestysalgoritmi inc_nearest(quer y_ob j ect,i ndex) queue ; enqueue(queue, i ndex root,0); while queue do el ement dequeue(queue); if object (el ement) then while element = first (queue) do delete_first(queue); output(el ement); else if leaf (element) then foreach ob j ect element do if distance (quer y_ob j ect,ob j ect) distance (quer y_ob j ect,element) then enqueue(queue, ob j ect, distance (quer y_ob j ect,ob j ect)); else foreach chi ld element do enqueue(queue, chi ld, distance (quer y_ob j ect,chi ld));
Järjestäminen R-puun avulla inc_nearest(quer y_ob j ect,tree) queue ; enqueue(queue, t ree root,0); while queue do el ement dequeue(queue); if object (element) object_mbr (element) then if object_mbr (element) queue distance (quer y_ob j ect,ob j ect) > first (queue) ke y then enqueue(queue, ob j ect, distance (quer y_ob j ect,ob j ect)); else output( object (el ement)); else if leaf (element) then foreach ob j ect element do enqueue(queue, ob j ect MBR, distance (quer y_ob j ect,ob j ect MBR )); else foreach chi ld element do enqueue(queue, chi ld, distance (quer y_ob j ect,chi ld MBR ));
Käänteiset naapuruussuhteet Sama toisin päin: Etsi ne kohteet, joiden lähin naapuri tämä on Tason pisteellä näitä on korkeintaan kuusi Jaetaan siis tutkittava alue kuuteen sektoriin Haettavat kohteet löytyvät kunkin sektorin lähimpien kohteiden joukosta
Käänteisten naapuruussuhteiden etsintä RNN_search(q) r nn_result ; nearest cond_nn_search(q); cand i d at es eliminate_duplicates(nearest); foreach p candi dat es do r NN_search(p); if distance (q, p) = distance (r, p) then r nn_result r nn_result {p}; return r nn_resul t
Paikkaliitokset Relaatioalgebran liitosoperaatio, jossa ehto liittyy sijaintitietoon Tyypillisesti leikkausehto R Rsi j ai nt i S si j ai nt i S Muut suhteet toki myös Tavanomaisiin liitoksiin käytetyt algoritmit huonoja paikkaliitoksille Pohjimmainen ongelma: geometrisen leikkauksen epätyhjyys on vaikeampi testata kuin atomisten arvojen yhtäsuuruus
Paikkaliitoksen toteutus Kaksiosainen operaatio Suodatus minimisuorakulmioiden perusteella Lopullinen valinta todellisen sijaintitiedon perusteella Tässä R-puuhun perustuva ratkaisu Yhtä lailla mahdollista käyttää myös tilan täyttävään käyrään perustuvaa hakemistoa
Paikkaliitoksen suodatusaskel r_join(r, S) mat ches ; foreach E S S do foreach E R R E RMBR E SMBR do if leaf (R) then mat ches mat ches {(E Rpt r,e Spt r )}; else mat ches mat ches r_join(e R,E S ) return mat ches; Tässä oletetaan, että puut R ja S yhtä korkeita Jos erikorkuisia, viimeisillä rekursiotasoilla verrataan toisen alipuuta toisen lehtisolmun alkioon
Suodatusalgoritmin tehokkuus Levynkäsittely suhteellisen tehokasta Sen sijaan prosessoriaikaa kuluu Mitä suurempi sivukoko sitä vallitsevammaksi prosessoriajan kulutus käy Algoritmi tehostuu, jos silmukoihin otetaan vain ne solmun alkiot, joissa osumia voi olla: S {e S e MBR R }; R {e R e MBR S };
Tasonpyyhkäisy Leikkauksen E R E S epätyhjyyden testausta voi vielä optimoida tasonpyyhkäisymenetelmällä (plane sweep) Lähdetään liikkeelle R S:n vasemmasta reunasta Edetään, kunnes tulee vastaan ensimmäinen suorakulmio Käydään läpi kaikki ne toisenväriset suorakulmiot, joiden vasen reuna on tarkasteltavan suorakulmion oikean reunan vasemmalla puolella Jos suorakulmiot leikkaavat myös pystysuunnassa, ne leikkaavat Merkitään suorakulmio käsitellyksi Siirretään tarkastelukohtaa, kunnes tulee vastaan seuraava suorakulmio ja käydään läpi sen alueella olevat vielä käsittelemättömät suorakulmiot
Lisää optimointia Tasonpyyhkäisykin riittää vasta paikalliseen optimointiin: läpikäytävien solmujen määrän globaaliin minimointiin se ei riitä. Ratkaisu: käydään puut läpi koko taso kerrallaan Kullakin tasolla kerätään keskenään leikkaavien solmujen parit tilapäisindeksiksi I JI i = {(E Ri,E Si ) R S E RiMBR E SiMBR } Kun taso on käyty läpi, siirrytään seuraavalle Nyt kunkin tason kaikki tarvittavat solmut tiedetään jo ennalta
Tasottainen paikkaliitosalgoritmi breadth_first_r_join(r, S) I JI 0 {(E R,E S ) R S E RMBR E SMBR }; for i 0 to height (R) 1 do foreach (E R,E s ) I JI i do I JI i+1 I JI i+1 {(e ER, e ES ) E R E S e ERMBR e ESMBR }; return I JI height (R) 1 ;
Usean taulun paikkaliitokset Edellä käsitelty kahden tietokantataulun / R-puun liitoksia Useamman taulun liitokset yleistettävissä näistä Erilaisia toimintastrategioita 1. Ensin kahden taulun liitos, jonka tulos (indeksoimatta) liitetään kolmanteen 2. Ensin kahden taulun liitos, jonka tulos laaditaan jo valmiiksi sopimaan yhteen kolmannen R-puun kanssa 3. Suoraan kolmen taulun liitos
Liitos etäisyyden perusteella Liitosehtona eri tauluissa olevien kohteiden välinen etäisyys R d1 distance (R,S) d 2 S Ratkaisu perustuu aiemmin nähtyyn järjestysalgoritmiin inc_nearest Parit (E R,E S ) järjestetään etäisyyden mukaan Näistä käsitellään ne, joissa etäisyys osuu liitosehdon määräämälle välille
Etäisyysliitosalgoritmi inc_dist_join(r, S) queue ; enqueue(queue,0,r root,s root ); while queue do el ement dequeue(queue); if object (element R ) object (element S ) then output(el ement); else if is_mbr (element R ) is_mbr (element S ) then D distance (element Rob j ect, element Sob j ect ); if Q = D Q 1di st then output(el ement); else enqueue(queue,d, element Rob j ect, element Sob j ect ); else if is_node (element R ) then process_node(q, el ement, 1); else process_node(q, el ement, 2);
Haarautumasolmujen purkaminen process_node(q, el ement, ord er) if order = 1 then node element R ; i t em element S ; else node element S ; i t em element R ; if leaf (nod e) then else foreach ent r y node do enqueue(q, distance (ent r y, i t em), ent r y, i t em); foreach chi ld node do enqueue(q, distance (chi ld, i t em), chi ld, i t em);
Yksi vai kaksi haaraa kerrallaan? Algoritmissa inc_dist_join puretaan kerrallaan vain yksi haarautumasolmu Ei ole selvää, että olisi tehokkaampaa purkaa molemmat haarautumat samalla kertaa Esitetyssä muodossa se kulkee ensin puuta R lehtiin saakka ja vasta sitten puuta S Parempi ratkaisu olisi kulkea puita alas tasaisesti, esimerkiksi valitsemalla purettavaksi se puu, jossa on jäljellä enemmän tasoja Etäisyysliitosta tehostaa, jos algoritmissa process_node tarkistetaan, että solmujen välinen minimi- / maksimietäisyys sopii liitosehdon rajoihin