RPostGIS – działamy z rastrami
We wcześniejszym poście zaprezentowaliśmy Wam jak używać biblioteki rpostgis do wczytywania i zapisu danych wektorowych do bazy PostgreSQL/PostGIS. Biblioteka ta pozwala również archiwizować dane rastrowe w bazie. Najpierw wczytajmy bibliotekę:
library(rpostgis)
Do ćwiczenia wykorzystamy Numeryczny Model Terenu wygenerowany w poprzednim poście. Wczytajmy go:
library(raster)
dem = raster("d:/GIS_in_R/uav_dem.tif")
Zdefiniujmy połączenie do naszej bazy:
con = dbConnect(drv = "PostgreSQL",user = "postgres", password = "postgres", host = "localhost", port = 5432, dbname = "postgres")
Przed przystąpieniem do dalszych działań musimy sprawdzić czy nasza baza ma zainstalowane rozszerzenie postgis_raster. Jeżeli nie, możemy z poziomu bazy inicjować rozszerzenie zapytaniem SQL:
CREATE EXTENSION postgis_raster;
Z poziomu R możemy użyć polecenia dbSendQuery z biblioteki RPostgreSQL do wysyłania zapytań:
library(RPostgreSQL)
dbSendQuery(con,"CREATE EXTENSION postgis_raster;")
W przypadku, gdy rozszerzenie istnieje funkcja dbSendQuery zwróci błąd. Można to wykorzystać do sprawdzenia czy rozszerzenie już zostało dodane do naszej bazy.
Raster do bazy zapisujemy z użyciem funkcji pgWriteRaster definiując połączenie do bazy (conn), nazwę tabeli (name) i wgrywany raster (raster):
pgWriteRast(conn = con,name = c("public","dem"),raster = dem)
Raster z bazy wczytujemy używając funkcji pgGetRaster podając połączenie do bazy (conn), nazwę tabeli (name), geometrię dla której zakresu ma zostać wczytany fragment rastra (boundary) :
dem_db = pgGetRast(conn = con,name = c("public","dem"),boundary = square)
Nasz pobrany raster wygląda tak:
plot(dem_db)