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;