Konferenz 2006/GRASS: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
Zeile 1: | Zeile 1: | ||
=GRASS-GIS - Vektoren in der dritten Dimension= | =GRASS-GIS - Vektoren in der dritten Dimension= | ||
=Einführung in die GRASS Vektorarchitektur= | =Einführung in die GRASS Vektorarchitektur= |
Version vom 1. April 2006, 11:42 Uhr
GRASS-GIS - Vektoren in der dritten Dimension
Einführung in die GRASS Vektorarchitektur
GRASS Version 6.0
In der gute alte Zeit, in der GIS GRASS in der Version 5.0 war, mussten wir mit mehreren Beschränkungen leben:
- Man könnte nur einen Attribut zu einem Vektorobjekt zuweisen
- Die Vektordaten waren nur zweidimensionell
- Das digitalisierungs Module und andere Module waren nur text-orientiert, was ziemlich anspruchsvoll vor allem für die Anfänger war.
- Neben wirklichen Vektorobjekten - Linien, Punkten und Grenzen, gab es sich noch s.g. Sites Format -- spezielles Punktenformat
GRASS Version = 6.0
Ab Version 5.1 (Entwicklung) oder 6.0 (Stabil) disponiert GRASS einer erwachsener Vektorarchitektur [1]:
- Multi-layer heisst, dass die Vektorobjekte kann man mit mehreren Datenbanktabellen verknüpfen
- Multi-attribute bedeutet, dass man die Attribute sowohl im internen (dbf) als auch externen (MySQL, PostgreSQL, ...) Format speichern kann.
- GRASS ist eine topologisches GIS geworden, die Topologie kann bis jetzt aber nur für 2D-Objekte aufgebaut werden.
- Vektorobjekte können auch drei dimensionel dargestellt werden
In GRASS 6.x unterscheidet man folgende Vektorobjekte: Point, Line, Boundary, Centroid, Face und Kernel. Face ist ein spezielles Fall von Boundary, das zur Darstellung 3D-Objekte dienen soll. Kernel ist dann so ein Centroid für 3D-Objekte.
3D-Vektoren und wie man sie selbst machen kann
Das beste Modul, das zu Erzeugung 3D-Vektorobjekten dienen soll ist v.in.ascii:
v.in.ascii -z in=datei out=vector3d
oder
cat datei | v.in.ascii -z out=vector3d
Mit v.in.ascii kann GRASS s.g. GRASS-Ascii Format einlesen. Beispiel für eine Vektorlinie, die aus 6 Knoten besteht:
B 6 1 5958812.48844435 3400828.8422101 10 5958957.29887089 3400877.1123522 10 5959021.65906046 3400930.7458436 10 5959048.47580612 3400973.6526366 20 5959069.92920264 3401032.6494770 20 5958812.48844435 3400828.8422101 10 1 1
Ein Vektorobjekt besteht aus 3 Teilen:
B 6 1
Zeigt uns, dass es sich um eine Grenze (Boundary), die aus sechs Knoten besteht handeln wird. Die Linie wird nur eine Category haben - man kann zu diesem Objekt nur eine Attributtabelle zuweisen.
... 5958812.48844435 3400828.8422101 10 ...
Danach folgen die Zeilen mit jeweiligen Koordinaten in dem X,Y,Z Format. Die Koordinate sind durch Leerzeichen getrennt.
1 1
Die Letzte Zeilen bestimmen Objektkategorien für jeden Layer. In unserem Beispiel haben wir nur eine Kategorie pro Vektorobjekt. Mit der Zeile sagen wir also, dass die erste (und zufällig auch letzte) Objektkategorienummer eins haben soll.
Die gesamte Datei kann in GRASS eingelesen werden:
echo B 6 1 5958812.48844435 3400828.8422101 10 5958957.29887089 3400877.1123522 10 5959021.65906046 3400930.7458436 10 5959048.47580612 3400973.6526366 20 5959069.92920264 3401032.6494770 20 5958812.48844435 3400828.8422101 10 1 1 | v.in.ascii -zn out=linie3d format=standard
oder in bisschen übersichtlicher Form:
v.in.ascii -zn out=linie3d format=standard EOF B 6 1 5958812.48844435 3400828.8422101 10 5958957.29887089 3400877.1123522 10 5959021.65906046 3400930.7458436 10 5959048.47580612 3400973.6526366 20 5959069.92920264 3401032.6494770 20 5958812.48844435 3400828.8422101 10 1 1 EOF
Das Ergebnis kann man sich mit dem Modul nviz anzeigen lassen:
# Region entsprechend einstellen g.region vect=linie3d # Eine Basiskarte berechnen r.mapcalc dgm=0 # Visualisierung nviz elev=dgm vect=linie3d
Als anderes Objekt kann man sich einen Face -- 3D-Fläche herstellen:
v.in.ascii -zn out=face3d format=standard EOF F 7 1 5958812.48844435 3400828.8422101 10 5958957.29887089 3400877.1123522 10 5959021.65906046 3400930.7458436 10 5959048.47580612 3400973.6526366 20 5959069.92920264 3401032.6494770 20 5958812.48844435 3400828.8422101 10 5958812.48844435 3400828.8422101 10 1 1 EOF
Das einzige Unterschied ist, dass das erste und letzte Punkt die selben Koordinate haben müssen.
Weiteres Beispiel: Ein Haus
Es sei ein Haus-Umriss:
v.in.ascii -n out=haus format=standard EOF L 2 13.375 17.5 13.375 13.5625 L 2 13.375 13.5625 18.9375 13.5625 L 2 18.9375 13.5625 18.9375 17.3125 L 2 18.9375 17.3125 13.375 17.5 EOF g.region vect=haus d.vect haus
Man kann sich ein einfaches Skript schreiben, das die jeweilige Wände in einer dritten Dimension extrudet:
#!/bin/sh nr=1; for line in $( v.out.ascii in=$1 format=standard | \ grep [0-9]*\.[0-9]* *[0-9]*\.[0-9]* * | \ sed s/^ *\(.*\)$/\1/ | sed s/ */_/ ); do
line=$( echo $line | sed s/_/ / )
if [ $nr = 1 ]; then start=$line; nr=2; echo F 5; echo $line 0; echo $line 10; else echo $line 10; echo $line 0; echo $start 0; nr=1; fi; done
Den Output aus dem Script kann man dann über eine Rohre in v.in.ascii umleiten und dann visualisieren:
haus.sh haus | v.in.asii out=haus3d format=standard g.region vect=haus r.mapcalc dgm=0 nviz elev=dgm vect=haus3d
3D-Vektormodule im GRASS
v.extrude
v.extrude ist ein Modul, die 2D-Vektorobjekten zu 3D macht. Das Modul ist in der entwicklungs Version von GRASS ab Januar 2006 vorhanden. Die Höhe eines Objektes kann entweder fest gesetzt werden oder kann das Modul die Höhe aus der Attributtabelle nehmen.
Beispiel:
db.columns haeuser CAT HOEHE v.extrude in=haeuser out=haeuser3d elev=dem hcol=HOEHE nviz elev=dem vect=haeuser3d
v.trees3d
Das Modul erzeugt aus Punkten 3D-Bäume. Das Modul kann entweder einen allgemeinen Wald erzeugen, mit definierten Baumartmischung und durschnittliche Baumhöhe und Krokenbreite oder kann die jeweilige Parameter für jeden Baum aus einer Attributtabelle einlesen:
v.trees3d in=baeume out=baeume3d elev=dmt diam=6 height=20 hvar=3 vvar=4 hvar=20 spruce=50 beech=25 fir=25 # v.trees3d in=wald out=wald3d elev=dmt diam=6 hcol=hoehe specol=baumart hvar=3 clength=60
Das Verfahren, wie man aus einer Bestandeskarte (Polygone), die Attribute über Baumart und Baumhöhe für jeden Bestand einliest, ist wie verfolgt:
# Entsprechende Auflösung für Rasterkarten einstellen ( ~ Kronenbreite ): g.region res=6 # Vektorkarte auf Rasterkarte umwandeln v.to.rast in=bestandeskarte out=wald # Rasterkarte auf Punktenkarte umwandeln r.to.vect in=wald out=wald feature=point # Zu jedem Punkthöhe- und Baumartattribut aus der Bestandeskarte einlesen: v.what.vect vector=wald qvector=bestandeskarte column=hoehe qcolumn=hoehe v.what.vect vector=wald qvector=bestandeskarte column=baumart qcolumn=baumart # 3D-Vektorkarte erstellen: v.trees3d in=wald out=wald3d elev=dmt diam=6 hcol=hoehe specol=baumart hvar=3 clength=60
Visualisierung
NVIZ
NVIZ ist ein GRASS-Module, das zu der Visualisierung von 3D-Daten (Vektor und Raster) geeignet ist. Es ist in GRASS ab Version 5.0 vorhanden. Man kann mit NVIZ einfache Abbildungen darstellen oder ganze Animazionen erzeugen.
Paraview
Paraview ist eine Applikation, die für Visualisierung grosser Datasets geeignet ist. Es ist eine Open-Source Software, die platform unabhängig (multiplatform) programmiert ist, bei der Firma Kitware Inc. Im GRASS kann man für's Export von Raster- und Vektordaten in das VTK-Format Module v.out.vtk, r.out.vtk, r3.out.vtk benutzen.
Povray
Povray steht für The Persistence of Vision Raytracer. Es ist ein professionelles Tool, das man leider nicht ohne weiteres Studium benutzen kann. Im GRASS sind Module v.out.pov und r.out.pov vorhanden, die die Raster- und Vektordaten in das Povray-format exportieren können.
Danksagung
This article was published with support of IGA University of Agriculture and Forestry in Brno 49/2006.
Referenzen
- Blazek Radim, Neteler Markus, Micarelli Roberto: The New Grass 5.1 Vector Architecture, Open Source Free Software GIS - GRASS users conference 2002 PDF
- Pretz, Hans 2002:Grundlagen der Waldwachstumsforschung, Parey Buchverlag. Berlin, Wien, ISBN: 3-8263-3223-7, s.208
- NVIZ
- v.in.ascii
- v.out.ascii
- v.extrude
- Les-ejk: GRASS Modules
- ParaView
- Povray
- Hydrogeologie und GRASS: GRASS Modules