GRASS GIS / Import z DB

Z FreeGIS portál
Přejít na: navigace, hledání

Tato stránka shrnuje poznámky, jak pracovat v systému GRASS s daty uloženými v relační databázi (např. PostgreSQL) s cílem vytvoření vektorové mapy s příslušnou atributovou tabulkou.

GRASS musí být zkompilován s podporou pro danou databázi (resp. DBMS), v našem návodu předpokládáme PostgreSQL DB driver. Další databázové ovladače, které systém GRASS podporuje jsou uvedeny zde. Zda je požadovaný formát systémem GRASS podporován lze zjistit pomocí příkazu db.drivers:

db.drivers -p
sqlite
...
pg

Poznámka: Výchozím databázovým ovladačem je pro GRASS 7 SQLite.

Příklad vytvoření bodové mapy

Předpokládejme existenci tabulky 'node', který obsahuje sloupce 'lat' a 'long' se zeměpisnými souřadnicemi bodových dat. Jednoznačný identifikátor je uložen v atributu 'nodeid'.

select nodeid,lat,long from node limit 5;
 nodeid |   lat   |  long   
--------+---------+---------
     23 |  50.069 | 14.4534
     24 | 50.0375 | 14.4848
     25 | 50.0404 | 14.4965
     26 | 50.0458 | 14.4633
     27 | 50.0404 | 14.4402

Vytvoření lokace

Předpokládejme, že jsou souřadnice bodových dat v souřadnicovém systému WGS-84 (EPSG 4326). Na základě EPSG kódu vytvoříme novou lokaci, viz návod zde.

Import dat jako bodové mapy

Vytvoření bodové mapy na základě souřadnic uložených v databázové tabulce umožňuje modul v.in.db.

v.in.db table=public.node driver=pg database=mvdb x=long y=lat key=nodeid output=nodes
Import bodových dat z databáze (první krok)
Import bodových dat z databáze (druhý krok)

Pokud není nastaveno jinak, tak geometrická složka popisu geodat je uložena v nativním formátu GRASS a popisná složka v SQLite databázi (viz obrázek níže).

Výsledná bodová mapa, ukázka dotazu na atributová data

Přepínač -t umožňuje modulu v.in.db použít jako atributovou tabulku vzniknuvší vektorové mapy přímo databázovou tabulku použitou pro import. V tomto případě je ignorován výchozí databázový ovladač a k vektorové mapě je připojena přímo databázová tabulka v tomto případě uložená v PostgreSQL (viz obrazek níže). Je nutné mít na paměti, že pokud takto vytvořenou vektorovou mapu odstraníme, tak odstraníme i tuto databázovou tabulku!

Jako atributová tabulka je použita originální databázová tabulka - v.in.db -t

Alternativní postup - geometrie v geodatabázi

Namísto importu můžete vytvořit geometrii v geodatabázi PostGIS a pomocí v.external vytvořit vektorovou mapu jako odkaz na data v PostGISu. V tomto případě obě složky popisu geodata, tj. geometrická a popisná bude uložena v geodatabázi PostGIS a nikoliv v nativním formátu GRASS.

Nejprve pomocí SQL přidáme do databázové tabuklky 'node' nový slopec pro uložení geometrie (souřadnicový systém EPSG 4326:

alter table node add column geom geometry(point, 4326);

Geometrii bodů vytvoříme ze souřadnic uložených ve sloupci 'lat' a 'long':

UPDATE node set geom = ST_SetSRID(ST_Point(long, lat), 4326);

Výsledek si otestujeme jednoduchým SQL dotazem:

SELECT lat,long,st_astext(geom) from node limit 5;
  long   |   lat   |                st_astext                 
---------+---------+------------------------------------------
 14.4534 |  50.069 | POINT(14.4533605575562 50.0689735412598)
 14.4848 | 50.0375 | POINT(14.4847640991211 50.0374908447266)
 14.4965 | 50.0404 | POINT(14.4964609146118 50.0403709411621)
 14.4633 | 50.0458 | POINT(14.463306427002 50.0458068847656)
 14.4402 | 50.0404 | POINT(14.4401760101318 50.0404357910156)

Pomocí v.external vytvoříme vektorovou mapu jako odkaz na data uložená v geodatabázi PostGIS:

Vytvoření linku na PostGIS data ve wxGUI

nebo z příkazové řádky:

v.external dsn=PG:dbname=mvdb layer=node output=nodes_pg

Odvození liniové mapy jako spojnice bodů

Předpokládejme existenci tabulku 'link', která definuje spojnici mezi body ('node'). Každá spojnice má definován počáteční bod 'fromnodeid' a koncový bod 'tonodeid'.

select linkid,fromnodeid,tonodeid from link limit 5;
 linkid | fromnodeid | tonodeid 
--------+------------+----------
     43 |         23 |       29
     44 |         29 |       23
     45 |         24 |       29
     46 |         29 |       24
     47 |         25 |       30

Na základě těchto udajů odvodíme geometrii spojnic. Nejrpve přidáme nový sloupeček s geometrií (souřadnicový systém EPSG 4326):

ALTER TABLE link add column geom geometry(linestring, 4326);

Geometrii odvodíme následovně:

update link set geom = st_makeline(n1.geom,n2.geom)
 from
 node as n1 join link as l on n1.nodeid = fromnodeid
 join
 node as n2 on n2.nodeid = tonodeid
 where
 link.linkid = l.linkid;

a zkontrolujeme následujícím SQL dotazem:

select l.linkid,st_astext(l.geom) as line,st_astext(n1.geom) as from,st_astext(n2.geom) as to
 from node as n1 join link as l on n1.nodeid = fromnodeid
 join node as n2 on n2.nodeid = tonodeid limit 1;
-[ RECORD 1 ]---------------------------------------------------------------------------
linkid | 43
line   | LINESTRING(14.4533605575562 50.0689735412598,14.4754581451416 50.0387687683105)
from   | POINT(14.4533605575562 50.0689735412598)
to     | POINT(14.4754581451416 50.0387687683105)
-[ RECORD 2 ]---------------------------------------------------------------------------
linkid | 44
line   | LINESTRING(14.4754581451416 50.0387687683105,14.4533605575562 50.0689735412598)
from   | POINT(14.4754581451416 50.0387687683105)
to     | POINT(14.4533605575562 50.0689735412598)
-[ RECORD 3 ]---------------------------------------------------------------------------
linkid | 45
line   | LINESTRING(14.4847640991211 50.0374908447266,14.4754581451416 50.0387687683105)
from   | POINT(14.4847640991211 50.0374908447266)
to     | POINT(14.4754581451416 50.0387687683105)

Link na tato data vytvoříme podobně jako u bodových dat příkazem v.external:

v.external dsn=PG:dbname=mvdb layer=link output=link_pg
Vizualizace dat PostGIS body a jejich spojnice ve wxGUI