Prostorové funkce - první část
Otázky
odkaz
1. Jaká je výměra (v ha) bažin a rašelinišť ležících v lese. Kolik to je procent z celkové výměry bažin a rašelinišť? |
5743; 64% |
3. Kolik obcí v ČR leží celou svojí plochou do vzdálenosti 10 km od řeky Labe. Jaký je celkový počet obyvatel těchto obcí? |
520; 868 320 |
4. Na kolika místech kříží dálnice, rychlostní silnice či silnice 1.třídy s železnicí. Kolik z těchto křížení leží do vzdálenosti 1km od nejbližší železniční stanice? |
1165; 442 (výsledek se neshoduje s Esri ArcGIS) |
5. Jaká je výměra území (v ha), na kterých leží les či vodní plocha. Existuje území, které by odpovídalo současně oběma podmínkám? |
2 832 583; ne |
8. Jaká je výměra uzemí ČR (v km2), která leží dále než 5 km od nejbližší silnice a zároveň dále než 10 km od nejbližší železniční stanice? Na území kterých obcí leží největší z hledaných lokalit? |
18,6 km2; Modrava (TODO) |
Řešení
SET search_path TO myschema, ar, ac, public;
1. Jaká je výměra (v ha) bažin a rašelinišť ležících v lese. Kolik to je procent z celkové výměry bažin a rašelinišť? |
5743; 64% |
CREATE TEMPORARY TABLE baziny_lesy AS
SELECT st_intersection(b.geom, st_makevalid(l.geom)) AS geom
FROM ar.bazinyaraseliniste AS b
JOIN ar.lesy AS l
ON st_intersects(b.geom, l.geom);
SELECT round(sum(st_area(b.geom))/1e4)
FROM baziny_lesy AS b;
SELECT round(
sum(st_area(b.geom)) /
sum(st_area(bc.geom)) * 100
)
FROM baziny_lesy AS b, ar.bazinyaraseliniste AS bc;
3. Kolik obcí v ČR leží celou svojí plochou do vzdálenosti 10 km od řeky Labe. Jaký je celkový počet obyvatel těchto obcí? |
520; 868 320 |
WITH labe AS
(
SELECT st_buffer(geom, 10e3, 25) AS geom FROM ar.vodnitoky WHERE nazev = 'Labe'
)
SELECT count(*), sum(pocet_obyv) FROM ac.obcepolygony
WHERE objectid IN
(
SELECT distinct o.objectid FROM ac.obcepolygony AS o
JOIN labe
ON st_within(o.geom, labe.geom)
);
4. Na kolika místech kříží dálnice, rychlostní silnice či silnice 1.třídy s železnicí. Kolik z těchto křížení leží do vzdálenosti 1km od nejbližší železniční stanice? |
1165; 442 (výsledek se neshoduje s Esri ArcGIS) |
WITH silnice1 AS
(
SELECT objectid, geom FROM ar.silnice_2015 WHERE trida < 4
)
SELECT count(*) FROM
(
SELECT st_intersection(s.geom, z.geom) as geom
FROM silnice1 AS s
JOIN ar.zeleznice AS z
ON st_intersects(s.geom, z.geom)
) AS a;
vs
WITH silnice1 AS
(
SELECT objectid, geom FROM ar.silnice_2015 WHERE trida < 4
)
SELECT count(*) FROM
(
SELECT st_intersection(s.geom, z.geom) as geom
FROM silnice1 AS s
JOIN ar.zeleznice AS z
ON s.geom && z.geom
) AS a
WHERE NOT st_isempty(geom);
možné řešení
CREATE TEMPORARY TABLE s_z AS
WITH silnice1 AS
(
SELECT objectid, geom FROM ar.silnice_2015 WHERE trida < 4
)
SELECT geom FROM
(
SELECT st_intersection(s.geom, z.geom) AS geom
FROM silnice1 AS s
JOIN ar.zeleznice AS z
ON s.geom && z.geom
) AS foo
WHERE NOT st_isempty(geom);
SELECT count(*) FROM s_z;
WITH z AS
(
SELECT st_buffer(geom, 1e3) AS geom
FROM ar.zeleznicnistanice
)
SELECT count(*) FROM s_z
JOIN z
ON st_within(s_z.geom, z.geom);
vs
SELECT count(*) FROM s_z
JOIN ar.zeleznicnistanice as z
ON st_dwithin(s_z.geom, z.geom, 1e3);
vs
WITH z AS
(
SELECT st_buffer(geom, 1e3) AS geom
FROM ar.zeleznicnistanice
)
SELECT count(*) FROM (select (st_dump(geom)).geom from s_z) as s_z1
JOIN z
ON st_within(s_z1.geom, z.geom);
5. Jaká je výměra území (v ha), na kterých leží les či vodní plocha. Existuje území, které by odpovídalo současně oběma podmínkám? |
2 832 583; ne |
WITH lesy_vplochy AS
(
SELECT l.objectid, l.geom FROM ar.lesy AS l
UNION
SELECT v.objectid, v.geom FROM ar.vodniplochy AS v
)
SELECT round(sum(st_area(st_union(t.geom, t.geom)))/10e3)
FROM lesy_vplochy AS t;
výsledek se neshoduje s Esri ArcGIS
SELECT count(st_intersection(st_makevalid(l.geom), v.geom)) AS typ
FROM ar.lesy AS l
JOIN ar.vodniplochy AS v
ON st_intersects(l.geom, v.geom);
odpověď
SELECT gtyp,count(*) FROM
(
SELECT st_geometrytype(st_intersection(st_makevalid(l.geom), v.geom)) AS gtyp
FROM ar.lesy AS l
JOIN ar.vodniplochy AS v
ON st_intersects(l.geom, v.geom)
) AS foo
GROUP BY gtyp;
možné řešení
SELECT count(*) FROM
(
SELECT st_intersection(st_makevalid(l.geom), v.geom) as geom
FROM ar.lesy AS l
JOIN ar.vodniplochy AS v
ON st_intersects(l.geom, v.geom)
) AS foo
WHERE st_dimension(geom) > 1;
anebo
SELECT sum(st_area(st_intersection(st_makevalid(l.geom), v.geom))) AS typ
FROM ar.lesy AS l
JOIN ar.vodniplochy AS v
ON st_intersects(l.geom, v.geom);
8. Jaká je výměra uzemí ČR (v km2), která leží dále než 5 km od nejbližší silnice a zároveň dále než 10 km od nejbližší železniční stanice? Na území kterých obcí leží největší z hledaných lokalit? |
18,6 km2; Modrava (TODO) |
CREATE TEMPORARY TABLE s5 AS
SELECT st_union(st_buffer(geom, 5e3)) AS geom
FROM ar.silnice_2015;
CREATE TEMPORARY TABLE z10 AS
SELECT st_union(st_buffer(geom, 10e3)) AS geom
FROM ar.zeleznicnistanice;
CREATE TEMPORARY TABLE s5z10_cr AS
WITH s5z10 AS
(
SELECT st_union(s5.geom, z10.geom) AS geom
FROM s5
JOIN z10
ON s5.geom && z10.geom
)
SELECT st_difference(s.geom, s5z10.geom) as geom
FROM s5z10
JOIN ac.statpolygon AS s
ON s5z10.geom && s5z10.geom;
SELECT round(st_area(geom)::numeric/1e6, 1) FROM s5z10_cr;
WITH s5z10_max AS
(
SELECT geom FROM
(
SELECT (st_dump(geom)).geom AS geom
FROM s5z10_cr
ORDER BY st_area(geom)
) AS foo
ORDER by st_area(geom) DESC
LIMIT 1
)
SELECT naz_obec
FROM ac.obcepolygony AS o
JOIN s5z10_max AS s
ON st_overlaps(o.geom, s.geom);