Rastrová data¶
Podporu pro práci s rastrovými daty poskytuje PostGIS až od verze 2.0 a to v rámci rozšíření PostGIS Raster.
Poznámka
PostGIS Raster je součástí rozšíření postgis, není
potřeba ho zvlášt přidávat.
Rastrová data mohou být spravována ve dvou formách jako:
IN-DB, tj. uložena přímo v databázi anebo
OUT-OF-DB, tj. mimo databázi.
Nahraní rastrových dat do databáze¶
Podobně jako u vektorových dat, viz kapitola Dávkové nahrání dat, lze data nahrát pomocí specializovaného nástroje, který je součástí PostGISu a to raster2pgsql.
Důležité
Knihovna GDAL formát PostGIS Raster podporuje nicméně v současnosti neumožnuje konverzi dat z jiných formátu to PostGIS Raster.
Nejprve si stáhneme testovací data DMT (digitální
model terénu), soubor dekomprimujeme unzip dmt.zip.
raster2pgsql¶
Příkaz raster2pgsql funguje obdobně jako shp2pgsql pro vektorová data ve formátu Esri Shapefile. Pomocí tohoto nástroje lze rastrová data do PostGISu naimportovat v obou režimech IN-DB i OUT-OF-DB.
Režim IN-DB¶
Načtení rastrových dat pomocí raster2pgsql (IN-DB) z příkazové řádky
raster2pgsql -s 3035 dmt.tif ukol_1.dmt | psql pokusnik 2>err
Poznámka
Tento přikaz nicméně může skončit chybou typu
ERROR: invalid memory alloc request size 1073741824
která naznačuje, že máme nedostatek paměti pro import tohoto rastru.
Tento problém můžeme např. obejít parametrem -Y, který
pošle do PGDump příkaz COPY namísto INSERT.
Přidáme ještě užitečný přepínač -C, který nastaví omezení
na importovana data. Jinak by například byl ignorován souřadnicový
systém a pod.
raster2pgsql -s 3035 -Y -C dmt.tif ukol_1.dmt | psql pokusnik 2>err
Režim OUT-OF-DB¶
V tomto režimu nedochází k importu vstupních dat do PostGISu, ale pouze k vytvoření odkazu z databáze na původní data. Rastrová data jsou tedy fyzicky uložena mimo databázi.
Načtení rastrových dat pomocí raster2pgsql (OUT-OF-DB) z příkazové řádky
raster2pgsql -s 3035 -R -C `pwd`/dmt.tif ukol_1.dmt_link | psql pokusnik 2>err
Cesta k soubor musí být uplná, jinak nebude link korektní. Pomohli jsem si unixovým příkazem pwd, který vrátí cestu k aktuálnímu adresáři, ve kterém jsou umístěna importovaná data.
Základní metadata¶
V sekci raster2pgsql jsme naimportovali rastr DMT ve dvou formách jako IN-DB (tabulka ukol_1.dmt) a OUT-OF-DB (tabulka ukol_1.dmt_link).
SELECT r_table_schema,r_table_name,srid,out_db FROM raster_columns;
r_table_schema | r_table_name | srid | out_db
----------------+--------------+------+--------
ukol_1 | dmt | 3035 | {f}
ukol_1 | dmt_link | 3035 | {t}
Tabulka raster_columns ukrývá další užitečné informace.
SELECT scale_x,scale_y,blocksize_x,blocksize_y,same_alignment,
regular_blocking,num_bands,pixel_types,nodata_values,ST_AsText(extent) as extent
FROM raster_columns where r_table_name = 'dmt';
scale_x | 25
scale_y | -25
blocksize_x | 19615
blocksize_y | 11119
same_alignment | t
regular_blocking | f
num_bands | 1
pixel_types | {16BUI}
nodata_values | {65535}
extent | POLYGON((4470075 3113850,4960450 3113850,4960450 2835875,4470075 2835875,4470075 3113850))
Poznámka
Záporná hodnota scale_y naznačuje orientaci rastru ze
severu na jih.
Kde je:
|
prostorové rozlišení ve směru osy x |
|
prostorové rozlišení ve směru osy y |
|
velikost dlaždice ve směru osy x |
|
velikost dlaždice ve směru osy y |
|
všechny dlaždice mají stejné zarovnání |
|
všechny dlaždice mají stejný rozměr a nepřekrývají se |
|
počet kanálů |
|
datový typ buněk kanálů |
|
hodnota pro no-data jednotlivých kanálů |
|
minimální ohraničující obdélník datové vrstvy |
Poznámka
Porovnáme-li velikost dlaždice (blocksize_x a
blocksize_y) a velikost vstupního rastru (například
pomocí nástroje knihovny GDAL gdalinfo, tak
dojdeme, že se rastr naimportoval jako jedna dlaždice.
gdalinfo dmt.tif -noct
Pro rozdělení rastrových dat při importu do více dlaždic
slouží parametr -t (<šířka>x<výška>) programu
raster2pgsql.
Rozdělení dat do více dlaždic při importu z příkazové řádky
Velikost dlaždice zvolíme 400x400px.
raster2pgsql -s 3035 -Y -C -t 400x400 dmt.tif ukol_1.dmt_tiled | psql pokusnik 2>err
Rastr se v tomto případě naimportuje jako 1400 dlaždic.
SELECT COUNT(*) FROM ukol_1.dmt_tiled;
Příklad¶
Vejce vesmírných oblud v nadmořské výšce nad 300 metrů jsou oslabena. Využijte toho a zlikvidujte je.
Zadání¶
Určete nadmořskou výšku bodů s výskytem vajec na základě rastru DMT. Vyberte body s nadmořskou výškou větší než 300 metrů.
Řešení¶
Geometrie tabulky vesmirne_zrudnice je v systému S-JTSK (EPSG:5514), rastrová data v ETRS-89 (EPSG:3035). V rámci řešení tedy musíme počítat s transformaci dat do společného souřadnicového systému pomocí funkce ST_Transform.
-- nastavevíme cestu
SET search_path TO ukol_1, public;
SELECT v.id,ST_Value(r.rast,v.geom) FROM dmt AS r CROSS JOIN
(SELECT id,ST_Transform(geom_p, 3035) AS geom FROM vesmirne_zrudice) AS v;
-- optimalizovaná verze dotazu (dmt -> dmt_tiled)
SELECT v.id,ST_Value(r.rast,v.geom) FROM dmt_tiled AS r JOIN
(SELECT id,ST_Transform(geom_p, 3035) AS geom FROM vesmirne_zrudice) AS v ON
ST_Intersects(r.rast,v.geom);
Výsledek uložíme do nového sloupečku v tabulce vesmirne_zrudnice a vybereme body s nadmořskou výškou větší než 300 metrů.
ALTER TABLE vesmirne_zrudice ADD COLUMN vyska FLOAT;
UPDATE vesmirne_zrudice SET vyska = value FROM
(
SELECT v.id AS vid,ST_Value(r.rast,v.geom) AS value FROM dmt_tiled AS r JOIN
(SELECT id,ST_Transform(geom_p, 3035) AS geom FROM vesmirne_zrudice) AS v ON
ST_Intersects(r.rast,v.geom)
) AS v WHERE id = vid;
SELECT id FROM vesmirne_zrudice WHERE vyska > 300;