Riku Mäki Lounaspaikka, Regional Council of SW Finland Turun yliopiston IT-laitos 9.10.2008 Kaavajohtopaikka -hankkeen kiinteistöliittymätyökalun kehittämisprojekti 2008 - Loppuraportti
Sisällysluettelo 1 Johdanto...4 1.1 Projektin aikataulu...4 1.2 Asiakkaan kuvaus...5 1.3 Käytetyt metodit ja ohjelmat...5 1.3.1 PostgreSQL...5 1.3.2 PostGIS...5 1.3.3 MapServer...6 2 Vaatimusmäärittely...6 2.1 Rich Picture...6 2.2 Tuleva järjestelmä...7 2.3 Asiakkaan haluamat ominaisuudet kiinteistöliittymätyökalussa...8 2.4 CATWOE...8 2.5 Käyttäjätapaukset...10 3 Tietokanta...13 3.1 Tietokannan kuvaus...13 3.2 Relaatiokaava ja relaatioiden kuvaus...14 3.2.1 Relaatiot ja attribuuttien merkitys...15 3.3 Tietokannan toteutus...16 4 Kiinteistöliittymätyökalun toteutus...22 4.1 Kirjautuminen ja etusivu...22 4.2 Karttapalvelu...25 4.3 Pisteen tietojen kysely...29 4.4 Pisteen lisääminen...31 4.5 Pisteen poistaminen...34 4.6 Käyttäjän lisääminen...37 2
4.7 Käyttäjän poistaminen...39 4.8 Karttatiedoston rakentaminen...40 5 Yhteenveto ja johtopäätökset...42 6 Koodit...44 6.1 kartta.map...44 6.2 Index.php...52 6.3 Kartta.php...54 6.4 Rakennukset_header.php...61 6.5 Rakennukset_query.php...61 6.6 Rakennukset_footer.php...62 6.7 Lisaa_piste.php...63 6.8 Poista_piste.php...84 6.9 Kayttajan_lisays.php...87 6.10 Poista_kayttaja.php...92 Liitteet...95 3
1 Johdanto Tämä loppuraportti on kiinteistöliittymätyökaluprojektin dokumentointi. Siinä esitetään kaavioin ja niitä käsittelevien selitysten avulla mitä projektin aikana on tehty. Lisäksi se sisältää toteutuneen ohjelmakoodin selitykset sekä ohjeen käyttöliittymälle. Tämä raportti toimii myös tietokannan luontiohjeena Varsinais-Suomen liitolle. Projektin alullepanijana toimi Varsinais-Suomen liitto, joka haki yliopistolta henkilöä toteuttamaan vesihuollon kiinteistöliittymätyökalun. Projektin otti vastaan harjoitustyönä Turun yliopiston tietojenkäsittelytieteen opiskelija Riku Mäki. Kiinteistöliittymätyökalu on Internetin kautta toimiva karttapalvelu (http://lounaisproto.inoi.fi/msdemo/test/), jonka tarkoituksena on auttaa vesihuollon ammattilaisia ylläpitämään asiakas- ja ja rakennustietoja. Karttapalvelu toimii käyttöliittymänä projektin aikana toteutettuun tietokantaan. Sen avulla käyttäjä voi lisätä, poistaa ja muokata oman kuntansa kiinteistöjen tietoja. Lisäksi järjestelmänvalvojaa varten on erillinen käyttöliittymä, jonka avulla voidaan lisätä ja poistaa käyttäjiä. Kiinteistöliittymätyökalu ei ole vielä valmis ja sen kehitystä aiotaan jatkaa 2008 syksyn aikana. Riku Mäki ei kuitenkaan jatka tämän projektin parissa. Projektiin kuului useita työvaiheita. Se alkoi Varsinais-Suomen liiton työntekijöiden haastatteluiden avulla tehdystä vaatimusmäärittelystä, joka sisältää taulukkomuodossa käyttäjien haluamia ominaisuuksia käyttöliittymään, tulevan käyttöliittymän suunnittelua ja sen tarpeellisuuden arviointia sekä erilaisia tutkimusmetodeja. Projektin seuraavassa vaiheessa suunniteltiin ja toteutettiin kiinteistöliittymän tietokanta. Tämä työvaihe sisälsi ER-kaavion ja relaatiokaavan avulla tehdyn tietokantasuunnitelman sekä itse tietokannan toteutuksen. Viimeisessä vaiheessa suunniteltiin ja toteutettiin itse käyttöliittymä. Käyttöliittymän toteutukseen käytettiin MapServer- kehitysympäristöä. 1.1 Projektin aikataulu Projektin GANTT-taulukko, josta selviää eri tehtävien arvioidut ja toteutuneet työtunnit, on raportin lopussa liitteenä. Kuten johdannossa mainittiin, alkoi projekti vaatimusmäärittelyllä. Tähän oli varattu noin viikko, mikä tuntui hyvin lyhyeltä. Projektin alkuvaihe pysyi kuitenkin suunnitellussa aikataulussa. Vaatimusmäärittelyä tehtiin tosin jo ennen projektin varsinaista alkua ja Turun yliopiston opiskelija Pyry Liukas oli tehnyt omassa tutkimuksessaan siitä jo suurimman osan. Käyttöliittymän suunnittelu aloitettiin heti vaatimusmäärittelyiden ja ensimmäisen väliraportin valmistuttua. Suunnitteluosuus kesti noin 14 työpäivää, jonka aikana suunniteltiin tietokannan entiteetit, relaatiot ja rakenne. Lisäksi suunniteltiin mm. käyttöliittymän metodit, rakenne ja ulkoasu. Samaan aikaan käyttöliittymätyökalun yhteydessä tutkittiin eri karttapalvelimien soveltuvuutta Lounaispaikka-projektiin. Tämän tutkimuksen tuloksen perusteella päätettiin, mitä karttapalvelinta käytetään tässä projektissa. Käyttöliittymän toteutukseen oli varattu noin 30 työpäivää, mikä ei riittänyt projektin loppuun saattamiseksi vaan projekti jäi kesken. Sen aikana suoritettiin kuitenkin tietokannan ja käyttöliittymän koodausta sekä siirrettiin tietokantaan kahden kunnan informaatiot kiinteistöistä. 4
Järjestelmää ei varsinaisesti ehditty testata. Testausta varten on kuitenkin tehty virtuaalipalvelin, jossa keskeneräinen käyttöliittymä toimii. 1.2 Asiakkaan kuvaus Lounaispaikka on paikkatietoyhteistyöverkosto, joka kokoaa yhteen lounaisen Suomen paikkatietoalan toimijat. Lounaispaikan tarkoitus on parantaa ja luoda uusia yhteistyömuotoja eri toimijoiden välille. Lounaispaikka etsii uusia keinoja hyödyntää paikkatietoa, jotta paikkatiedon hyödyt saataisiin paremmin esiin ja päällekkäisen työn määrä vähenisi. Paremman yhteistyön ja keskinäisen tiedotuksen kautta saavutetaan myös kustannussäästöjä monella tasolla. Lounaispaikan tarkoitus on myös edistää paikkatietoasioiden tunnettuutta, ja tämä tapahtuu toimivien palveluiden kautta. Lounaispaikka kehittää jatkuvasti karttapalveluitaan monipuolisemmiksi sekä myös käytettävyydeltään paremmiksi. Lounaispaikka on mukana myös kansallisen ja kansainvälisen tason paikkatietoyhteistyössä, mutta ensisijaisesti Lounaispaikka on lounaisen Suomen alueen hyväksi toimiva yhteistyöverkosto. Lounaispaikka on itsekin hyvä esimerkki siitä, että usein uudet, innovatiiviset hankkeet lähtevät helpoimmin liikkeelle alueelliselta tasolta. Tarjoamalla monipuolisia paikkatietopalveluita Internetissä, on Lounaispaikka osaltaan mukana lounais-suomalaisen tietoyhteiskunnan rakentamisessa. Lounaispaikan toimintaa kuvaa avoimuus. Kaikki Lounaispaikan palvelut ovat käyttäjilleen ilmaisia ja vapaita käytettäväksi. Lounaispaikka on myös avoin uusille toimijoille ja ideoille. Lounaispaikan toimintaa kehitetään yhteistyöryhmässä, johon kuuluvat kaudella 2006-2008 Varsinais-Suomen liitto, Lounais-Suomen ympäristökeskus, Turun yliopisto, Åbo Akademi, Turun kauppakorkeakoulu, Turun ammattikorkeakoulu sekä Yrkeshögskolan Sydväst. Lounaispaikan toimipiste sijaitsee Varsinais-Suomen liiton tiloissa Turussa. 1.3 Käytetyt metodit ja ohjelmat 1.3.1 PostgreSQL PostgreSQL on avoimena lähdekoodina jaettava olio-relaatiotietokanta, jota on kehitetty yli 15 vuotta ja se on lisensoitu joustavalla BSD-tyyppisellä lisenssillä. PostgreSQL perustuu kansainväliseen ohjelmoijien ja yritysten muodostaman yhteisön tekemään kehitystyöhön. Sen vahvuutena on uskollisuus ANSI-SQL 92/99 standardeille sekä sen monipuolinen käyttöjärjestelmätuki. Se toimii lähes kaikissa suuremmissa käyttöjärjestelmissä kuten Windows, Linux, UNIX ja Mac. Lisäksi monesta ohjelmointikielestä löytyy postgresql tuki (esim C/C++, Java,.Net, Perl ja Python). Näiden ominaisuuksien takia projektissa päätettiin käyttää PostgresSQLtietokantaa. 1.3.2 PostGIS 5
PostGIS on PostgreSQL:n paikkatietolaajennus, jonka on kehittänyt Refractions Resarch. GIS on lyhenne sanoista Geographic Information System eli paikkatietojärjestelmä. Paikkatietojärjestelmän avulla voidaan tallentaa, hallita, analysoida sekä esittää paikkatietoa. Paikkatieto koostuu karttaobjektista, sijaintitiedosta ja ominaisuustiedosta. Näin ollen se voi olla esimerkiksi rakennus tai kiinteistö. Kuten PostgreSQL, perustuu PostGIS avoimeen koodiin ja se julkaistaan GNU (General public License)-lisenssin alaisena. Tästä syystä se on ilmainen. PostGIStietokannan sisältämää dataa voidaan käyttää hyväksi MapServer-kehitysympäristössä. 1.3.3 MapServer MapServer on avoimen koodin kehitysympäristö spatiaalisille Internet-sovelluksille. Sen voi ajaa CGI-ohjelmana (Common Gateway Interface) tai mapscriptin kautta. MapServerin kehittäjänä on toiminut Minnesotan yliopisto yhteistyössä NASA:n kanssa. MapServer tukee OGC:n (Open Geospatial Consortium) standardeja, kuten WMS (Web Map Service) ja WFS (Web Feature Service). Se tukee GIS-tiedostoformaatteja, kuten ESRI:n Shape-tiedostoja, joita käytettiin myös tässä projektissa. Lisäksi MapServerin tuki PHP-ohjelmointikielelle oli oleellinen asia tässä projektissa. 2 Vaatimusmäärittely 2.1 Rich Picture Rich Picturen on tarkoitus kuvata asiakasorganisaatiota ja sen toimintaa. Siitä selviää, miten tietoa tällä hetkellä siirretään ja kuka on siitä vastuussa. Rich Picture onkin havainnollinen tapa ilmaista organisaation toimintaa. Se toimii myös kommunikaatiolinkkinä suunnittelijoiden ja asiakkaan välillä. Usein on niin, että suunnittelijoiden käyttämä ammattitermistö on asiakkaalle tuntematonta. Rich Picturen paras ominaisuus onkin auttaa asiakasta ymmärtämään suunnittelijoiden havaitsemat vahvuudet ja heikkoudet. 6
Kuva 1. Rich Picture tulevasta järjestelmästä 2.2 Tuleva järjestelmä Tulevassa järjestelmässä aineiston toimittajat tulevat toimittamaan aluksi koko aineistonsa Varsinais-Suomen liittoon. Siellä työntekijä muokkaa tietoja siten, että ne saadaan helposti liitettyä tietokantaan. Kun aineisto on toimitettu ja syötetty tietokantaan, voivat aineiston toimittajat itse syöttää haluamiaan tietoja sinne. Tämä tapahtuu käyttämällä uutta käyttöliittymää rajatuin oikeuksin. Oikeudet rajoittavat heitä näkemään vain oman kuntansa yksityiskohtaisia tietoja. Varsinais-Suomen liiton työntekijät pääsevät tulevaisuudessa muokkaamaan tietokantaa käyttöliittymän avulla. Lisäksi heidänkin käyttöliittymänsä kautta tehtäviä toimintoja rajataan käyttöoikeuksin, mikä suojaa tietokannan eheyttä ja estää peruuttamattomia virheellisiä toimintoja. Hankeen aikana on myös ehdotettu, että tultaisiin käyttämään uutta palvelinta, mutta tämä ehdotus on vielä avoin. 7
Tärkeintä työtehtävässä on liittymän teko tietokannan ja karttapalvelun välille. Se voidaan toteuttaa jo nyt Kommentaattori-palvelun mallia ottamalla ArcIMS:llä, mutta vielä paremmin MapServerillä tai GeoServerillä, jolloin päästään tavallaan kehityksessä samalla eteenpäin. 2.3 Asiakkaan haluamat ominaisuudet kiinteistöliittymätyökalussa Tulevassa järjestelmässä tulee olemaan toiminto, jolla käyttäjä voi lisätä, poistaa tai muuttaa pisteen tietoja. Pisteen tiedot syötetään tietokantaan klikkaamalla haluttua kohtaa kartalla, jolloin eteen avautuu lomake, jossa on esitäytettynä koordinaatit. Koordinaatit voidaan lisätä halutessa myös manuaalisesti. Tätä varten työkalussa on erillinen lomake. Kartalla valmiina olevien pisteiden tietoja voidaan tarkastella klikkaamalla pistettä. Klikkaaminen avaa lomakkeen, johon voidaan tehdä muutoksia tai tarkastella halutun kiinteistön tietoja. Kokonaisen kunnan tietojen lisääminen kerralla tulee olemaan selaimen kautta mahdotonta. Tätä varten suunnitellaan erillinen ohjelma, joka jäänee tämän projektin ulkopuolelle. Kyseinen ohjelma toteutetaan, mikäli siihen jää aikaa. Tietokantaan voidaan ohjelman avulla tehdä kyselyitä. Kysely voidaan aloittaa painamalla sivustolta löytyvää linkkiä. Linkin klikkaaminen avaa lomakkeen, johon täytetään kyselyn kriteerit. Kun nämä tiedot on syötetty, painetaan suorita-painiketta, minkä jälkeen kyselyn tulos näkyy ruudulla. Käyttöoikeudet rajoittavat näkyvää tulosta. Kyselyn tulos on myös mahdollista tallentaa omalle tietokoneelle. Kirjautunut järjestelmänvalvoja voi myös halutessaan lisätä käyttäjiä karttapalveluun. 2.4 CATWOE CATWOE-analyysin tehtävänä on ilmentää tarkistuslistamaisesti ongelmaa/tavoitetta tutkittavassa järjestelmässä. Analyysi kohdistuu kuuteen eri osa-alueeseen, joiden tarkoituksena on ehkäistä tilannetta, jossa yhtä aluetta kehittämällä aiheutetaan haittaa toisaalla. Seuraavassa listassa on osa-alueet selityksineen ja varsinaisine asiakasyritykseen kohdistuvine analyyseineen. Customers: Tahot, joihin järjestelmän toiminnasta koituvat edut/haitat kohdistuvat ja mitä ongelmia tällä hetkellä on. Lisäksi tarkastellaan, miten he mahdollisesti reagoivat ehdotuksiin. Kiinteistöliittymätyökalun tuomat ongelmat/haitat - uuden järjestelmän omaksuminen saattaa olla hankalaa - suurempi vastuu informaatiosta - suurempi työmäärä - järjestelmän käytön opettelu Kiinteistöliittymätyökalun vahvuudet + pääsy järjestelmään 8
+ informaatio tallentuu heti tietokantaan ja on tarkasteltavissa reaaliajassa + tietojen näkyminen kartalla + uusien tietojen lisääminen helpompaa + aineiston voi ladata omalle koneelle paikkatietotaulukkona + sen tuomat edut vaikuttanevat positiivisesti hyväksyntään Actors: Tahot, jotka ovat uuteen järjestelmään toimijoina sekä näihin kohdistuvat vaikutukset Varsinais-Suomen liiton työntekijät: + estetään tietokannan suorasta muokkauksesta aiheutuvat mahdolliset toimintaongelmat + helppokäyttöisyys - uuden työkalun markkinointi - käytön opettaminen kuntien virkamiehille Transformation: Mitä uusi järjestelmä tekee aikaansaadakseen syötteestä tuloksen ja mitä tietoa järjestelmään syötetään? Mistä syötteet tulevat? Mikä on järjestelmän antama tulos ja mihin/kenelle se menee? Miten päästään lopputulokseen? Nykyinen valmisteleva toiminta aineiston toimittajat lähettävät tiedot sähköpostitse Varsinais-Suomen liittoon Varsinais-Suomen liiton työntekijä syöttää tiedot paikalliselle tietokoneelle tulos näkyy graafisena karttana ja taulukkona vain Varsinais-Suomen työntekijälle Kiinteistöliittymätyökalu aineiston toimittajat lähettävät tiedot liittoon ja ne muokataan Varsinais-Suomen liiton työntekijä siirtää tiedot kerralla tietokantaan myöhemmin tietoja on mahdollisuus syöttää suoraan käyttöliittymän kautta tietokantaan aineiston toimittajat voivat syöttää tiedon myös itse tietokannasta haetaan ohjelman avulla informaatiota, jota näytetään graafisesti selaimessa kuntien työntekijät tekevät kyselyjä tietokantaan ja tallentavat tuloksia muokattavaksi omalle koneelleen kuntien virkamiehet muokkaavat ja päivittävät tietokantaa käyttöliittymän avulla World view: Järjestelmän laajempi vaikutus. Mikä on se oikea ongelma, jota yritetään ratkaista? uusi järjestelmä mahdollistaa useamman kunnan liittymisen järjestelmään järjestelmä saattaa kasvaa maanlaajuiseksi verkostoksi suurin ongelma on saada käyttöliittymä toimimaan kaikkia palvelevalla tavalla jatkossa mukaan haja-asutusalueet 9
pystytään tarkastelemaan alueellisesti liittyneitä/liittymättömiä kiinteistöjä ja tämän perusteella voidaan tehdä tarvittavia toimenpiteitä. Owner: Järjestelmän vaikutusvaltaiset tahot ja näiden roolit. Kaavajohtohanke o projekti loppuu 12/2008. Lounaispaikka jatkaa ylläpitoa, mikäli sitä varten saadaan rahoitusta Environmental constraints: Järjestelmän toimivuutta rajoittavat tekijät palvelimen fyysiset ja ohjelmalliset rajoitukset (tallennuskapasiteetti, ohjelmistot, käyttörajoitukset) aineiston toimittajien kiinnostus tai sen puute aineiston toimittajien osaamisen taso yksityisyyden suoja 2.5 Käyttäjätapaukset Käyttötapauksen nimi Osallistuvat Aktorit Käyttäjän lisääminen järjestelmään Varsinais-Suomen liiton työntekijä Tapahtumien kuvaus 1. Työntekijä avaa selaimessa käyttöliittymän 2. Kirjautuu sisään omilla tunnuksillaan 3. Valitsee lisäyslomakkeen 4. Täyttää selaimeen avautuvan lomakkeen 5. Lähettää lomakkeen tiedot painamalla lähetä-painiketta 6. Kirjautuu ulos Alkuehto Loppuehto Laadulliset vaatimukset Käyttäjällä on oikeus käyttäjien lisäämiseen Käyttäjä on lisätty rajoitetuin oikeuksin järjestelmään Helppokäyttöisyys, selkeät ohjeet 10
Käyttötapauksen nimi Osallistuvat aktorit Kyselyn teko tietokannasta Varsinais-Suomen liiton työntekijä tai kunnan virkamies Tapahtumien kuvaus 1. Työntekijä avaa selaimessa käyttöliittymän 2. Hän kirjautuu sisään omilla tunnuksillaan 3. Valitsee kysely toiminnon 4. Täyttää avautuvaan lomakkeeseen vaadittavat tiedot 5. Tallentaa tuloksen tietokoneelleen 6. Kirjautuu ulos Alkuehto Loppuehto Aineisto on tallennettuna tietokannassa Kyselyn tulos näkyy näytöllä virheettömänä ja se on tallennettavissa toiseen muotoon omalle koneelle Laadulliset vaatimukset 11
Käyttötapauksen nimi Osallistuvat Aktorit Tapahtumien kuvaus Alkuehto Aineiston lisäys olemassa olevaan aineistoon Aineistontoimittaja 1. Aineistontoimittaja avaa selaimessa käyttöliittymän 2. Hän kirjautuu sisään avautuvasta pääikkunasta 3. Hän klikkaa hiirellä kartan kohtaa johon haluaa lisätä informaatiota/avaa lomakkeen johon on syötettävä myös koordinaatit 4. Hän syöttää avautuvaan lomakkeeseen vaadittavat tiedot 5. Painamalla lähetä painiketta tallentuu tiedot tietokantaan ja samalla karttaan lisätään haluttu piste 6. Käyttäjä kirjautuu ulos Aineisto on olemassa tietojärjestelmässä Loppuehto Aineisto tallennettu järjestelmään virheettömästi ja kartalla näkyy haluttu piste Laadulliset vaatimukset Helppokäyttöisyys, nopea, yksityisyydensuoja, rajoitetut käyttöoikeudet 12
Käyttötapauksen nimi Osallistuvat Aktorit Tapahtumien kuvaus Alkuehto Loppuehto Laadulliset vaatimukset Aineiston tarkastelu Karttapalvelun asiakas 1. Karttapalvelun asiakas avaa selaimessa käyttöliittymän 2. Hän kirjautuu sisään avautuvasta pääikkunasta 3. Hän klikkaa hiirellä kartan kohtaa tai rajaa suuremman alueen, josta haluaa informaatiota 4. Riippuen käyttöoikeuksista hänelle avautuu pisteen/alueen sisältämät tiedot 5. Käyttäjä kirjautuu ulos Aineisto on tallennettuna tietokantaan Tallennettu aineisto näkyy selaimella virheettömästi Helppokäyttöisyys, nopea, yksityisyydensuoja, rajoitetut käyttöoikeudet 3 Tietokanta 3.1 Tietokannan kuvaus Tietokantasuunnitelmassa suunniteltiin kiinteistöliittymätyökalun tietokanta. Tietokanta toteutettiin postgresql- ja postgis-tietokantana. Tietokantaan tallennettiin kaikki kartan esittämiseen vaadittava informaatio sekä tiedot asiakkaista, kiinteistöistä, rakennuksista ja omistajista. Kannan suunnittelu aloitettiin aivoriihellä Varsinais-Suomen liiton työntekijöiden kanssa. Tämän pohjalta päädyttiin ER-kaavioon, jonka perusteella alettiin toteuttaa tietokantaa. Alkuperäinen suunnitelma muuttui kuitenkin useasti projektin edetessä. Syynä muutoksiin oli olemassa olevan datan puutteellisuus ja tallennusmuoto. Lisäksi edellä mainitun syyn takia jouduttiin tekemään useita kompromisseja. Tästä syystä tietokanta ei ole täysin oppikirjojen opetusten mukainen. Tietokannasta olisi tullut eheämpi, mikäli kaikki olemassa oleva (yli 5000 tietuetta) data olisi kirjoitettu uusiksi. Tämä ei kuitenkaan ollut nykyisten resurssien puitteissa mahdollista. Lisäksi tietokanta sisältää edelleen paljon tarpeettomia duplikaatteja Henkilo - taulussa, sillä useat samaa henkilöä tarkoittavat nimet on kirjoitettu tietokantaan kahdella eri tavalla. Esimerkiksi joillakin henkilöillä on nimi tietokannassa ilman toista nimeä ja toinen tietue on taas kirjoitettu sisältäen henkilön toisen nimen. Tulevaisuudessa tietokanta olisi syytä puhdistaa 13
tämänkaltaisista ongelmista. Liitteenä esitetty ER-kaavio on valmiin tietokannan kuvaus. ER-kaavio on tehty käyttämällä SmartDraw 2008-ohjelmaa. Tietokannan taulukot, joista selviää mitä tyyppiä attribuutit ovat, on raportin lopussa liitteenä 3.2 Relaatiokaava ja relaatioiden kuvaus Tavallisia muunnossääntöjä käyttäen liitteenä esitetty ER-kaavio muunnettiin seuraaviksi relaatioiksi: Käyttäjä (tunnus, salasana, kunta_id, osoite, postinumero, puhelin, etunimi, sukunimi, s_posti, admin, postitoimipaikka) Rakennus (rakennustunnus, osoite, osoite_2, vesi_toiminta_alueella, hule_toiminta_alueella, jäte_toiminta_alueella, RID, vesi_pvm, hule_pvm, jäte_pvm, vesi_hule_jäte, itse_lisätty, henkilö_id, kiinteistötunnus, kuntatunnus, posti_nro, x, y, the_geom) Kiinteistö (KIID, henkilö_id) Henkilö (HID, nimi, asiakas_nro) Kunta (KUID, nimi) Lisäksi tietokanta sisältää postgis:n hyödyntämistä varten tarvittavat taulukot: Geometry_columns (SRID, f_table_catalog, f_table_schema, f_table_name, f_geometry_column, coord_dimension, type) Spatial_ref_sys (SRID, auth_name, auth_srid, srtext, proj4text) Tietokantaan tehtiin kartta.map-tiedostoa varten myös seuraava näkymä (view), jonka avulla MapServerin kartta.map-tiedosto esittää rakennukset ja karttaliittymässä voidaan näyttää kaikki tarvittavat tiedot kiinteistöistä: CREATE VIEW rakennukset SELECT rakennus.rid, rakennus.rakennustunnus, rakennus.kiinteistotunnus, rakennus.osoite, rakennus.osoite_2, rakennus.vesi_toiminta_alueella, rakennus.hule_toiminta_alueella, rakennus.jate_toiminta_alueella, rakennus.vesi_pvm, rakennus.hule_pvm, rakennus.jate_pvm, rakennus.vesi_hule_jate, rakennus.itse_lisatty, rakennus.posti_nro, rakennus.x, rakennus.y, rakennus.the_geom, kunta.nimi AS kunta, henkilo.nimi, henkilo.asiakas_nro, kunta.kuid, henkilo2.nimi AS kiint_om FROM rakennus LEFT JOIN henkilo ON henkilo.hid = rakennus.henkilo_id LEFT JOIN kiinteisto ON kiinteisto.kiid::text = rakennus.kiinteistotunnus::text LEFT JOIN henkilo henkilo2 ON henkilo2.hid = kiinteisto.henkilo_id, kunta 14
WHERE kunta.kuid = rakennus.kuntatunnus; Tämä tuottaa taulukon, jossa on seuraavat sarakkeet: (rid, rakennustunnus, kiinteistotunnus, osoite, osoite_2, vesi_toiminta_alueella, hule_toiminta_alueella, jate_toiminta_alueella, vesi_pvm, hule_pvm, jate_pvm, vesi_hule_jate, itse_lisatty, posti_nro, x, y, the_geom, kunta, nimi, asiakas_nro, kuid, kiint_om) ER-kaavion perusteella määräytyivät myös tietokannan viiteavaimet, jotka on kohteineen lueteltu alla: käyttäjä.kunta_id, rakennus.kuntatunnus -> kunta.kuid kiinteisto.henkilo_id rakennus.henkilo_id -> HID rakennus.kiinteistotunnus -> kiid 3.2.1 Relaatiot ja attribuuttien merkitys Relaatio Käyttäjä vastaa reaalimaailman karttapalvelun käyttäjää, jolle määritetään käyttäjätunnus ja salasana. Käyttäjän oikeuksia oli tarkoitus rajoittaa kuntatunnuksella, joka oikeuttaisi hänet tarkastelemaan vain oman kuntansa rakennuksia. Tätä ominaisuutta ei saatu valmiiksi. Näiden lisäksi käyttäjästä tallennetaan yhteystiedot. Perustietojen lisäksi käyttäjästä tallennetaan myös tieto siitä, että onko hän järjestelmän valvoja vai ei. Tämän tiedon kertoo boolean tyyppinen rivi admin. Relaatio Kunta esittää kuntaa. Sen attribuutti KUID toimii yhdistävänä tekijänä rakennuksen ja käyttäjän välillä. Relaatio Rakennus vastaa reaalimaailman rakennusta. Siihen tallennetaan rakennuksen osoite ja tiedot siitä mihin vesijärjestelmään se kuuluu. Vesi_toiminta_alueella, Jäte_toiminta_alueella, Hule_toiminta_alueella kertoo, kuuluuko rakennus vesijärjestelmän toimittajan toimintaalueelle. Hule_Vesi_Jäte kertoo mihin vesijärjestelmiin rakennus kuuluu. Tämän rivin vaihtoehtoina on kirjainten v, h ja j erilaiset yhdistelmät. Kirjain yhdistelmästä riippuen kiinteistöliittymätyökalu esittää kartalla jonkin kuvion. Rakennus kuuluu myös johonkin kiinteistöön, joten sillä on viittaus kiinteistöön. Itse_lisätty attribuutti kertoo onko rakennuksen tiedot lisätty karttaohjelman avulla. Kiinteistö relaatio kuvaa reaalimaailman kiinteistöä. Siihen tallennetaan kiinteistön osoite ja kiinteistön yksilöivä tunnus sekä sen omistajan henkilö_id, joka viittaa Henkilö taulun HID:hen. Henkilö relaatio kuvaa rakennuksen tai kiinteistön omistajaa. Se voi olla henkilö tai yhdistys ym. Se kuvaa myös rakennuksen yhteys henkilöä eli asukasta tai muuta vastaavaa. Henkilöllä HID toimii yksilöivänä attribuuttina. HID jouduttiin tekemään, koska kaikilla kunnilla ei asiakasnumeroita ole käytössä. Asiakasnumerot halutaan kuitenkin tallentaa niiltä kunnilta, joilla tämä tieto on käytössä. Sen avulla kunta, jolla nämä tiedot on, voi käyttää niitä hyväkseen. 15
PostGIS-taulukot spatial_ref_sys ja geometry_columns ovat Mapserverin takia pakollisia. Spatial_ref_sys tauluun tallennetaan tiedot eri koordinaattijärjestelmistä. Geometry_columns taas esittää tiedot tietokannassa käytettävistä geometritaulukoista. Siinä kerrotaan, mikä on esitettävän muodon koordinaattien ulottuvuus (esim. kaksi- tai kolmiulotteinen), pisteen tyyppi (esim. piste tai viiva) sekä mitä koordinaattijärjestelmää se käyttää. 3.3 Tietokannan toteutus Tietokanta toteutettiin virtuaalipalvelimelle (lounaisproto.inoi.fi) käyttämällä SSH Secure Shell Client-ohjelmaa ja PHPadmin-työkalua. Tietokannan teko aloitettiin ottamalla yhteys virtuaalipalvelimeen lounaisproto.inoi.fi. Sinne luotiin tietokanta kiinteisto käskyllä createdb kiinteisto. Tämän jälkeen tietokantaan piti ladata PostGIS:n PL/pgsql-kielen tuki komennolla createlang plpgsql kiinteisto. Seuraavaksi käskyllä psql d kiinteisto f postgis.sql -komennolla tietokantaan ladattiin metadatataulu geometry_column sekä muita tarvittavia määrityksiä. PostGIS vaatii myös taulukon spatial_ref_sys, joka luotiin komennolla psql d kiinteisto f spatial_ref_sys.sql. Edellä mainituissa komennoissa on sql-tiedostoja, jotka tulevat PostGIS asennuksen mukana. Nämä tiedostot pitää paikantaa PostGIS-kansiosta ja niiden osoitteet on liitettävä tiedostojen eteen. Tässä työssä tiedostot oli kopioitu hakemistoon, jossa työskenneltiin. Seuraavassa vaiheessa aloitettiin nykyisen datan siirto tietokantaan. Ensimmäiseksi shapetiedostoista tehtiin sql-tiedostoja, jotta niiden siirto onnistuisi nopeasti. Shape-tiedosto muutettiin sql-tiedostoksi komennolla shp2pgsql s <epsgkoodi> <ShapeTiedosto> <Taulu> <Tietokanta> <Tiedosto>. Edellisessä komennossa <epsgkoodi> tarkoittaa käytettävää koordinaattisysteemiä. <ShapeTiedosto> on tiedosto, joka halutaan muuttaa sql-tiedostoksi. <Taulu> on taulun nimi, joka tiedostosta luodaan. <Tietokanta> on tietokanta, johon taulu luodaan. <Tiedosto> on tiedoston nimi, joka tiedostolle halutaan antaa. Seuraavassa on esimerkki miten rekisteri.shp -tiedosto muutettiin sql-tiedostoksi: shp2pgsql -s 2393 /var/www/lounaisproto/html/msdemo/workshop-5.0/data/rekisteri.shp rakennukset kiinteisto /var/www/lounaisproto/html/msdemo/workshop-5.0/data/rekisteri.sql Tämän jälkeen tiedosto ladattiin tietokantaan komennolla psql d <Tietokanta> -f <Tiedosto>. Alla on esimerkki edellä mainitusta rakennus.sql -tiedoston siirtämisestä tietokantaan: psql d <kiinteisto> -f <rekisteri.sql> Rekisteri taulu ei ollut tällaisenaan käyttökelvollinen, vaan siihen oli tehtävä muutoksia. Muutoksien teko aloitettiin luomalla uusi taulu rekisteri -taulusta. Uuden taulun nimeksi tuli rakennus ja se luotiin seuraavalla komennolla: 16
CREATE TABLE rakennus (rakennustunnus, osoite, osoite_2, vesi_toiminta_alueella, hule_toiminta_alueella, jate_toiminta_alueella, gid, kiinteistotunnus, kuntatunnus, posti_nro, x, y, the_geom) AS SELECT raken_tunn, osoite, osoite_2, vesi_toim, hule_toim, jate_toim, gid, kiint_tunn, kunta_nro, posti_nro, x, y, the_geom; Seuraavaksi lisättiin sarakkeita: begin; ALTER TABLE rakennus ADD COLUMN vesi_pvm date; ALTER TABLE rakennus ADD COLUMN hule_pvm date; ALTER TABLE rakennus ADD COLUMN jate_pvm date; ALTER TABLE rakennus ADD COLUMN vesi_hule_jate varchar(3); ALTER TABLE rakennus ADD COLUMN itse_lisatty boolean; ALTER TABLE rakennus ADD COLUMN rid serial not null primary key; ALTER TABLE rakennus ADD COLUMN henkilo_id; ALTER TABLE rakennus ADD COLUMN asiakas varchar(254); commit; Itse_lisätty -attribuutin arvoksi asetettiin oletukseksi false: UPDATE rakennus SET itse_lisatty=false; Tämän jälkeen syötettiin tarvittavia tietoja vesi_hule_jate kenttään. Tarvittavat tiedot olivat rekisteri taulussa kohdissa vesi_pvm, jate_pvm, hule_pvm. Näissä kentissä oli kirjain X merkitty kertomaan kuuluuko rakennus johonkin vesiverkostoon. Rakennus -taulun vesi_hule_jate kentän tarkoituksena on käyttää seuraavia kirjainyhdistelmiä: v = kuuluu vesiverkkoon j = kuluu jäteverkkoon h = kuluu huleverkkoon 17
vj = kuluu vesi- ja jäteverkkoon vh = kuluu vesi- ja huleverkkoon jh = kuluu jäte- ja huleverkkoon vhj = kuluu vesi-, hule- ja jäteverkkoon Kirjainyhdistelmien pitää olla edellä mainituissa järjestyksissä. Kaikkia näitä yhdistelmiä ei olemassaolevassa rekisteri -taulussa ollut, joten alla esitetyissä koodeissa ei kaikkia kirjainvariaatioita ole otettu huomioon: UPDATE rakennus SET vesi_hule_jate='h'; UPDATE rakennus SET vesi_hule_jate='v' FROM rekisteri WHERE rekisteri.vesi_pvm='x' AND gid=rid; UPDATE rakennus SET vesi_hule_jate='j' FROM rekisteri WHERE rekisteri.jate_pvm='x' AND gid=rid; UPDATE rakennus SET vesi_hule_jate='vh' FROM rekisteri WHERE rekisteri.vesi_pvm='x' AND rakennus.hule_pvm='x' AND gid=rid; UPDATE rakennus 18
SET vesi_hule_jate='vj' FROM rekisteri WHERE rekisteri.vesi_pvm='x' and rekisteri.jate_pvm='x' and gid=rid; UPDATE rakennus SET vesi_hule_jate='vhj' FROM rekisteri WHERE rekisteri.hule_pvm='x' AND rekisteri.jate_pvm='x' AND rekisteri.vesi_pvm='x' AND gid=rid; Seuraavaksi tietokantaan luotiin muut taulut: CREATE TABLE kayttaja ( tunnus character varying(10) NOT NULL, salasana character varying(10) NOT NULL, etunimi character varying(15), sukunimi character varying(15), kunta_id integer NOT NULL, osoite character varying(64) NOT NULL, postinumero integer NOT NULL, puhelin integer NOT NULL, s_posti character varying(20), admin boolean, postipaikkakunta character varying(32), PRIMARY KEY(tunnus), FOREIGN KEY (kunta_id) REFERENCE kuid ); 19
CREATE TABLE kiinteisto (KIID) AS SELECT DISTINCT kiinteistotunnus FROM rakennus; ALTER TABLE kiinteisto ADD COLUMN henkilo_id int; CREATE TABLE henkilo (nimi, asiakas_nro) AS SELECT DISTINCT asiakas, as_nro FROM rekisteri; ALTER TABLE henkilo ADD COLUMN hid int; PRIMARY KEY (hid); ALTER TABLE henkilo ADD PRIMARY KEY(hid); Joihinkin tauluihin syötettiin olemassaolevaa dataa ja muunneltiin niiden ominaisuuksia seuraavalla tavalla: UPDATE rakennus SET asiakas=rekisteri.asiakas FROM rekisteri; UPDATE rakennus SET henkilo_id=hid FROM henkilo WHERE nimi=asiakas; INSERT INTO henkilo (nimi) SELECT DISTINCT kiint_om FROM rekisteri, henkilo WHERE NOT henkilo.nimi=kiint_om; 20
ALTER TABLE rakennus ADD FOREIGN KEY (henkilo_id) REFERENCES henkilo(hid); Muutaman sarakkeen tyyppiä oli muutettava: UPDATE rakennus SET kuntatunnus=cast (kunta_nro AS int) FROM rakennus WHERE gid=rid; UPDATE rakennus SET posti_nro=cast(rekisteri.posti_nro AS int) FROM rakennus WHERE gid=rid; Lopuksi poistettiin turhia sarakkeita ja tauluja: ALTER TABLE rakennus DROP COLUMN asiakas; DROP TABLE rekisteri; 21
4 Kiinteistöliittymätyökalun toteutus Raportin neljäs luku sisältää paljon HTML-koodin, PHP-koodin ja javascript-koodin selitystä. Tässä raportissa ei kuitenkaan selitetä kaikkia Internet-koodauksen perustoimintoja, joten kyseinen luku vaatii hieman edellä mainittujen kielien perusteiden tuntemusta. 4.1 Kirjautuminen ja etusivu Kuva 2. Sisäänkirjautuminen Kiinteistöliittymään tehtiin ensimmäiseksi etusivu, joka vaatii sisäänkirjautumisen. Sivu kysyy käyttäjätunnusta ja salasanaa. Kun käyttäjä on syöttänyt tarvittavat tiedot, tarkistetaan onko käyttäjä järjestelmänvalvoja. Tästä riippuen esitetään käyttäjälle hänelle suunnattu sivusto. Mikäli käyttäjä on järjestelmänvalvoja, saa hän toistaiseksi vain muutaman lisäominaisuuden etusivulleen. Hän voi halutessaan poistaa tai lisätä käyttäjiä. Valinta tapahtuu valitsemalla linkki poista käyttäjiä tai lisää käyttäjiä. Tavalliselle kirjautujalle näkymässä on vain kartan valintaominaisuus. Raportin tekohetkellä vaihtoehtona on vain Kiinteistöliittymä. Kirjautumiskoodi löytyy jokaiselta PHP:tä tukevalta sivulta. Ensin koodissa tallennetaan käyttäjän syöttämä tieto muuttujiin $kayttajatunnus ja $salasana: $kayttajatunnus=pg_escape_string($_server['php_auth_user']); $salasana= pg_escape_string($_server['php_auth_pw']); Seuraavaksi otetaan yhteys tietokantaan, joka sijaitsee samassa osoitteessa kuin sivustokin (localhost). Tämä kohta vaatii ehdottomasti kehittämistä siltä osin, että tällä hetkellä koodissa lukee suoraan tietokannan käyttäjätunnus ja salasana (user ja password). Tämä pitäisi muuttaa siten, että käyttäjätunnus ja salasana tulevat erillisestä PHP-sivusta, johon on tallennettuna nämä tiedot tai kiinteistöliittymän käyttäjälle annetaan myös oikeudet tietokantaan. Jälkimmäinen vaihtoehto olisi tietoturvallisuuden kannalta järkevämpi. 22
// Yhdistetään tietokantaan $dbconn = pg_connect("host=localhost dbname=kiinteisto user=riku password=qwerty2008") or die('could not connect: '. pg_last_error()); Seuraavassa osassa tallennetaan kirjautuneen käyttäjän tiedot muuttujien $kayttajatunnus ja $salasana avulla tietokannasta $result muuttujaan. Tämän avulla voidaan myöhemmin tarkistaa, onko käyttäjä olemassa ja täsmäävätkö käyttäjätunnus ja salasana. // Suoritetaan SQL kysely käyttäjän varmistusta varten $query = "SELECT * FROM kayttaja WHERE tunnus='$kayttajatunnus' and salasana='$salasana'"; $result = pg_query($query) or die('query failed: '. pg_last_error()); Seuraava koodi tarkistaa, että käyttäjä on syöttänyt käyttäjätunnuksen ja salasanan. Samalla se myös etsii käyttäjän tietokannasta ja tarkistaa, että käyttäjä on tietokannassa. Tämä on toteutettu kohdassa (!pg_num_rows($result)==1). pg_num_rows($result) palauttaa tietokannasta $result - muuttujaan tallennettua riviä vastaavan rivien määrän. Mikäli jokin vaadituista ominaisuuksista ei täyty, ilmoittaa sivu sen käyttäjälle. //Tarkistetaan, että käyttäjä on syöttänyt salasanan ja käyttäjätunnuksen sekä varmistetaan, että käyttäjä on olemassa if ((!isset($kayttajatunnus)) (!isset($salasana)) (!pg_num_rows($result)==1)) { header ( 'WWW-Authenticate:Basic realm="private"' ); header ( 'HTTP/1.0 401 Unauthorized' ); echo 'SYÖTÄ KÄYTTÄJÄTUNNUS JA SALASANA'; exit; } Seuraavat kohdat määräävät, mitä järjestelmänvalvojalle näytetään. Ensin muuttujaan $admin tallennetaan tietokannan kayttaja -taulun admin -sarakkeen tieto (boolean). Tämän jälkeen tuloksesta riippuen näkyy sivustolla joko järjestelmänvalvojan sivu tai tavallisen käyttäjän sivu. Koodin tuottama sivu näkyy kuvassa 3. // Tarkastetaan onko käyttäjä järjestelmänvalvoja $admin=pg_fetch_result($result,0,"admin"); // Mikäli käyttäjä on järjestelmänvalvoja lisätään toimintoja sivuun if ($admin=="t"){ 23
} echo "Tämä on administrator ominaisuuksilla varustettu kiinteistöliittymätyökalu"; echo "<br>"; echo "<a href=http://lounaisproto.inoi.fi/msdemo/test/kayttajan_lisays.php>lisää käyttäjiä</a><br>"; echo "<a href=http://lounaisproto.inoi.fi/msdemo/test/poista_kayttaja.php>poista käyttäjiä</a>"; Kuva 3. Etusivu Etusivulla on myös piilotettuja CGI (Common Gateway Interface)-muuttujia, joita tarvitaan kiinteistöliittymätyökalun kartan esittämiseen. MapServer ymmärtää useita erilaisia muuttujia. Hyväksyttävät muuttujat löytyvät MapServerin sivustolta http://mapserver.gis.umn.edu/. root on karttapalvelun juurihakemisto. Sen kirjoittaminen muuttujaan helpottaa myöhemmin osoitteiden kirjoittamista. program -muuttujaan tallennetaan MapServerin osoite. map - muuttujaan tallennettaan esitettävän kartan map tiedoston osoite. layer -muuttuja kertoo, mitkä karttakerrokset esitetään kartassa, kun se ladataan. zoom -muuttuja kertoo, mikä on lähennyskerroin, kun kartta esitetään ensimmäisen kerran. graphicsroot -muuttujaan tallennetaan osoite, josta löytyvät kartassa esitettävät kuvat. <input type="hidden" name="root" value="/var/www/lounaisproto/html/msdemo/test"> <input type="hidden" name="program" value="/cgi-bin/mapserv"> <input type="hidden" name="map" value="/var/www/lounaisproto/html/msdemo/test/kartta.map"> <input type="hidden" name="layer" value="maa"> <input type="hidden" name="zoom" value="0"> <input type="hidden" name="graphicsroot" value="http://lounaisproto.inoi.fi/msdemo/test/graphics"> HTML-koodissa voidaan myös muokata.map-tiedostoa. Tässä työssä kartta.map -tiedoston TEMPLATE -muuttujaa WEB -osiossa muutettiin seuraavalla koodilla: 24
<select name="map_web"> <option value="template kartta.php">kiinteistöliittymä </option> </select> 4.2 Karttapalvelu Kartta.php -sivun koodi alkaa näkyvän kartan määrityksillä. Ensimmäiset kohdat on suoraan kopioitu MapServerin tutorial-koodista, jota suositellaan käyttämään. Tässä dokumentissa ei perehdytä tähän koodiin sen enempää, koska se liittyy läheisemmin MapServerin käyttöön yleisesti. Tässä dokumentissa selitetään vain koodiin tehdyt muutokset. MapServerin toimintaan ja sen käyttämään koodaukseen voi tutustua lähemmin osoitteessa: http://mapserver.gis.umn.edu/. Kuva 4. Kiinteistöliittymätyökalu Koodin alussa määritellään siis ensin kartan kehykset ja määritellään kartalle erilaisia ominaisuuksia. Muutoksia koodiin on tehty kohtaan, jossa määritellään hiiren kursorin liikkeen aiheuttamat tapahtumat. Siinä koordinaatisto on määritelty vastaamaan kartan koordinaatistoa. Hiiren kursorin liikkuessa kartan päällä laskee koodi vastaavan paikan koordinaatin ja esittää sen tekstikentissä x ja y. 25