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);