PG WORKSHOP

Spatial Relationships and Measurements

Med PostGIS kan man udføre enkle og meget avancerede analyser med de mange funktioner til at spørge om spatialle "relations" mellem geomtrieobjekter. Man kan også udføre geometriske beregninger som arealer, længer, omkreds osv med "measurements funnktioner"

Det er meget vigtigt at geomtrierne er valide fordi beregninger på ugyldige geometrier kan resultere i fejlbehæftede resultater. Eksemplevis kan arealberegninger give forkerte resultater, hvis de udføres på ugyldige geometriobjekter. Derudover er det nødvendigt at geomtrierne har samme SRID (spatielt refenrencesystem) når der foretages geografiske sammenligninger (relationships). Derfor kan det være nødvendigt at reprojicere geomtrier, der ikke har samme SRID når der skal foretages analyser

Eksempler på GIS analyser er med PostGIS

Measurements

Beregn arealer på bygninger
SELECT ST_Area(wkb_geometry) as areal, * FROM tek.bygning LIMIT 10;
Beregn areal af veje
SELECT ST_Area(wkb_geometry) as m2, * FROM trafik.vejflade_samlet LIMIT 1000;
Beregn samlet areal af veje
SELECT ST_Area(ST_Union(wkb_geometry)) as m2 FROM trafik.vejflade_samlet LIMIT 1000;
Beregn længder samt antal af veje fordelt på status
SELECT count(*), status, ST_Length(ST_Union(wkb_geometry))/1000 km FROM trafik.vejregister GROUP BY status ORDER BY km;

Relations

Find veje i nærheden af skoler (100m)
SELECT DISTINCT ON  (vej.ogc_fid) vej.ogc_fid, vej.wkb_geometry FROM trafik.vejflade vej
 JOIN buf.skoler skoler ON
(st_intersects(vej.wkb_geometry, st_buffer(skoler.wkb_geometry, 100)))

Eller med en anden syntaks

WITH skoler
     AS (SELECT ST_Buffer(wkb_geometry, 100) as geom
         FROM   buf.skoler),
     veje
     AS (SELECT *
         FROM   trafik.vejflade)
SELECT DISTINCT ON (veje.ogc_fid)veje.ogc_fid,veje.vejnavn, veje.wkb_geometry --DISTNCT bruges så vi  kke får den samme vej flere gange
FROM   veje, skoler  WHERE ST_Intersects(veje.wkb_geometry, skoler.geom)
Find beboerzoner, der har grundejerforeninger
SELECT DISTINCT ON (beb.ogc_fid) beb.* FROM  trafik.beboerzone beb, trafik.grundejerforening grund WHERE ST_InterSects(beb.wkb_geometry, grund.wkb_geometry)

--

[HANDS-ON]: Prøv selv at finde på spørgmsål, der skal besvares med SQL