HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Paikkatiedon hallinta ja analyysi 3. Paikkatietomallit ja kyselyt Antti Leino <antti.leino@cs.helsinki.fi> 21. maaliskuuta 2005 Tietojenkäsittelytieteen laitos
Sisältö Esimerkkitietokanta Paikkatietotyypit Relaatiomallin paikkatietolaajennokset Oliomallit Rigaux Scholl Voisard 2002: Spatial Databases, luku 3 Shekhar Chawla 2003: Spatial Databases: A Tour, luku 3
Relaatiotietokanta Perusajatus: tieto esitetään relaatioina Helpointa ajatella taulukkona normaalisti puhutaankin taulusta (table) Sarakkeiden arvojoukot D 1,...,D n Relaatio: osajoukko ristitulosta D 1 D n Joukko monikkoja (tuple) (d 1,..., d n ) Kyselyt esitettävissä formaalisti relaatioalgebran avulla
Esimerkkitietokanta Kurssia varten on olemassa PostgreSQL-tietokanta, jossa PostGIS-laajennos Paikkatiedon käsittely Open GIS -määritysten mukaan Käyttö palvelimella db.cs.helsinki.: /usr/local/pgsql-7.4/bin/psql -p 12155 -U kurssi kunnat01 Password: Welcome to psql 7.4.7, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help on internal slash commands \g or terminate with semicolon to execute query \q to quit kunnat01=>
Kuntataulu Taulu kunnat01: Suomen kunnat v. 2001 wkb_geometry sijaintitieto kuntakoodi numeerinen kuntakoodi nimi kunnan nimi laani lääni, johon kunta kuuluu maakunta maakunta, johon kunta kuuluu miehet kunnassa asuvien miesten lukumäärä naiset kunnassa asuvien naisten lukumäärä yht kunnan väkiluku ulkom_miehet kunnassa asuvat ulkomaalaiset miehet ulkom_naiset kunnassa asuvat ulkomaalaiset naiset ulkom_yht kunnassa asuvat ulkomaalaiset (so. muut kuin Suomen kansalaiset) muutos00 väkiluvun muutos vuodesta 2000
Lisää tauluja Taulu autoilu ajokm Ajokilometrit yleisillä teillä v. 1996 autoja Henkilöautoja v. 1997 tiet Yleisiä teitä v. 1996 (km) Taulu elintaso tulot_hlo Keskitulot / henkilö 1996 (mk) tulot_talous Keskitulot / talous 1996 (mk) asunnot Asuntojen keskikoko 1998 (m 2 ) asuintila Asuintilaa / henkilö 1998 (m 2 ) sosiaali Sosiaali- ja terveystoimen kustannukset (mk/asukas) Taulu koulutus tutkinnot Korkeakoulututkinnon suorittaneita 20 vuotta täyttäneistä 1998 (%) opiskelijat Opiskelijatalouksia (%)
Vielä pari lisää Taulu vakiluku v70 vuonna 1970 v99 vuonna 1999 v10 ennuste 2010 (1998) Taulu vaalit96: vuoden 1996 kunnallisvaalit, % valtuustopaikoista keskusta Keskusta kokoomus Kokoomus sdp Sosiaalidemokraatit sfp Ruotsalainen kansanpuolue vasemmistoliitto Vasemmistoliitto vihreat Vihreät
Relaatioalgebra Formaali tapa esittää operaatiot relaatioiden käsittelyyn Ei sellaisenaan käytössä tietokannoissa Kyselykielet, mm. SQL, lähellä Hyödyllinen teoriatausta tietokannan tietokannanhallintajärjestelmän suunnittelussa Minimissään viisi perusoperaatiota, lisää voidaan johtaa
Relaatioalgebran operaatiot Normaaleja joukko-opin operaatioita Yhdiste: R S = {t (t R) (t S)} Erotus: R S = {t (t R) (t S)} Ristitulo: R S = {t u (t R) (u S)} Relaatioalgebran omia Projektio: π A1,...,A n (R) = {(a 1,..., a n ) t R i {1,..., n} : a i = t.a i } Valinta: σ ehto (R) = {t (t R) (ehto on voimassa)} Lisäksi muita, yleensä ainakin Leikkaus: R S = R (R S) = S (S R) Liitos: R ehto S = σ ehto (R S)
Liitosoperaatiot Yleinen liitos: yhdistetään toisiinsa ne monikot, jotka täyttävät liitosehdon Ulkoliitos: Tulosrelaatiossa mukana sellaiset monikot, joille ei löydy paria toisesta lähtörelaatiosta Tällaiset mukaan joko vain toisesta tai molemmista lähtörelaatioista Luonnollinen liitos: yhdistetään toisiinsa ne monikot, joissa yhteiset (so. samannimiset) sarakkeet ovat samat
SQL Kieli relaatiotietokantojen käsittelyyn: tietokannan tietosisällön määrittelyyn tietojen päivitykseen tietojen hakuun käyttäjien ja käyttöoikeuksien määrittelyyn Tuoreimmat standardin verisiot SQL-92 SQL:1999 SQL:2003 Tällä kurssilla käytössä PostgreSQL 7.4, jossa toteutettuna valtaosa standardi-sql:stä 1 1 Tällä hetkellä ei ole saatavilla tkhj:tä, joka toteuttaisi kaikki SQL:2003-määritysten pakolliset osat
Taulun luominen Esimerkiksi kurssiaineistona oleva koulutus-taulu: CREATE TABLE koulutus ( kunta VARCHAR(25) NOT NULL, tutkinnot NUMERIC(4,2), opiskelijat NUMERIC(1), PRIMARY KEY (kunta) ); Avaimena kunnan nimi Numeerisia tietoja korkeakoulututkinnon suorittaneiden ja opiskelijoiden osuudet väestöstä
Taulussa olevan tiedon muuttaminen Tietojen lisääminen INSERT INTO koulutus VALUES ( Helsinki, 22.6, 4); Tietojen muuttaminen UPDATE koulutus SET opiskelijat = 4 WHERE kunta = Helsinki ; Tietojen poistaminen DELETE FROM koulutus WHERE kunta = Helsinki ;
Tietokantahaku Perushaku: kunnat, joissa korkeakoulu yli 20% aikuisväestöstä SELECT kunta, tutkinnot FROM koulutus WHERE tutkinnot > 20 ORDER BY tutkinnot DESC; Tulos: kunta tutkinnot Kauniainen 44.40 Espoo 28.60 Helsinki 22.60 Oulu 20.89 Kirkkonummi 20.39 (5 rows)
Hakuehtojen yhdistäminen Hakuehdossa voi toki käyttää myös loogisia operaattoreita AND, OR, NOT Kunnat, joissa paljon sekä tutkinnon suorittaneita että opiskelijoita SELECT * FROM koulutus Tulos: WHERE tutkinnot > 17.5 AND opiskelijat > 4; kunta tutkinnot opiskelijat Jyväskylä 19.80 7 Oulu 20.89 5 Tampere 17.70 5 (3 rows)
Kysely useasta taulusta Valtuustojen voimasuhteet korkeasti koulutetuissa kunnissa SELECT vaalit96.* FROM koulutus, vaalit96 WHERE vaalit96.kunta = koulutus.kunta AND koulutus.tutkinnot > 20; Tulos: kunta keskusta kokoomus sdp sfp vasemmistoliitto vihreat Espoo 2.94 35.29 20.58 11.76 4.41 11.76 Helsinki 3.48 27.90 24.41 9.30 6.97 18.60 Kauniainen 0.00 30.55 2.77 50.00 0.00 5.55 Kirkkonummi 4.54 27.27 25.00 22.72 4.54 9.09 Oulu 21.66 20.00 20.00 0.00 16.66 11.66 (5 rows)
Yhteenvetokyselyt Kyselytuloksessa voi käyttää operaattoreita MIN, MAX, AVG, COUNT ja SUM Yhteenlaskettu väkiluku kunnissa, joissa on korkein tulotaso SELECT SUM(kunnat01.yht) FROM kunnat01, elintaso WHERE kunnat01.nimi = elintaso.kunta AND elintaso.tulot_hlo > 80000; Tulos: sum 1103128 (1 row)
Luokittelu Kyselytuloksen voi luokitella Läänien väkiluku SELECT laani, sum(yht), sum(ulkom_yht) FROM kunnat01 GROUP BY laani ORDER BY laani; Tulos: laani sum sum 1 2081507 55248 2 1835836 24404 3 591093 5140 4 455135 3442 5 191768 1715 6 25776 1125 (6 rows)
Alikyselyt Hakuehdossa voi käyttää mukana alikyselyn tuloksia Ahvenanmaan keskimääräistä suuremmat kunnat SELECT nimi, yht FROM kunnat01 WHERE laani = 6 AND yht > (SELECT AVG(yht) FROM kunnat01 WHERE laani = 6) ORDER BY yht DESC; nimi yht Maarianhamina 10488 Jomala 3328 Finström 2299 Saltvik 1679 (4 rows)
SQL ja paikkatieto Perus-SQL, samoin kuin relaatioalgebra, lähtee yksinkertaisista tietotyypeistä Numeroita, merkkijonoja, aikoja Geometriatieto monimutkaisempaa Oliorelaatiotietokanta Uusien tietotyyppien ja niiden operaatioiden määrittely Tietotyyppien luokkahierarkia: aliluokat, moniperintä Paikkatietotyypit lisättävissä
Open GIS Ohjelmistovalmistajien yhteenliittymä Tavoitteena paikkatietojärjestelmien yhteensovittamiseen tarvittava standardointi Taustalla oliopohjainen tietomalli Tietomalli sovellettavissa eri ohjelmointikielillä; tässä SQL-määritykset Geometriatieto jakaantuu neljään alaluokkaan: 02-ulotteisiin yksittäisiin kohteisiin ja niiden kokoelmiin
Open Gis:n luokkahierarkia
Perusoperaatiot Paikkatietotyypeille on määritelty mm. Dimension(): kohteen ulottuvuus SRID(): Käytetyn koordinaattijärjestelmän tunniste IsEmpty(): Onko kohteen esitys tyhjä IsSimple(): Onko kohde yksinkertainen Boundary(): Kohteen reuna Envelope(): Pienin koordinaattiakselien suuntainen suorakulmio, jonka sisään kohde sopii
Topologiset suhteet Kohteiden välisistä topologisista suhteista on määritelty Equals(): A = B Disjoint(): A B = Touches(): ( A B ) (A B = ) Within(): A B Overlaps(): (A B ) Crosses(): (A l ) ( Within(l, A)) (Dim(A l) < max(dim(a),dim(l))) Intersects(): Disjoint(A, B) Contains(): Within(B, A)
Paikkaoperaatiot Sijaintisuhde Distance(): lyhin kohteiden välinen etäisyys Topologiset ym. operaatiot Intersection(): A B Difference(): A B Union(): A B SymDifference(): (A B) (A B) Buffer(): Alue d pituusyksikön sisällä A:n ympärillä ConvexHull(): A:n konveksi verho, so. pienin kupera monikulmio, jonka sisään A sopii
Piste- ja viivakohteiden funktiot Pistekohteille määritellyt funktiot X(): pisteen x-koordinaatti Y(): pisteen y-koordinaatti Viivakohteille määritellyt funktiot StartPoint(): alkupisteen koordinaatit EndPoint(): loppupisteen koordinaatit IsClosed(): StartPoint(l) = EndPoint(l) IsRing(): IsClosed(l) IsSimple(l) Length(): Murtoviivan pituus NumPoints(): Murtoviivan kulmapisteiden lukumäärä PointN(): n:nnen kulmapisteen koordinaatit
Aluekohteiden funktioita Aluekohteiden funktioita Centroid(): keskipiste (ei välttämättä kohteen sisällä!) PointOnSurface(): palauttaa kohteen sisäpisteen Area(): alueen pinta-ala Kokoelmakohteiden funktioita NumGeometries(): kokoelman kohteiden lukumäärä GeometryN(): kokoelman n:s osakohde
Paikkatietoa käyttävä haku Helsingin lähikunnat SELECT b.nimi, distance(a.wkb_geometry, b.wkb_geometry) FROM kunnat01 AS a, kunnat01 AS b WHERE a.nimi = Helsinki AND DISTANCE(a.wkb_geometry, b.wkb_geometry) < 12000 ORDER BY DISTANCE(a.wkb_geometry, b.wkb_geometry); nimi distance Espoo 0 Helsinki 0 Vantaa 0 Sipoo 0 Kauniainen 3001.95627904734 Tuusula 8138.60263039062 Kerava 10298.093525215 Nurmijärvi 11714.9316057791 (8 rows)
Kohteiden välinen raja Vierekkäisten alueiden leikkaus on niiden raja Helsingin ja sen naapurikuntien välisen rajan pituus SELECT b.nimi, LENGTH(INTERSECTION(a.wkb_geometry, b.wkb_geometry)) FROM kunnat01 AS a, kunnat01 AS b WHERE a.nimi= Helsinki AND TOUCHES(a.wkb_geometry, b.wkb_geometry); nimi length Espoo 10501.3961662369 Vantaa 19034.0488094046 Sipoo 2544.35931429806 (3 rows)
Sijainti- ja ominaisuustiedon yhdistäminen Helsinkiä lähin keskustaenemmistöinen kunta SELECT b.nimi, DISTANCE(a.wkb_geometry, b.wkb_geometry), vaalit96.keskusta FROM kunnat01 AS a, kunnat01 AS b, vaalit96 WHERE a.nimi = Helsinki AND b.nimi = vaalit96.kunta AND vaalit96.keskusta > 50 AND distance(a.wkb_geometry, b.wkb_geometry) = (SELECT MIN(DISTANCE(a.wkb_geometry, b.wkb_geometry)) FROM kunnat01 as a, kunnat01 as b, vaalit96 WHERE a.nimi= Helsinki AND b.nimi = vaalit96.kunta AND vaalit96.keskusta > 50); nimi distance keskusta Artjärvi 66399.075294766 55.55 (1 row)
Laskentaa ominaisuus- ja sijaintitiedoilla Kunnat, joissa eniten julkisia teitä (tie-m / km 2 ) SELECT kunnat01.nimi, autoilu.tiet/area(kunnat01.wkb_geometry)*1e9 AS tietiheys, tiet, area(kunnat01.wkb_geometry)/1e6 as km2 FROM kunnat01, autoilu WHERE kunnat01.nimi = autoilu.kunta AND autoilu.tiet/area(kunnat01.wkb_geometry) > 8e-7 ORDER BY autoilu.tiet/area(kunnat01.wkb_geometry) DESC; nimi tietiheys tiet km2 Piikkiö 929.445534809963 73 78.54145 Vantaa 903.257125077235 222 245.777192160004 Lemu 880.881351154542 30 34.0568 Merimasku 870.754860737831 26 29.85915 Mietoinen 844.530290806328 66 78.14995 (5 rows)
Hyvää pääsiäistä http://www.banaanikotka./