4 Harjoitus 3: PostGIS-funktiot
Harjoituksen sisältö - Harjoituksessa tutustutaan eri PostGIS-funktioihin sekä geometry- ja geography-geometriakenttien eroihin ja käyttöön.
Harjoituksen tavoite - Harjoituksen tarkoituksena on tutustua PostGIS-laajennoksen sisältöön ja sen sisältämien funktoiden dokumentaatioon sekä käyttöön.
4.0.1 Valmistautuminen
Avaa pgAdmin selaimeen ja kirjaudu sisään. Avaa Query Tool (Valitse trainingdatabase -> Ylhäältä Tools -> Query Tool). Selaimesta kannattaa avata myös PostGISin funktioiden koottu dokumentaatiosivu: linkki
4.1 3.1: PostGISin perusfunktiot geometrioiden määrittelyyn
-ST_AsWKT ja muut mahdolliset geometrioiden muodot: – Käytetään ainakin lentokenttätasoa (tai myös liikennevaylat-tasoa tai puurekisteri) tehdään uusi geometria, johon geometria kopioidaan wkb_geometry-kentästä, mutta tallennetaan maantieteelliseen koordinaatistoon ja vaikka WKT-muodossa. (ei luoda indeksiä tässä)
- ST_Distance-funktio ja projisoidut sekä maantieteelliset koordinaatit – mistä saadaan PostGISsissä tietoa geometria-kentistä (sekä CRS:stä) –lentokenttä-aineisto ja distance funktion vertailu (tässä voisi myös käyttää jo explain analyzeä)
4.1.1 Paikkatietojen metatiedot
Kaikki PostGIS-tietokannassa olevat paikkatietotaulut on rekisteröity metatieto-tauluihin:
| geography_columns | Geography-tietotyypin paikkatietotaulut |
| geometry_columns | Geometry-tietotyypin paikkatietotaulut |
| raster_columns | Rasteritietoa sisältävät paikkatietotaulut |
| raster_overviews | Yleistettyjä rasteriaineistoja sisältävät paikkatietotaulut |
4.2 Harjoitus 3.2: Geometrioiden metatiedot
Tutki geometry_columns-taulua. Mitä tietoja eri tietokentät sisältävät?
SELECT *
FROM
geometry_columns;Onko geometry_columns taulu?

4.2.1 Geometrian esitysmuodot
Tarkastellaan ensin paikkatietojen tallennusmuotoa PostGIS-paikkatietokannassa. Suorita seuraava SQL-lause:
SELECT
nimi_fi, geom
FROM kaupunginosajako;Tuloksesta nähdään, että sarakkeen wkb_geometry sisältö on koneluettavassa binäärimuodossa. Tarkista myös geometrioiden tyypit, joko geometry_columns-taulusta edeltä tai ST_GeometryType() funktiolla.
Vinkki: On mahdollista tarkastella geometrioita suoraan graafisessa käyttöliittymässä klikkaamalla pientä karttaikonia
geometriasarakkeen päällä. Mikäli aineistot ovat WGS84-koordinaattijärjestelmässä (EPSG: 4326), pgAdmin myös lisää niihin suoraan taustakartan OpenStreetMapista.
Aineistojen koordinaatistot löytyvät SRID-sarakkeesta. Yhdessä SRID-sarakkeessa voi olla vain yhden koordinaatiston metatiedot. Koordinaatit voi muuntaa paremmin ihmisluettavaan tekstimuotoon seuraavalla hakulausekkeella:
SELECT
nimi_fi, ST_AsText(geom)
FROM kaupunginosajako;4.3 Harjoitus 3.3: PostGISin perusfunktiot geometrioiden käsittelyyn
Testataan ensin Postgisin perusfunktioita, kuten ST_Centroid(), ST_Buffer() ja ST_Boundary(). Voit avata näiden dokumentaatiosivut edellä olevasta linkistä.
- Muodosta 5 metrin vyöhykkeet puurekisterin pisteiden ympärille:
SELECT ST_Buffer(geom, 5) FROM puurekisteri;
...ST_Buffer() toimii myös negatiivisilla arvoilla:
SELECT ST_Buffer(geom, -100) FROM kaupunginosajako;
...- Hae viheralueiden keskipisteet ylre_viheralueet-taulusta.
SELECT ST_Centroid(geom) FROM ylre_viheralueet;
...- Jos alue ei ole konveksi, vaan enemmänkin “vääntynyt”, ST_Centroid()-funktion antama piste ei ole välttämättä alueen sisällä. Ovatko nyt kaikki keskipisteet itse viheralueen sisällä? Voit tutkia tätä funktiolla ST_PointOnSurface(), joka on eräänlainen yleistys keskipisteelle, mutta on aina alueen sisällä. Mikä on suurin etäisyys näiden kahden pisteen välillä? Entä suurin etäisyys centroidin ja itse viheralueen välillä?
SELECT
...-- täydennä oikeat funktiot vinkkien perusteella.
-- täydennä funktioiden argumentit '...'- kohtiin
SELECT ST_Distance(<geom1>, <geom2>)
-- sorttausta jne.-- Kahden eri tyyppisen pisteen välinen ero
SELECT
fid, puiston_ni, round(ST_Distance(ST_PointOnSurface(geom), ST_Centroid(geom))::numeric, 2) as dist
FROM ylre_viheralueet
ORDER BY dist DESC
LIMIT 1
-- Centroidin ja itse geometrian ero
SELECT
fid, puiston_ni, round(ST_Distance(geom, ST_Centroid(geom))::numeric, 2) as dist
FROM ylre_viheralueet
ORDER BY dist DESC
LIMIT 1- Muodosta Helsingin kaupunginosajaon perusteella kaupungin rajat.
SELECT
...-- täydennä oikeat funktiot vinkkien perusteella.
-- täydennä funktioiden argumentit '...'- kohtiin
SELECT ST_Boundary(<yhdistelmä kaupunginosista>)SELECT
ST_Boundary(ST_Union(geom)) AS rajat
FROM kaupunginosajako; 4.4 Harjoitus 3.4: Spatiaaliset relaatiot
4.4.1 Käytettäviä funktioita
Tässä harjoituksessa voi hyödyntää ainakin näitä funktioita:
| PostGIS-funktio | Toiminta |
|---|---|
| ST_Contains(geometry A, geometry B) | Palauttaa “TOSI”, jos A sisältää B:n |
| ST_Crosses(geometry A, geometry B) | Palauttaa “TOSI”, jos A leikkaa B:tä |
| ST_Disjoint(geometry A , geometry B) | Palauttaa “TOSI”, jos geometriat eivät leikkaa toisiaan |
| ST_Distance(geometry A, geometry B) | Palauttaa geometrioiden välisen minimietäisyyden |
| ST_DWithin(geometry A, geometry B, radius) | Palauttaa “TOSI”, jos A on lähempänä B:tä kuin annettua etäisyyttä |
| ST_Equals(geometry A, geometry B) | Palauttaa “TOSI”, jos A on sama kuin B |
| ST_Intersects(geometry A, geometry B) | Palauttaa “TOSI”, jos A leikkaa B:tä |
| ST_Overlaps(geometry A, geometry B) | Palauttaa “TOSI”, jos A ja B ovat päällekkäin, mutteivät kuitenkaan toistensa sisäpuolella |
| ST_Touches(geometry A, geometry B) | Palauttaa “TOSI”, jos A:n reuna koskettaa B:tä |
| ST_Within(geometry A, geometry B) | Palauttaa “TOSI”, jos A on B:n sisäpuolella |
- Hae puut, jotka sijaitsevat tieliikenneväylien varrella (lähempänä kuin 5 m tiestä).
SELECT
...-- täydennä oikeat funktiot vinkkien perusteella.
-- täydennä funktioiden argumentit '...'- kohtiin
SELECT ...
FROM puurekisteri
JOIN liikennevaylat
ON <sopiva ST-funktio> SELECT DISTINCT p.fid, p.* FROM puurekisteri p
JOIN liikennevaylat l
ON ST_DWithin(p.geom, l.geom, 5)- Hae liikenneväylät, jotka menevät kaupunginosasta toiseen. Millä kyselyllä saisit molempien tasojen (liikennevaylat, kaupunginosajako) geometriat näkymään pgAdminissa, jotta voisit vakuuttua kyselyn palauttamien tuloksien oikeellisuudesta?
SELECT
...-- täydennä oikeat funktiot vinkkien perusteella.
-- täydennä funktioiden argumentit '...'- kohtiin
SELECT ...
FROM puurekisteri
JOIN liikennevaylat
ON <sopiva ST-funktio> SELECT a.geom FROM liikennevaylat a
JOIN kaupunginosajako b
ON ST_Crosses(a.geom, b.geom)
-- Visuaalisena apuna voidaan siis myös käyttää seuraavaa:
--SELECT ST_Union(a.geom, ST_Boundary(b.geom)) FROM liikennevaylat a
--JOIN kaupunginosajako b
--ON ST_Crosses(a.geom, b.geom)- Hae puurekisterin yksinäiset puut, eli sellaiset, jotka ovat yli 50 m päässä mistä tahansa muusta puurekisterin puusta.
SELECT
...-- täydennä oikeat funktiot vinkkien perusteella.
-- täydennä funktioiden argumentit '...'- kohtiin
SELECT ...
FROM puurekisteri
LEFT JOIN puurekisteri
WHERE ...
AND <sopiva ST-funktio>
...SELECT p1.* FROM puurekisteri p1
LEFT JOIN puurekisteri p2
ON p1.fid <> p2.fid
AND ST_DWithin(p1.geom, p2.geom, 50);