Bild- und Dateioptimierung

Aus Geoportal

<translate>

Die Optimierung der Bilddatei hinsichtlich der Berechnung von Bildpyramiden und der Verringerung des Speichervolumens ist am einfachsten mit Hilfe von Befehlen, die an der Shell-Konsole eingegeben werden auszuführen. Der folgende Ablauf beschreibt zunächst das Erstellen und die Kontrolle der Bildpyramiden und im Anschluss das Kompressionsverfahren zur Verringerung des Speicherbedarfs.

Aufruf der Shell-Konsole

In der Statusleiste ist das Symbol Konsole Terminalprogramm anzuklicken. Es öffnet sich ein Fenster mit der Bezeichnung Befehlsfenster - Konsole. Im Terminalfenster steht der Cursor als weißes Rechteck neben der Prompt (z.B. sh-3.1$)


Komprimieren der Bilddatei

Nach der Erstellung der Bildpyramiden sollte die Bilddatei komprimiert werden. D.h. der Dateiinhalt wird durch entsprechende Algorithmen erheblich in seiner Dateigröße reduziert und ist dadurch leichter zu handhaben. Im Terminalfenster wird dazu folgender Befehl eingegeben:
gdal_translate -of "GTIFF" -co "COMPRESS=LZW" alte Pfad- und Dateibezechnung neue Pfad- und Dateibenzeichnung
Beispiel: gdal_translate -of "GTIFF" -co "COMPRESS=LZW" /home/knoppix/webgis-cd/testdaten/Schwanheim-modifiziert.tif /home/knoppix/webgis-cd/testdaten/Schwanheim-modifiziert_komp.tif
Die Befehlseingabe ist mit der Return-Taste abzuschließen. Danach wird der Komprimierungsvorgang im Terminalfenster durch Angabe der bearbeiteten prozentualen Schritte und einem abschließenden done sichtbar.
In diesem Beispiel reduziert sich die Größe der Ursprungsdatei von 172 MB auf 73 MB.

Hinweis! Die Komprimierung der Bilddatei muss vor der Erstellung der Bildpyramiden erfolgen, da ansonsten die Ergebnisse der Pyramidenbildung verloren gehen.


Erstellung der Bildpyramiden

Hinweis!: Da durch den folgenden Prozess die Bilddatei verändert wird, sollte vor Aufruf der Funktion eine Sicherungskopie der Datei erzeugt werden.
Im o.g. Terminalfenster ist folgender Befehl einzugeben:
gdaladdo -r average Dateipfad und Bezeichnung 2 4 8 16 32 64 128 256 512
wobei der Teil Dateipfad- und Bezeichnung durch die Pfadangabe und die Dateibezeichnung der Bilddatei zu ersetzten ist. Beispiel:
gdaladdo -r nearest /home/knoppix/webgis-cd/testdaten/Schwanheim-modifiziert.tif 2 4 8 16 32 64 128 256 512
Wird die Eingabe mit der Return-Taste abgeschlossen, beginnt die Funktion mit der Berechnung der Bildpyramiden und schreibt die zusätzlichen Ebenen mit den geringeren Auflösungen in die benannte Bilddatei zurück. Dies wird im Terminalfenster durch Angabe der bearbeiteten prozentualen Schritte und einem abschließenden done sichtbar. Damit ist die Erstellung der Bildpyramiden abgeschlossen.

Kontrolle der Bildpyramidenerstellung

Mit folgendem Befehl kann im Terminalfester kontrolliert werden, ob die Erstellung der Bildpyramiden erfolgreich durchgeführt wurde.
gdalinfo Dateipfad und Bezeichnung
Beispiel: gdalinfo /home/knoppix/webgis-cd/testdaten/Schwanheim-modifiziert.tif
Die angezeigten Metadaten der Bilddatei müssen jetzt die Beschreibung der Overviews beinhalten.
Beispiel: Overviews: 3129x2569, 1596x1285, 798x643, 399x322, 200x161, 100x81, 50x41, 25x21, 13x11

Bild- und Dateimanipulation

Rasterbildbereiche mit Hilfe von Vektorgeometrien ausstanzen (Clipping)

Zum Freistellen nicht relevanter Bildbereiche ist es unter Umständen sinnvoll, sich vorhandener Vektorgeometrien zu bedienen. Diese können in vielfältiger Weise vorliegen. Die Programmbibliothek GDAL ermöglicht den Zugriff auf eine Vielzahl solcher Formate.

In der Kommandozeile (Konsole, Shell bzw. Terminal) erhalten sie die Informationen zur installierten GDAL Version und die Formate die angesprochen werden können folgendermaßen :

gdalinfo --version

Sie erhalten dann beispielweise die folgende Ausgabe :

GDAL 1.11.2, released 2015/02/10

Welche Rasterformate sie bearbeiten können erfahren sie durch Eingabe von :

gdalinfo --formats

Für die Vektorformate erhalten sie die Informationen durch folgende Eingabe :

ogrinfo --formats

Im Folgenden wird dies für die Nutzung von Vektorgeometrien aus einer PostGIS Datenbank und einen ESRI Shapefile erläutert.

gdalwarp

Das Programm gdalwarp ermöglicht es mit Hilfe einer Vektorgeometrie georeferenzierte Rasterbilder auszustanzen.

Der grundsätzliche Programmaufruf bei Verwendung von GeoTiff Rastern und SHAPE Vektorgeometrien sieht folgendermaßen aus :

gdalwarp -cutline INPUT.shp INPUT.tif OUTPUT.tif


Möchten wir, dass der abgeschnittene Bereich mit einer Transparenzmaske in einem zusätzlichen Bildkanal abgeleft wird, erweitert sich die Syntax folgendermaßen :

gdalwarp -cutline INPUT.shp -crop_to_cutline -dstalpha INPUT.tif OUTPUT.tif

Alternativ besteht nun die Möglichkeit durch Filter gezielt auf eine Geometrie in einer PostGIS DB zuzugreifen. Hierzu stehen Standard SQL SELECTS in folgender Weise zur Verfügung :

gdalwarp -cutline PG:"dbname='$dbname' host='localhost' port='5432' user='$user'" -csql "select geom from $tablename where ...." -crop_to_cutline -dstalpha INPUT.tif OUTPUT.tif


Hier ein exemplarischer Workflow, für den Fall, dass sich aus den Dateinamen der Rasterbilder die Vektorgeometrie in der PostGIS Datenbank automatisiert zuordnen lässt :

#!/bin/bash

#Definition of working_directories
r_dir="$PWD"
s_dir="/home/ausbild/Daten/LK_WIL/Start_data/raster_new"
t_dir="/home/ausbild/Daten/LK_WIL/Start_data/raster_clipped"
ext_t_dir="raster_clipped/"

#Check if directories exist
if [ -d "$s_dir" ]; then
echo "OK, "$s_dir" exists"
else
mkdir "$s_dir"
fi

if [ -d "$t_dir" ]; then
echo "OK, "$t_dir" exists"
else
echo " Not existing Direction: "$t_dir
mkdir $t_dir
fi

#change directory to "s_dir"
cd "$s_dir"

#SLOPE
for line in *.tif;
do
echo $line
#Splitting Filename into variables#
IFS=. read typ gkz num num_aend art dat_typ <<< $line
new_line=($typ'.'$gkz'.'$num'.'$num_aend'.'$art'.new.'$dat_typ)
comp_line=($typ'.'$gkz'.'$num'.'$num_aend'.'$art'.comp.'$dat_typ)

echo $new_line
#clipping with GDALWARP using geom from PG Database#
gdalwarp -cutline PG:"dbname = 'WIL_2clip' host = 'localhost' port = '5432' user= 'postgres'" -csql 'select geom from public.umr_buff where gkz = '\'$gkz\'' and nummer = '$num' and nummeraend = '$num_aend'' -crop_to_cutline -dstalpha $line $comp_line
echo -e "Geclipt: $comp_line\n"
echo -e "\n"
mv $comp_line ../$ext_t_dir/$new_line
rm $comp_line
rm $new_line
done

#change directory to "t_dir"
cd "$t_dir"

for new_line in *.tif;
do
echo $new_line
#Splitting Filename into variables#
IFS=. read typ gkz num num_aend art ext dat_typ <<< $new_line
line=($typ'.'$gkz'.'$num'.'$num_aend'.'$art'.'$dat_typ)
gdal_translate -of GTiff -co TFW=YES -co COMPRESS=LZW $new_line $line
gdaladdo -r average $line 2 4 8 16 32 64 128 256 512
rm $new_line
done

for line in *.tfw;
do
IFS=. read typ gkz num num_aend art dat_typ <<< $line
wld_file=($typ'.'$gkz'.'$num'.'$num_aend'.'$art'.wld')
mv $line $wld_file
done




POSTGIS Raster

Seit der PostGIS Version 2.0 stehen Rasterfunktionen zum Speichern, Verwalten und zur Manipulation von Bilddaten zur Verfügung.

PosGIS Installation entsprechend der PostGIS Dokumentation mittels EXTENSIONS oder TEMPLATE. In der Folge muss der Raster-Support der Datenbank aktiviert werden :

SET postgis.enable_outdb_rasters TO True;
SET postgis.gdal_enabled_drivers = 'ENABLE_ALL';


In der Folge die SQL Scripte mit Rasterbezug aus /usr/share/postgresql/9.3/contrib/postgis-2.1 ausführen. In der Folge können Raster Tabellen mit dem Datentyp rast erzeugt werden.

Rasterbilder mit Funktion raster2pgsql auf der SHELL in DB einspielen. Über Wildcads (*) lassen sich auch Gruppen von Bildern in eine Tabelle laden.
Zur Syntax der Funktion siehe in der PostGIS Dokumentation, oder Duncan Golicher's Weblog

raster2pgsql -s 31466 -d -I -C -M -R -F -c -l 4 /home/ausbild/Daten/LK_WIL/Start_data/tmp/BPlan.07231008.10.0.*.tif public.raster_1008_10 | psql -d WIL_2clip -U postgres


Als User "postgres" (wenn dieser Eigentümer der entsprechenden DB ist) u.U. Clipping in VIEW erzeugen. Hierzu Postgres Interface mit

psql $dbname

starten.

Dann den VIEW erzeugen :

CREATE OR REPLACE VIEW _07231008_clip_1 AS SELECT st_clip(a.rast, st_buffer(b.geom, 1.7)) AS clip_rast,a.rid,a.filename,b.datei_bez,b.id_bplan FROM raster_1008_10 a LEFT JOIN umringe_komserv b ON a.filename = b.datei_bez WHERE b.gkz = '07231008';

In der Folge VIEW einspielen :

INSERT INTO public._07231008_clipped SELECT * FROM _07231008_clip_1;


Damit die Datenbank effizient und performant die Datentabellen nutzen und auf die Daten zugreifen kann, sind INDIZES unabdingbar. Hier die Beispiele für INDIZES und CONSTRAINTS auf Rastertabellen :

CREATE INDEX _07231001_covexrast_idx ON public._07231001_clipped USING gist (st_convexhull(rast));

ALTER TABLE _07231001_clipped ADD primary key (rid);

CREATE INDEX _07231001_idx ON _07231001_clipped USING btree( filename );

AddRasterConstraints('public._07231134_clipped'::name, 'clip_rast'::name);



In der Folge können die Datentabellen mit den geclippten Rasterbildern z.B. mit QGis visualisiert werden. </translate>