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 geometrieobjekter. 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 med PostGIS
Measurements
Beregn arealer på bygninger
SELECT ST_Area(wkb_geometry) as areal, * FROM kursus.bygning LIMIT 10;
Beregn samlet areal af bygninger
SELECT ST_Area(ST_Union(wkb_geometry)) as m2 FROM kursus.bygning LIMIT 1000;
Beregn omkreds
SELECT
ST_Length(ST_ExteriorRing(wkb_geometry)) as omkreds,
ST_Area(wkb_geometry) as areal,
*
FROM kursus.bygning LIMIT 10;
Relations
Find adresser tæt på bygninger med underholdning (100m)
--Opret bygning med bbr info
DROP VIEW IF EXISTS kursus.bygning_bbr;
CREATE VIEW kursus.bygning_bbr AS
SELECT
row_number() over() as id
,fbyg.bygn_uuid
,fbyg.wkb_geometry
,bbrbyg.*
FROM kursus.bygning AS fbyg
JOIN kursus.CO40100t AS bbrbyg
ON (bbrbyg.bygning_id=fbyg.bygn_uuid::uuid);
--Opret et view med adresser tæt på (100 meter) biograf, teater
DROP VIEW IF EXISTS kursus.varselsbrevenaarstorfest;
CREATE OR REPLACE VIEW kursus.varselsbrevenaarstorfest AS
WITH
biograffermm AS (
SELECT
fbyg.bygn_uuid
,fbyg.wkb_geometry
,fbyg.byg_anvend_kode
FROM kursus.bygning_bbr AS fbyg --view der netop er dannet ovenfor
WHERE fbyg.byg_anvend_kode=410 -- Bygning til biograf, teater, erhvervsmæssig udstilling, bibliotek, museum, kirke o. lign
),
biograffermm100meterbuffer AS (
SELECT
bygn_uuid,
ST_Buffer(wkb_geometry,100) as geom --buffer med 100 meter
FROM biograffermm --buffer på 100 meter på bygninger
)
SELECT
row_number() over() as id,
adr.vejnavn,
adr.husnr,
adr.geometri
FROM kursus.adgangsadresser AS adr
JOIN biograffermm100meterbuffer AS buf ON
(st_intersects(adr.geometri,buf.geom)) --spatialt join på bygninger med buffer 100 -> adresser i nærheden udvælges og kan tilsendes varselsbrev
Prøv at tegne resultatet i QGIS. Vis view kursus.bygning_bbr og giv farve for 410 og resten grå.
Prøv at oprette en nye bygning (tæt på nogle andre adresser) i bygning og bbr tabel med kode 410.
Find nærmeste (nabo)adresse for hver adresse
SELECT g1.id,
g2.id,
ST_AsText(g1.geometri),
ST_AsText(g2.geometri),
ST_Distance(g1.geometri,g2.geometri)
FROM kursus.adgangsadresser AS g1
CROSS JOIN LATERAL
(
SELECT
g3.id,
g3.geometri
FROM
kursus.adgangsadresser AS g3
WHERE g1.id!=g3.id
ORDER BY g3.geometri <-> g1.geometri ASC LIMIT 1
) AS g2
ORDER BY st_distance;
--
[HANDS-ON]: Prøv selv at finde på spørgmsål, der skal besvares med SQL