PostGIS Tutorial: Unterschied zwischen den Versionen

GISWiki - Das freie Portal für Geoinformatik (GIS)
Wechseln zu: Navigation, Suche
(Darstellung von Tabellen)
 
(210 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
= PostGIS Tutorial (Grundlagen) =
+
<big>'''PostGIS Tutorial (Grundlagen)'''</big>
  
 
[[Image:PostGIS_Tutorial_img_0.jpg]]
 
[[Image:PostGIS_Tutorial_img_0.jpg]]
 +
 +
 +
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
 +
  
 
:Version 2/2006
 
:Version 2/2006
Zeile 15: Zeile 19:
 
:Hebebrandstr. 1  
 
:Hebebrandstr. 1  
 
:22297 Hamburg  
 
:22297 Hamburg  
:E-Mail: [mailto:uwe.dalluege@rzcn.haw-hamburg.de  uwe.dalluege@rzcn.haw-hamburg.de ]
+
:E-Mail: [mailto:uwe.dalluege@hcu-hamburg.de  uwe.dalluege@hcu-hamburg.de ]
  
  
Zeile 31: Zeile 35:
  
  
== Bevor die Post abgeht ==
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
 +
 
 +
 
 +
= Bevor die Post abgeht =
  
 
PostGIS erweitert das objektrelationale Datenbankmanagementsystem [[PostgreSQL]] um GIS-Funktionalitäten, die der [[OpenGIS]] Spezifikation „[[OpenGIS Simple Features Specification For SQL]]“ folgen. PostGIS wurde von der kanadischen Firma [[Refractions Research]] entwickelt und unterliegt der [[GNU General Public License]]. Es gibt über 200 Funktionen, mit denen man z.B. räumliche Analysen durchführen oder Geometrie-Objekte bearbeiten und manipulieren kann.
 
PostGIS erweitert das objektrelationale Datenbankmanagementsystem [[PostgreSQL]] um GIS-Funktionalitäten, die der [[OpenGIS]] Spezifikation „[[OpenGIS Simple Features Specification For SQL]]“ folgen. PostGIS wurde von der kanadischen Firma [[Refractions Research]] entwickelt und unterliegt der [[GNU General Public License]]. Es gibt über 200 Funktionen, mit denen man z.B. räumliche Analysen durchführen oder Geometrie-Objekte bearbeiten und manipulieren kann.
Zeile 38: Zeile 45:
  
 
* basiert auf [[OpenGIS]] Standards
 
* basiert auf [[OpenGIS]] Standards
* unterliegt der [[GNU General Public Licence]] [http://www.gnu.org/copyleft/gpl.html http://www.gnu.org/copyleft/gpl.html]  
+
* unterliegt der [[GNU General Public Licence]] [http://www.gnu.org/copyleft/gpl.html http://www.gnu.org/copyleft/gpl.html]
 
* über 200 Funktionen zur Manipulation und Analyse geografischer Objekte
 
* über 200 Funktionen zur Manipulation und Analyse geografischer Objekte
  
Um die Funktionalität von PostGIS besser demonstrieren zu können, werden hier das Tool [[pgAdmin III]] und das Programm [[OpenJUMP]] verwendet. Mit pgAdmin III kann man unter anderem eine Verbindung zum Datenbankserver aufbauen, Datenbanken verwalten, Tabellen darstellen oder auch SQL-Anweisungen ausführen.  
+
Um die Funktionalität von PostGIS besser demonstrieren zu können, werden hier das Tool [[pgAdmin III]] und das Programm [[OpenJUMP]] verwendet. Mit pgAdmin III kann man unter anderem eine Verbindung zum Datenbankserver aufbauen, Datenbanken verwalten, Tabellen darstellen oder auch SQL-Anweisungen ausführen.
OpenJUMP ist ein Geoinformationssystem, mit dem man unter anderem auch PostGIS-Tabellen darstellen kann. Eine Beschreibung zu OpenJUMP und PostGIS-Anbindung finden Sie in dem OpenJUMP Tutorial (Grundlagen) in Kapitel 10.
+
[[OpenJUMP]] ist ein Geoinformationssystem, mit dem man unter anderem auch PostGIS-Tabellen darstellen kann. Eine Beschreibung zu [[OpenJUMP]] und PostGIS-Anbindung finden Sie in dem [[OpenJUMP Tutorial]] (Grundlagen) in Kapitel 10.
  
Dieses Tutorial setzt Grundkenntnisse in SQL und OpenJUMP voraus!
+
Dieses Tutorial setzt Grundkenntnisse in SQL und [[OpenJUMP]] voraus!
  
 
[[Kategorie:GPL]]
 
[[Kategorie:GPL]]
 +
 +
 +
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
 +
  
 
== Die pgAdmin III Oberfläche ==
 
== Die pgAdmin III Oberfläche ==
  
== Verbindung zum Datenbankserver aufbauen ==
+
=== Verbindung zum Datenbankserver aufbauen ===
  
 
Bevor wir mit PostGIS arbeiten können, müssen wir eine '''Verbindung''' zum Datenbankserver (kurz Server) aufbauen. Dazu müssen folgende Informationen bekannt sein:
 
Bevor wir mit PostGIS arbeiten können, müssen wir eine '''Verbindung''' zum Datenbankserver (kurz Server) aufbauen. Dazu müssen folgende Informationen bekannt sein:
Zeile 61: Zeile 72:
  
 
Nach dem Start von pgAdmin III klicken Sie auf den Stecker-Knopf ('''Add a connection to a server''') und stellen eine Verbindung zum Server her.
 
Nach dem Start von pgAdmin III klicken Sie auf den Stecker-Knopf ('''Add a connection to a server''') und stellen eine Verbindung zum Server her.
 +
{|
 +
|[[Image:PostGIS Tutorial - Add a connection to a server.jpg|thumb|left|608px|Add a connection to a server]]
 +
|}
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
 
  
[[Image:XXXXX|thumb|400px|left|Add a connection to a server]]
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
  
== Die Baumstruktur ==
 
  
Im linken Fenster des pgAdmin Tools wird die Baumstruktur der Datenbankserver dargestellt. In der unteren Abbildung wurde nur die Verbindung zu einem Server aufgebaut (PostGIS-Server). Unterhalb der Serverebene befindet sich die Datenbankebene (Databases). In unserem Beispiel befinden sich sieben Datenbanken, wobei wir mit der Datenbank db_s1234567 arbeiten wollen. Unterhalb der Datenbank (hier db_s1234567) befinden sich vier Ebenen mit den Bezeichnungen Casts, Languages, Schemas und Replication. Hier wird nur die Ebene Schemas beschrieben, weil sich dort unter der Ebene public unsere Tabellen (Tables) verbergen, mit denen wir arbeiten wollen.
+
=== Die Baumstruktur ===
  
[[Image:XXXXX|thumb|400px|left|Die Tabellen befinden sich unter dem Schema public]]
+
Im linken Fenster des pgAdmin Tools wird die Baumstruktur der Datenbankserver dargestellt. In der unteren Abbildung wurde nur die Verbindung zu einem Server aufgebaut (PostGIS-Server). Unterhalb der Serverebene befindet sich die Datenbankebene ([[:en:Database|Database]]s). In unserem Beispiel befinden sich sieben Datenbanken, wobei wir mit der Datenbank db_s1234567 arbeiten wollen. Unterhalb der Datenbank (hier db_s1234567) befinden sich vier Ebenen mit den Bezeichnungen '''[[:en:Cast|Cast]]s''', '''Languages''', '''[[:en:Schemas|Schemas]]''' und '''[[:en:Replication|Replication]]'''. Hier wird nur die Ebene Schemas beschrieben, weil sich dort unter der Ebene public unsere Tabellen (Tables) verbergen, mit denen wir arbeiten wollen.
  
Unter Tables findet man die eigenen Tabellen und zwei Systemtabellen von PostGIS mit den Namen geometry_columns und spatial_ref_sys. In der Tabelle geometry_columns werden die Tabellen verwaltet, die mit Hilfe von PostGIS-Funktionen erstellt wurden. In der Tabelle spatial_ref_sys stehen Projektionsparameter für die Transformation der Geometrien.
+
{|
 +
|[[Image:PostGIS Tutorial Tabellen Schema public.jpg|thumb|left|608px|Die Tabellen befinden sich unter dem Schema public]]
 +
|}
  
== Das SQL-Fenster (Query Tool) ==
+
Unter Tables findet man die eigenen Tabellen und zwei Systemtabellen von PostGIS mit den Namen '''geometry_columns''' und '''spatial_ref_sys'''.
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
In der Tabelle geometry_columns werden die Tabellen verwaltet, die mit Hilfe von PostGIS-Funktionen erstellt wurden. In der Tabelle spatial_ref_sys stehen Projektionsparameter für die [[Transformation]] der [[Geometrie]]n.
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
 
SQL-Anweisungen werden in einem separaten Fenster (Query Tool) eingegeben, das über Tools&gt;Querytool oder mit aufgerufen wird. Das Fenster teilt sich in ein EDITOR-Fenster (oberer Bereich) und ein Informationsfenster auf. Im EDITOR-Fenster können SQL-Anweisungen eingegeben, korrigiert und gespeichert werden. Im Informationsfenster stehen die Ergebnisse der Anfrage an die Datenbank. Es können ein oder mehrere SQL-Anweisungen eingegeben werden, die mit Query&gt;Execute oder über  ausgeführt werden. Alle Eingaben können über File&gt;Save as... in eine Datei gespeichert werden und mit File&gt;Open geladen werden.
 
  
[[Image:XXXXX|thumb|400px|left|SELECT-Anfrage mit Ergebnis]]
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
 +
 
 +
 
 +
=== Das SQL-Fenster (Query Tool) ===
 +
 
 +
SQL-Anweisungen werden in einem separaten Fenster (Query Tool) eingegeben, das '''über Tools&gt;Querytool''' oder mit [[Image:PgAdmin SQL Query Icon.jpg|30px|PgAdmin SQL Query Icon]] aufgerufen wird. Das Fenster teilt sich in ein EDITOR-Fenster (oberer Bereich) und ein Informationsfenster auf. Im EDITOR-Fenster können SQL-Anweisungen eingegeben, korrigiert und gespeichert werden. Im Informationsfenster stehen die Ergebnisse der Anfrage an die Datenbank. Es können ein oder mehrere SQL-Anweisungen eingegeben werden, die mit '''Query&gt;Execute''' oder über [[Image:PgAdmin SQL Execute Icon.jpg|30px|bbbbb]] ausgeführt werden. Alle Eingaben können über '''File&gt;Save as...''' in eine Datei gespeichert werden und mit '''File&gt;Open''' geladen werden.
 +
 
 +
{|
 +
|[[Image:PostGIS Tutorial SELECT-Anfrage mit Ergebnis.jpg|thumb|left|608px|SELECT-Anfrage mit Ergebnis]]
 +
|}
 +
 
 +
 
 +
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
 +
 
 +
 
 +
==Testdaten==
 +
 
 +
In [[:Image:Testdaten PostGIS Tutorial.zip|Testdaten_PostGIS_Tutorial.zip]] befindet sich eine SQL-Datei und JUMP-Dateien mit den Geometrien für die Beispiele des PostGIS Tutorials. Allerdings müssen die Layer (jml-Dateien) aus OpenJUMP in eine [[PostGIS]-Datenbank übertragen werden, um die SQL-Anweisungen nachvollziehen zu können (Siehe PostGIS-Tutorial 3.2 Erfassung von Daten).
 +
 
 +
 
 +
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
 +
 
 +
 
 +
= Funktionen zur Dateneingabe =
 +
 
 +
Mit Hilfe der PostGIS Funktionen können Geometrien erzeugt und auf bestehende Geometrien Analysen durchgeführt werden. Viele Funktionen basieren auf den '''[[OpenGIS]]''' Spezifikationen die im OpenGIS-Dokument „[[OpenGIS Simple Features Specification For SQL]]“ beschrieben sind. Anhand von Beispielen werden einige Funktionen beschrieben und angewendet. Eine vollständige Beschreibung der Funktionen befindet sich einmal im PostGIS Manual und im oben erwähnten OpenGIS-Dokument.
 +
 
 +
 
 +
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
  
== Funktionen zur Dateneingabe ==
 
  
Mit Hilfe der PostGIS Funktionen können Geometrien erzeugt und auf bestehende Geometrien Analysen durchgeführt werden. Viele Funktionen basieren auf den OpenGIS Spezifikationen die im OpenGIS-Dokument „OpenGIS Simple Features Specification For SQL“ beschrieben sind. Anhand von Beispielen werden einige Funktionen beschrieben und angewendet. Eine vollständige Beschreibung der Funktionen befindet sich einmal im PostGIS Manual und im oben erwähnten OpenGIS-Dokument.
 
 
== Geometrien ==
 
== Geometrien ==
  
Es sind drei verschiedene Basis-Geometrietypen definiert: POINT (Punkt), LINESTRING (Linienzug) und POLYGON (Fläche). Von diesen Basistypen sind vier weitere Geometrietypen abgeleitet: MULTIPOINT, MULTILINESTRING, MULTIPOLYGON und GEOMETRYCOLLECTION.  
+
Es sind drei verschiedene [[Basis-Geometrietypen]] definiert: '''POINT''' (Punkt), '''LINESTRING''' (Linienzug) und '''POLYGON''' (Fläche). Von diesen Basistypen sind vier weitere Geometrietypen abgeleitet: MULTIPOINT, MULTILINESTRING, MULTIPOLYGON und [[Geometry Collection|GEOMETRYCOLLECTION]].
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{|
Geometrietypen (Quelle: JUMP, Technical Report)
+
|[[Image:Geometrietypen.jpg|thumb|left|526px|Geometrietypen (Quelle: [[JUMP]], Technical Report)]]
Innerhalb einer Datenbanktabelle (Relation) können die Geometrien entweder im Textformat vorliegen (Well-known Text, WKT) oder im binären Format (Well-known Binary, WKB). Der Vorteil des WKT Formats liegt darin, dass mit einem einfachen Editor SQL-Statements erstellt werden können, um Geometrien zu erzeugen.
+
|}
  
Beispiel:
+
Innerhalb einer Datenbanktabelle (Relation) können die Geometrien entweder im Textformat vorliegen ('''[[Well-known Text]], [[WKT]]''') oder im binären Format ('''[[Well-known Binary]], [[WKB]''']). Der Vorteil des WKT Formats liegt darin, dass mit einem einfachen Editor [[:de:SQL|SQL]]-Statements erstellt werden können, um Geometrien zu erzeugen.
Ein Punkt (Point) wird im WKT Format wie folgt in einer Tabelle gespeichert: 'POINT ( 122.123 376.985 )'
+
  
[[Image:XXXXX|thumb|400px|left|Geometrietypen im WKT-Format (Quelle: OpenGIS Simple Features Specification for SQL)]]
 
 
  
Neben den Koordinaten muss auch das räumliche Bezugssystem (Spatial Referencing System, SRS) angegeben werden. In der Tabelle spatial_ref_sys sind Informationen über verschiedene räumliche Bezugssysteme gespeichert, die über einen Schlüssel angesprochen werden. Dieser Schlüssel wird Spatial Reference System Identifier (SRID) genannt. Z.B. haben wir für eine Gauß-Krüger Projektion im 3. Streifen einen SRID von 31467.
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
 +
 
 +
 
 +
====Beispiel====
 +
 
 +
Ein Punkt (Point) wird im [[WKT]] Format wie folgt in einer Tabelle gespeichert:
 +
 
 +
'POINT ( 122.123 376.985 )'
 +
 
 +
{|
 +
|[[Image:Geometrietypen im WKT-Format.jpg|thumb|left|630px|Geometrietypen im [[WKT]]-Format (Quelle: [[OpenGIS Simple Features Specification for SQL]])]]
 +
|}
 +
 
 +
Neben den Koordinaten muss auch das [[Räumliches Bezugssystem|räumliche Bezugssystem]] ([[gwen:Spatial Referencing System|Spatial Referencing System]], [[SRS]]) angegeben werden. In der Tabelle spatial_ref_sys sind Informationen über verschiedene räumliche Bezugssysteme gespeichert, die über einen Schlüssel angesprochen werden. Dieser Schlüssel wird '''[[Spatial Reference System Identifier]] ([[SRID]])''' genannt. Z.B. haben wir für eine [[Gauß-Krüger Projektion]] im 3. Streifen einen SRID von 31467.
 +
 
 +
 
 +
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
 +
 
  
 
== Tabelle mit Geometriespalte erstellen ==
 
== Tabelle mit Geometriespalte erstellen ==
  
Eine Tabelle kann Sachdaten und Geometriedaten enthalten. Die Tabellenspalten für die Sachdaten werden mit einer normalen SQL CREATE-Anweisung festgelegt. Die Spalte für die Geometriedaten muss mit der PostGIS-Funktion (OpenGIS) AddGeometryColumn ( ) erzeugt werden, wobei es nur eine Geometriespalte pro Tabelle geben kann. Es sind also zwei Schritte notwendig, um eine Tabelle mit einer Geometriespalte zu erzeugen:
+
Eine Tabelle kann Sachdaten und Geometriedaten enthalten. Die Tabellenspalten für die Sachdaten werden mit einer normalen '''<tt>SQL CREATE</tt>'''-Anweisung''' festgelegt. Die Spalte für die Geometriedaten muss mit der PostGIS-Funktion (OpenGIS) '''<tt>AddGeometryColumn ( )</tt>''' erzeugt werden, wobei pro select-Statement nur eine Geometriespalte angelegt werden kann. Es sind also zwei Schritte notwendig, um eine Tabelle mit einer Geometriespalte zu erzeugen:
  
* CREATE TABLE ...
+
<source lang="mysql">
* SELECT AddGeometryColumn ( ... )
+
CREATE TABLE ...
 +
SELECT AddGeometryColumn ( ... )
 +
</source>
  
== AddGeometryColumn ( ) ==
 
  
Die Funktion AddGeometryColumn ( ) kann mit verschiedenen Parametern aufgerufen werden:
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
  
AddGeometryColumn ( Schemaname, Tabellenname, Spaltenname, SRID, Geometrietyp, Dimension )
+
 
 +
=== AddGeometryColumn ( ) ===
 +
 
 +
Die Funktion '''<tt>AddGeometryColumn ( )</tt>''' kann mit verschiedenen Parametern aufgerufen werden:
 +
 
 +
AddGeometryColumn ( Schemaname, Tabellenname, Spaltenname, SRID, Geometrietyp, Dimension )
  
 
oder wenn die Tabelle im Standardschema (public) erstellt werden soll:
 
oder wenn die Tabelle im Standardschema (public) erstellt werden soll:
  
AddGeometryColumn ( Tabellenname, Spaltenname, SRID, Geometrietyp, Dimension )
+
AddGeometryColumn ( Tabellenname, Spaltenname, SRID, Geometrietyp, Dimension )
  
ParameterTypBeschreibung
+
{| {{prettytable}}
SchemanameVARCHARDas Schema, unter der die Tabelle erstellt werden soll
+
|- {{highlight1}}
TabellennameVARCHARName der Tabelle
+
!Parameter
SpaltennameVARCHARName der Geometriespalte
+
!Typ
SRIDINTEGERSpatial Reference System Identifier, z.B. 31467 für Gauß-Krüger oder -1 wenn nicht gesetzt.
+
!Beschreibung
GeometrietypVARCHARz.B. 'POINT', 'LINESTRING', 'POLYGON'
+
|----
DimensionINTEGERDimension der Punkte (2 oder 3)
+
|Schemaname
== Beispiel POINT: ==Beispiel POINT
+
|VARCHAR&nbsp;&nbsp;&nbsp;
Es soll eine Tabelle mit Bäumen erstellt werden. Die Bäume sollen als Punkt (POINT) mit einem Primärschlüssel und dem Namen gespeichert werden. Zuerst erstellen wir eine Tabelle mit der SQL-Anweisung CREATE:
+
|Das Schema, unter der die Tabelle erstellt werden soll
 +
|----
 +
|Tabellenname&nbsp;&nbsp;&nbsp;
 +
|VARCHAR
 +
|Name der Tabelle
 +
|----
 +
|Spaltenname
 +
|VARCHAR
 +
|Name der Geometriespalte
 +
|----
 +
|SRID
 +
|INTEGER
 +
|Spatial Reference System Identifier, z.B. 31467 für Gauß-Krüger oder -1 wenn nicht gesetzt.
 +
|----
 +
|Geometrietyp
 +
|VARCHAR
 +
|z.B. 'POINT', 'LINESTRING', 'POLYGON'
 +
|----
 +
|Dimension
 +
|INTEGER
 +
|Dimension der Punkte (2 oder 3)
 +
|}
  
* CREATE TABLE baeume ( ps INTEGER, name VARCHAR );
 
  
Dann erzeugen wir die Geometriespalte mit der SELECT-Anweisung und der Funktion AddGeometryColumn ( ):
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
  
* SELECT AddGeometryColumn ( 'baeume', 'geom', -1, 'POINT', 2 );
 
  
== Beispiel LINESTRING: ==
+
==== Beispiel POINT ====
  
Es soll eine Tabelle mit Straßen und Straßennamen erstellt werden. Die Straßen sollen als LINESTRING gespeichert werden.
+
Es soll eine Tabelle mit Bäumen erstellt werden. Die Bäume sollen als Punkt (POINT) mit einem Primärschlüssel und dem Namen gespeichert werden. Zuerst erstellen wir eine Tabelle mit der SQL-Anweisung '''<tt>CREATE</tt>''':
  
* CREATE TABLE strassen ( ps INTEGER, name VARCHAR );
+
<source lang="mysql">
* SELECT AddGeometryColumn ( 'strassen', 'geom', -1, 'LINESTRING', 2 );
+
CREATE TABLE baeume ( ps INTEGER, name VARCHAR );
 +
</source>
  
== Beispiel POLYGON ==
+
Dann erzeugen wir die Geometriespalte mit der '''<tt>SELECT</tt>'''-Anweisung und der Funktion '''<tt>AddGeometryColumn ( )</tt>''':
  
Es soll eine Tabelle mit Grundstücken und Eigentümern erstellt werden. Die Grundstücke werden als POLYGON gespeichert.
+
<source lang="mysql">
 +
SELECT AddGeometryColumn ( 'baeume', 'geom', -1, 'POINT', 2 );
 +
</source>
 +
 
 +
==== Beispiel LINESTRING: ====
 +
 
 +
Es soll eine Tabelle mit Straßen und Straßennamen erstellt werden. Die Straßen sollen als '''LINESTRING''' gespeichert werden.
 +
 
 +
<source lang="mysql">
 +
CREATE TABLE strassen ( ps INTEGER, name VARCHAR );
 +
SELECT AddGeometryColumn ( 'strassen', 'geom', -1, 'LINESTRING', 2 );
 +
</source>
 +
 
 +
 
 +
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
 +
 
 +
 
 +
==== Beispiel POLYGON ====
 +
 
 +
Es soll eine Tabelle mit Grundstücken und Eigentümern erstellt werden. Die Grundstücke werden als '''POLYGON''' gespeichert.
 +
 
 +
<source lang="mysql">
 +
CREATE TABLE grundstuecke ( ps INTEGER, eigentuemer VARCHAR );
 +
SELECT AddGeometryColumn ( 'grundstuecke', 'geom', -1, 'POLYGON', 2 );
 +
</source>
 +
 
 +
 
 +
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
  
* CREATE TABLE grundstuecke ( ps INTEGER, eigentuemer VARCHAR );
 
* SELECT AddGeometryColumn ( 'grundstuecke', 'geom', -1, 'POLYGON', 2 );
 
  
 
== Geometriedaten in Tabelle einfügen ==
 
== Geometriedaten in Tabelle einfügen ==
Zeile 153: Zeile 256:
 
Nachdem die Tabelle mit
 
Nachdem die Tabelle mit
  
* CREATE TABLE baeume ( ps INTEGER, name VARCHAR );
+
<source lang="mysql">
* SELECT AddGeometryColumn ( 'baeume', 'geom', -1, 'POINT', 2 );
+
CREATE TABLE baeume ( ps INTEGER, name VARCHAR );
 +
SELECT AddGeometryColumn ( 'baeume', 'geom', -1, 'POINT', 2 );
 +
</source>
  
oder
+
oder
  
* CREATE TABLE strassen ( ps INTEGER, name VARCHAR );
+
<source lang="mysql">
* SELECT AddGeometryColumn ( 'strassen', 'geom', -1, 'LINESTRING', 2 );
+
CREATE TABLE strassen ( ps INTEGER, name VARCHAR );
 +
SELECT AddGeometryColumn ( 'strassen', 'geom', -1, 'LINESTRING', 2 );
 +
</source>
  
*
 
*
 
*
 
*
 
*
 
*
 
*
 
 
oder
 
oder
  
* CREATE TABLE grundstuecke ( ps INTEGER, eigentuemer VARCHAR );
+
<source lang="mysql">
* SELECT AddGeometryColumn ( 'grundstuecke', 'geom', -1, 'POLYGON', 2 );
+
CREATE TABLE grundstuecke ( ps INTEGER, eigentuemer VARCHAR );
 +
SELECT AddGeometryColumn ( 'grundstuecke', 'geom', -1, 'POLYGON', 2 );
 +
</source>
  
erstellt wurde (siehe Kapitel 2.2.1), sollen Daten in die Tabelle geschrieben werden. Die Geometriedaten sollen im WKT-Format gespeichert werden. Dazu benötigen wir die Funktion GeometryFromText ( ).
+
erstellt wurde (siehe Kapitel 2.2.1), sollen Daten in die Tabelle geschrieben werden. Die Geometriedaten sollen im [[WKT]]-Format gespeichert werden. Dazu benötigen wir die Funktion '''<tt>GeometryFromText ( )</tt>'''.
== GeometryFromText ( ) ==
+
  
Die Funktion GeometryFromText ( ) erzeugt ein Objekt vom Typ Geometry. Die Geometriedaten werden im WKT-Format übergeben.
 
  
GeometryFromText ( text, SRID )
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
  
ParameterTypBeschreibung
 
textVARCHARGeometrie im WKT-Format, z.B. 'POINT ( 10 20 )'
 
SRIDINTEGERSpatial Reference System Identifier, z.B. 31467 für Gauß-Krüger oder -1 wenn nicht gesetzt.
 
  
== Beispiel POINT ==
+
=== GeometryFromText ( ) ===
 +
 
 +
Die Funktion '''<tt>GeometryFromText ( )</tt>''' erzeugt ein Objekt vom Typ Geometry. Die Geometriedaten werden im [[WKT]]-Format übergeben.
 +
 
 +
GeometryFromText ( text, SRID )
 +
 
 +
{| {{prettytable}}
 +
|- {{highlight1}}
 +
!Parameter
 +
!Typ
 +
!Beschreibung
 +
|----
 +
|text
 +
|VARCHAR
 +
|Geometrie im WKT-Format, z.B. 'POINT ( 10 20 )'
 +
|----
 +
|SRID
 +
|INTEGER
 +
|Spatial Reference System Identifier, z.B. 31467 für Gauß-Krüger oder -1 wenn nicht gesetzt.
 +
|}
 +
 
 +
 
 +
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
 +
 
 +
 
 +
==== Beispiel POINT ====
  
 
In die Tabelle baeume (siehe Kapitel 2.3) sollen der Primärschlüssel, der Baumname und die Koordinaten des Baumes P = ( 10, 20 ) eingefügt werden.
 
In die Tabelle baeume (siehe Kapitel 2.3) sollen der Primärschlüssel, der Baumname und die Koordinaten des Baumes P = ( 10, 20 ) eingefügt werden.
  
* INSERT INTO baeume VALUES ( 1234, 'Eiche', GeometryFromText ( 'POINT ( 10 20 )', -1 ) );
+
<source lang="mysql">
 +
INSERT INTO baeume VALUES ( 1234, 'Eiche', GeometryFromText ( 'POINT ( 10 20 )', -1 ) );
 +
</source>
  
Hinweis:
+
'''Hinweis:'''
 +
* Die Koordinaten eines Punktes sind durch ein Leerzeichen getrennt!
  
* Die Koordinaten eines Punktes sind durch ein Leerzeichen getrennt!
 
  
== Beispiel LINESTRING ==
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
  
In die Tabelle strassen (siehe Kapitel 2.3) sollen der Primärschlüssel, der Straßenname und die Koordinaten der Straßenachse P1 = ( 30, 35 ); P2 = ( 45, 57 ); P3 = ( 60, 83 ) eingefügt werden.
 
  
* INSERT INTO strassenVALUES ( 4567, 'Hofweg', GeometryFromText ( 'LINESTRING ( 30 35, 45 57, 60 83 )', -1 ) );
+
==== Beispiel LINESTRING ====
  
Hinweis:
+
In die Tabelle strassen (siehe Kapitel 2.3) sollen der Primärschlüssel, der Straßenname und die Koordinaten der Straßenachse P1 = ( 30, 35 ); P2 = ( 45, 57 ); P3 = ( 60, 83 ) eingefügt werden.
  
* Die Koordinaten eines Punktes sind durch ein Leerzeichen getrennt!  
+
<source lang="mysql">
 +
INSERT INTO strassenVALUES ( 4567, 'Hofweg', GeometryFromText ( 'LINESTRING ( 30 35, 45 57, 60 83 )', -1 ) );
 +
</source>
 +
 
 +
'''Hinweis:'''
 +
* Die Koordinaten eines Punktes sind durch ein Leerzeichen getrennt!
 
* Die Punkte sind durch Komma getrennt.
 
* Die Punkte sind durch Komma getrennt.
  
== Beispiel POLYGON ==
 
  
In die Tabelle grundstuecke (siehe Kapitel 2.3) sollen der Primärschlüssel, der Eigentümer und die Koordinaten des Grundstücks P1 = ( 75, 20 ); P2 = ( 80, 30 ); P3 = ( 90, 22 ) P4 = ( 85, 10 ); P5 = P1 = ( 75, 20 ) eingefügt werden.  
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
  
* INSERT INTO grundstueckeVALUES ( 10, 'Mayer', GeometryFromText ( 'POLYGON ( ( 75 20, 80 30, 90 22, 85 10, 75 20 ) )', -1 ) );
 
  
Hinweis:
+
==== Beispiel POLYGON ====
  
* Die Koordinaten eines Punktes sind durch ein Leerzeichen getrennt!  
+
In die Tabelle grundstuecke (siehe Kapitel 2.3) sollen der Primärschlüssel, der Eigentümer und die Koordinaten des Grundstücks P1 = ( 75, 20 ); P2 = ( 80, 30 ); P3 = ( 90, 22 ) P4 = ( 85, 10 ); P5 = P1 = ( 75, 20 ) eingefügt werden.
 +
 
 +
<source lang="mysql">
 +
INSERT INTO grundstueckeVALUES ( 10, 'Mayer', GeometryFromText ( 'POLYGON ( ( 75 20, 80 30, 90 22, 85 10, 75 20 ) )', -1 ) );
 +
</source>
 +
 
 +
'''Hinweis:'''
 +
* Die Koordinaten eines Punktes sind durch ein Leerzeichen getrennt!
 
* Die Punkte sind durch Komma getrennt.
 
* Die Punkte sind durch Komma getrennt.
* Die Koordinaten des Polygons stehen in zwei öffnenden und zwei schließenden Klammern.  
+
* Die Koordinaten des Polygons stehen in zwei öffnenden und zwei schließenden Klammern.
 +
 
 +
 
 +
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
 +
 
  
 
== Tabelle mit Geometriespalte löschen ==
 
== Tabelle mit Geometriespalte löschen ==
  
Durch die Funktion AddGeometryColumn ( ) wird eine Datenzeile in die Tabelle geometry_columns geschrieben, die Informationen für PostGIS über die neu angelegte Tabelle enthält. Würde man diese neu angelegte Tabelle mit der SQL-Anweisung DROP TABLE tabellenname löschen, würde die Systemtabelle geometry_columns nicht aktualisiert werden. Die entsprechende Datenzeile würde nicht gelöscht werden! Eine Tabelle mit einer Geometriespalte muss daher mit der Funktion DropGeometryTable ( ) gelöscht werden.
+
Durch die Funktion '''<tt>AddGeometryColumn ( )</tt>''' wird eine Datenzeile in die Tabelle '''geometry_columns''' geschrieben, die Informationen für PostGIS über die neu angelegte Tabelle enthält. Würde man diese neu angelegte Tabelle mit der SQL-Anweisung '''<tt>DROP TABLE tabellenname</tt>''' löschen, würde die '''Systemtabelle geometry_columns''' nicht aktualisiert werden. Die entsprechende Datenzeile würde nicht gelöscht werden! Eine Tabelle mit einer Geometriespalte muss daher mit der Funktion '''<tt>DropGeometryTable ( )</tt>''' gelöscht werden.
== DropGeometryTable ( ) ==
+
 
 +
 
 +
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
 +
 
 +
 
 +
=== DropGeometryTable ( ) ===
 +
 
 +
Die Funktion '''<tt>DropGeometryTable ( )</tt>''' löscht eine Tabelle mit Geometriespalte und den entsprechenden Eintrag in der Systemtabelle geometry_columns.
  
Die Funktion DropGeometryTable ( ) löscht eine Tabelle mit Geometriespalte und den entsprechenden Eintrag in der Systemtabelle geometry_columns.
+
DropGeometryTable ( Schemaname, Tabellenname )
  
DropGeometryTable ( Schemaname, Tabellenname )
 
 
oder
 
oder
DropGeometryTable ( Tabellenname )
 
  
ParameterTypBeschreibung
+
DropGeometryTable ( Tabellenname )
SchemanameVARCHARSchemaname unter der sich die Tabelle befindet
+
 
TabellennameVARCHARZu löschende Tabelle
+
{| {{prettytable}}
 +
|- {{highlight1}}
 +
!Parameter
 +
!Typ
 +
!Beschreibung
 +
|----
 +
|Schemaname
 +
|VARCHAR
 +
|Schemaname unter der sich die Tabelle befindet
 +
|----
 +
|Tabellenname
 +
|VARCHAR
 +
|Zu löschende Tabelle
 +
|}
 +
 
 +
 
 +
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
 +
 
 +
 
 +
====Beispiel====
  
Beispiel:
 
 
Die Tabelle baeume soll gelöscht werden:
 
Die Tabelle baeume soll gelöscht werden:
  
* SELECT DropGeometryTable ( 'baeume' );
+
<source lang="mysql">
 +
SELECT DropGeometryTable ( 'baeume' );
 +
</source>
  
== OpenJUMP ==
 
== Darstellung von Tabellen ==
 
  
Nachdem die Tabelle baeume mit folgenden Anweisungen erstellt und mit Daten gefüllt wurde (drei Bäume),
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
  
* CREATE TABLE baeume ( ps INTEGER, name VARCHAR );
 
* SELECT AddGeometryColumn ( 'baeume', 'geom', -1, 'POINT', 2 );
 
* INSERT INTO baeume VALUES ( 1234, 'Eiche', GeometryFromText ( 'POINT ( 10 20 )', -1 ) );
 
* INSERT INTO baeume VALUES ( 2234, 'Buche', GeometryFromText ( 'POINT ( 40 30 )', -1 ) );
 
* INSERT INTO baeume VALUES ( 3234, 'Linde', GeometryFromText ( 'POINT ( 20 40 )', -1 ) );
 
  
soll die Tabelle in OpenJUMP dargestellt werden. Eine ausführliche Beschreibung zur Konfiguration von OpenJUMP und PostGIS finden Sie im OpenJUMP Tutorial (Grundlagen) Kapitel 10.
+
= OpenJUMP =
Mit File&gt;Load Dataset(s)... erscheint ein Fenster, in dem unter Format: PostGIS Table ausgewählt werden muss, um die Maske zur Eingabe der Datenbankserverdaten zu erhalten.
+
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
== Darstellung von Tabellen ==
  
[[Image:XXXXX|thumb|400px|left|Die Tabelle baeume aus der Datenbank db_s1234567 soll geladen werden]]
+
Nachdem die Tabelle baeume mit folgenden Anweisungen erstellt und mit Daten gefüllt wurde (drei Bäume),
+
In OpenJUMP wird für jede Tabelle ein neuer Layer mit dem Namen der Tabelle erstellt, d.h. auf dem Layer baeume finden wir unsere drei Bäume wieder.
+
Mit RechtsKlick auf den Layernamen und View/Edit Attributes werden die Attribute der Tabelle baeume angezeigt.
+
  
[[Image:XXXXX|thumb|400px|left|Attribute und Geometrien der Tabelle baeume]]
+
<source lang="mysql">
 +
CREATE TABLE baeume ( ps INTEGER, name VARCHAR );
 +
SELECT AddGeometryColumn ( 'baeume', 'geom', -1, 'POINT', 2 );
 +
INSERT INTO baeume VALUES ( 1234, 'Eiche', GeometryFromText ( 'POINT ( 10 20 )', -1 ) );
 +
INSERT INTO baeume VALUES ( 2234, 'Buche', GeometryFromText ( 'POINT ( 40 30 )', -1 ) );
 +
INSERT INTO baeume VALUES ( 3234, 'Linde', GeometryFromText ( 'POINT ( 20 40 )', -1 ) );
 +
</source>
  
== Erfassung von Daten ==
+
soll die Tabelle in [[OpenJUMP]] dargestellt werden.
  
Geometrien und Sachdaten, die in OpenJUMP erfasst wurden, können in PostGIS-Tabellen gespeichert werden. Hierbei wird jeder Layer in einer eigenen Tabelle gespeichert. Eine ausführliche Beschreibung zur Konfiguration von OpenJUMP und PostGIS finden Sie im OpenJUMP Tutorial (Grundlagen) Kapitel 10.
+
Eine ausführliche Beschreibung zur Konfiguration von [[OpenJUMP]] und [[PostGIS]] finden Sie im [[OpenJUMP Tutorial]] (Grundlagen) Kapitel 10.
Um einen Layer in einer PostGIS-Tabelle speichern zu können, muss jeder Geometrie ein eindeutiger Schlüssel, z.B. der Primärschlüssel, zugeordnet werden. Mit Rechtsklick auf den Layernamen und View/Edit Schema wird das Schema für die PostGIS-Tabelle erstellt (siehe OpenJUMP Tutorial, Kapitel 6). Das Schema muss mindestens aus einem eindeutigen Schlüssel bestehen. Mit View/Edit Attributes werden die entsprechenden Sachdaten erfasst (siehe OpenJUMP Tutorial, Kapitel 7).
+
Mit '''File&gt;Load Dataset(s)...''' erscheint ein Fenster, in dem unter Format: PostGIS Table ausgewählt werden muss, um die Maske zur Eingabe der Datenbankserverdaten zu erhalten.
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{|
Schema mit Primärschlüssel (ps) des Layers Gebaeude
+
|[[Image:PostGIS Tutorial Tabelle laden b.jpg|thumb|left|591px|Die Tabelle baeume aus der Datenbank db_s1234567 soll geladen werden]]
 +
|----
 +
|[[Image:PostGIS Tutorial Tabelle laden.jpg|thumb|333px|left|Die Tabelle baeume aus der Datenbank db_s1234567 soll geladen werden]]
 +
|}
  
Vor dem Sichern der Tabelle muss der Spatial Reference System Identifier (SRID) (siehe Kapitel 2.2.1) für den zu sichernden Layer gesetzt werden. Mit Rechtsklick Layername&gt;Change SRID wird der Wert gesetzt.
+
In [[OpenJUMP]] wird für jede Tabelle ein neuer Layer mit dem Namen der Tabelle erstellt, d.h. auf dem Layer baeume finden wir unsere drei Bäume wieder.
 +
Mit RechtsKlick auf den Layernamen und '''View/Edit Attributes''' werden die Attribute der Tabelle baeume angezeigt.
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{|
 +
|[[Image:PostGIS Tutorial Attribute und Geometrien der Tabelle baeume.jpg|thumb|left|591px|Attribute und Geometrien der Tabelle baeume]]
 +
|}
  
Mit File&gt;Save dataset as... wird der markierte Layer in einer PostGIS-Tabelle gesichert.
 
Hinter Unique Column: steht der Spaltenname des Primärschlüssels (hier ps). Der zu sichernde Layername wird hinter Table: eingegeben (hier gebaeude).
 
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
 
Layer gebaeude in einer PostGIS-Tabelle sichern
 
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
== Erfassung von Daten ==
  
Tabelle gebaeude in der Datenbank db_s1234567
+
Geometrien und Sachdaten, die in [[OpenJUMP]] erfasst wurden, können in PostGIS-Tabellen gespeichert werden. Hierbei wird jeder Layer in einer eigenen Tabelle gespeichert. Eine ausführliche Beschreibung zur Konfiguration von [[OpenJUMP]] und PostGIS finden Sie im [[OpenJUMP Tutorial]] (Grundlagen) Kapitel 10.
  
== Sichten (Views) ==
+
Um einen Layer in einer PostGIS-Tabelle speichern zu können, muss jeder Geometrie ein eindeutiger Schlüssel, z.B. der Primärschlüssel, zugeordnet werden. Mit Rechtsklick auf den Layernamen und '''View/Edit Schema''' wird das [[:de:Schema|Schema]] für die PostGIS-Tabelle erstellt (siehe [[OpenJUMP Tutorial]], Kapitel 6). Das Schema muss mindestens aus einem eindeutigen Schlüssel bestehen. Mit '''View/Edit Attributes''' werden die entsprechenden Sachdaten erfasst (siehe [[OpenJUMP Tutorial]], Kapitel 7).
== Grundlagen ==
+
  
In den bisherigen Beispielen wurden alle Datensätze einer Tabelle in OpenJUMP dargestellt. Es wurden z.B. alle Bäume der Tabelle baeume oder alle Gebäude der Tabelle gebaeude auf jeweils einem Layer dargestellt. Für eine sinnvolle Analyse ist das nicht ausreichend! Man möchte z.B. nur die Eichen sehen oder nur die Gebäude, die Herrn oder Frau Mayer gehören. Vielleicht möchte man auch alle Eichen sehen, die auf dem Grundstück von Frau Schulze stehen. In diesem Fall benötigt man Daten aus zwei oder mehreren Tabellen. Es soll also nur eine bedingte Sicht (View) auf die Tabellen dargestellt werden! Mit der SQL-Anweisung CREATE VIEW ... werden solche Sichten erstellt. Das Beispiel bezieht sich auf die Tabelle baeume (siehe Kapitel 3.1).
+
{|
 +
|[[Image:PostGIS Tutorial Schema mit Primärschlüssel (ps) des Layers Gebaeude.jpg|thumb|left|591px|Schema mit Primärschlüssel (ps) des Layers Gebaeude]]
 +
|}
  
Beispiel:
+
Vor dem Sichern der Tabelle muss der [[Spatial Reference System Identifier]] ([[SRID]]) (siehe Kapitel 2.2.1) für den zu sichernden Layer gesetzt werden. Mit Rechtsklick '''Layername&gt;Change SRID''' wird der Wert gesetzt.
  
CREATE VIEW v_baeume ( Baumnamen ) AS
+
{|
SELECT name, geom FROM baeume
+
|[[Image:PostGIS Tutorial Change SRID.jpg|thumb|left|206px|Change SRID]]
WHERE name = 'Eiche';
+
|}
  
v_baeume= Name der Sicht; das Präfix v_ dient nur zur besseren Unterscheidung.
+
Mit '''File&gt;Save dataset as...''' wird der markierte Layer in einer PostGIS-Tabelle gesichert.
( Baumname )= Spaltenname der ersten Spalte in der Sicht. Hier können mehrere Namen durch Komma  getrennt stehen.
+
Hinter '''Unique Column:''' steht der Spaltenname des Primärschlüssels (hier ps). Der zu sichernde Layername wird hinter Table: eingegeben (hier gebaeude).
name= Spaltenname aus der Tabelle baeume
+
geom = Spaltenname der Geometriespalte der Tabelle baeume
+
  
In diesem Beispiel wird eine Sicht mit dem Namen v_baeume auf die Tabelle baeume erstellt, wo nur die Eichen von Interesse sind. Um die Tabelle in OpenJUMP darstellen zu können, darf natürlich die Geometriespalte (hier geom) hinter der SELECT-Anweisung der Sicht nicht fehlen. Die Sicht v_baeume kann man mit der SELECT-Anweisung anzeigen:
+
{|
 +
|[[Image:PostGIS Tutorial Tabelle speichern a.jpg|thumb|left|591px|Layer gebaeude in einer PostGIS-Tabelle sichern]]
 +
|[[Image:PostGIS Tutorial Tabelle speichern b.jpg|thumb|left|377px|Layer gebaeude in einer PostGIS-Tabelle sichern]]
 +
|}
  
SELECT * FROM v_baeume;
+
{|
 +
|[[Image:PostGIS Tutorial Tabelle gebaeude in der Datenbank db s1234567.jpg|thumb|left|591px|Tabelle gebaeude in der Datenbank db_s1234567]]
 +
|}
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
 
Ergebnis der SELECT-Anfrage auf die Sicht v_baeume
 
  
Es wird nur ein Datensatz (Tupel) angezeigt, weil die Tabelle baeume nur eine Eiche enthält!
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
== Sichten in pgAdmin III ==
+
  
In pgAdmin III tauchen die Sichten (Views) nicht unter Tables, sondern unter Views auf:
 
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
= Sichten (Views) =
Die Sicht v_baeume unter der Ebene Views
+
  
== Sichten in OpenJUMP darstellen ==
+
== Grundlagen ==
  
Sichten mit einer Geometriespalte können in OpenJUMP nur dargestellt, aber nicht erzeugt werden. Zur Darstellung muss nur in der Eingabemaske Load Dataset(s) anstelle des Tabellennamens der Name der Sicht eingegeben werden. In unserem Beispiel sehen wir dann nur eine einsame Eiche!
+
In den bisherigen Beispielen wurden alle Datensätze einer Tabelle in [[OpenJUMP]]] dargestellt. Es wurden z.B. alle Bäume der Tabelle baeume oder alle Gebäude der Tabelle gebaeude auf jeweils einem Layer dargestellt. Für eine sinnvolle Analyse ist das nicht ausreichend! Man möchte z.B. nur die Eichen sehen oder nur die Gebäude, die Herrn oder Frau Mayer gehören. Vielleicht möchte man auch alle Eichen sehen, die auf dem Grundstück von Frau Schulze stehen. In diesem Fall benötigt man Daten aus zwei oder mehreren Tabellen. Es soll also nur eine bedingte Sicht (View) auf die Tabellen dargestellt werden! Mit der SQL-Anweisung '''<tt>CREATE VIEW</tt>''' ...''' werden solche '''Sichten''' erstellt. Das Beispiel bezieht sich auf die Tabelle baeume (siehe Kapitel 3.1).
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
 
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
Einsame Eiche der Sicht v_baeume
+
  
== Verbund von Tabellen (Join) ==
 
  
Bisher wurden die Sachdaten und Geometrien in einem Datensatz (Tupel) zusammengefasst. Zu jeder Geometrie eines Gebäudes oder Grundstücks wurde z.B. der Eigentümer gespeichert. Besitzt ein Eigentümer mehrere Häuser oder Grundstücke, taucht der Name und die Adresse des Eigentümers mehrfach in unserer Tabelle auf. Die Eigentümerdaten sind redundant! Ändert sich z.B. die Adresse eines Eigentümers der mehrere Grundstücke besitzt, müssen alle Datensätze des Eigentümers geändert werden, was zu Fehlern führen kann. Wird ein Datensatz übersehen, ist die Tabelle inkonsistent.
+
====Beispiel====
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
<source lang="mysql">
Die Firma GlobalPlayer besitzt 2 Grundstücke
+
CREATE VIEW v_baeume ( Baumnamen ) AS
 +
SELECT name, geom FROM baeume
 +
WHERE name = 'Eiche';
 +
</source>
  
Sinnvoller wäre es, die Eigentümerdaten in einer Tabelle abzulegen und die Geometrien in einer zweiten Tabelle.
+
'''v_baeume''' = Name der Sicht; das Präfix v_ dient nur zur besseren Unterscheidung.
 +
'''( Baumname )''' = Spaltenname der ersten Spalte in der Sicht.
 +
  Hier können mehrere Namen durch Komma  getrennt stehen.
 +
'''name''' = Spaltenname aus der Tabelle baeume
 +
'''geom''' = Spaltenname der Geometriespalte der Tabelle baeume
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
In diesem Beispiel wird eine Sicht mit dem Namen v_baeume auf die Tabelle baeume erstellt, wo nur die Eichen von Interesse sind. Um die Tabelle in [[OpenJUMP]] darstellen zu können, darf natürlich die Geometriespalte (hier geom) hinter der '''<tt>SELECT</tt>'''-Anweisung der Sicht nicht fehlen. Die Sicht v_baeume kann man mit der '''<tt>SELECT</tt>'''-Anweisung anzeigen:
Eigentümertabelle ohne Geometrien (eigentuemer_nor)
+
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
<source lang="mysql">
Grundstückstabelle ohne direkte Eigentümer (grund_fs_nor)
+
SELECT * FROM v_baeume;
 +
</source>
  
Die Verknüpfung der beiden Tabellen erfolgt über Primär- (ps) und Fremdschlüssel (fs). Die Tabelle mit den Geometrien enthält als Fremdschlüssel den Primärschlüssel der Eigentümertabelle. Die Firma GlobalPlayer (ps = 30 der Eigentümertabelle) besitzt demnach 2 Grundstücke ( ps = 100 und 300 der Grundstückstabelle)!
+
{|
Sollen alle Grundstücke und die dazugehörigen Eigentümer aufgelistet werden, müssen beide Tabellen verbunden werden (join):
+
|[[Image:PostGIS Tutorial Ergebnis der SELECT-Anfrage auf die Sicht v baeume.jpg|thumb|left|351px|Ergebnis der SELECT-Anfrage auf die Sicht v_baeume]]
 +
|}
  
* SELECT e.name, e.ort, g.geom
+
Es wird nur ein Datensatz ([[:de:Tupel|Tupel]]) angezeigt, weil die Tabelle baeume nur eine Eiche enthält!
  
FROM eigentuemer_nor AS e, grund_fs_nor AS g
 
WHERE e.ps = g.fs;
 
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
Ergebnis der SELECT-Anfrage
+
  
Sollen diese Grundstücke in OpenJUMP dargestellt werden, muss eine Sicht (View; siehe Kapitel 4) erstellt werden:
 
  
* CREATE VIEW v_eigen_fs_nor ( name, ort, telef, geom ) AS
+
== Sichten in pgAdmin III ==
  
SELECT e.name, e.ort, e.telef, g.geom
+
In [[:de:pgAdmin III]] tauchen die Sichten (Views) nicht unter Tables, sondern unter Views auf:
FROM eigentuemer_nor AS e, grund_fs_nor AS g
+
WHERE e.ps = g.fs;
+
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{|
Alle Grundstücke mit Eigentümer
+
|[[Image:PostGIS Tutorial Die Sicht v baeume unter der Ebene Views.jpg|thumb|left|591px|Die Sicht v_baeume unter der Ebene Views]]
Sollen nur die Grundstücke der Firma GlobalPlayer dargestellt werden, muss noch eine Bedingung an die SELECT-Anweisung angehängt werden (AND e.name = 'GlobalPlayer'):
+
|}
  
* CREATE VIEW v_eigen_glob__fs_nor ( name, ort, telef, geom ) AS
 
  
SELECT e.name, e.ort, e.telef, g.geom
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
FROM eigentuemer_nor AS e, grund_fs_nor AS g
+
WHERE e.ps = g.fs AND e.name = 'GlobalPlayer';
+
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
 
Die Grundstücke der Firma GlobalPlayer
 
  
== Analysefunktionen ==
+
== Sichten in [[OpenJUMP]] darstellen ==
== Allgemeines ==
+
  
Die Geometrien für die folgenden Beispiele wurden mit Hilfe von OpenJUMP erstellt. Hierzu wurde eine DGK5 von Norderstedt als Digitalisierungsvorlage verwendet.
+
Sichten mit einer Geometriespalte können in [[OpenJUMP]] nur dargestellt, aber nicht erzeugt werden. Zur Darstellung muss nur in der Eingabemaske Load [[:en:Dataset|Dataset]](s) anstelle des Tabellennamens der Name der Sicht eingegeben werden. In unserem Beispiel sehen wir dann nur eine einsame Eiche!
Diese Karte wird von einem WMS-Server mit der URL
+
http://gis.rzcn.haw-hamburg.de/cgi-bin/mapserv.exe?map=/mapserver/wms/htdocs/norderstedt.map
+
zur Verfügung gestellt.
+
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{|
Rasterkarte als Digitalisierungsvorlage
+
|[[Image:PostGIS Tutorial Einsame Eiche der Sicht v baeume a.jpg|thumb|left|591px|Einsame Eiche der Sicht v_baeume]]
 +
|[[Image:PostGIS Tutorial Tabelle laden.jpg|thumb|left|333px|Einsame Eiche der Sicht v_baeume]]
 +
|}
  
== Längenberechnung Length ( ) ==
 
  
Die Funktion Length ( ) berechnet die Länge eines Linienzuges (LineString).
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
  
Length ( Linestring ) : Double Precision
 
  
Parameter TypBeschreibung
+
= Verbund von Tabellen (Join) =
LinestringGEOMETRYLinienzug
+
  
Beispiel :
+
Bisher wurden die Sachdaten und Geometrien in einem Datensatz (Tupel) zusammengefasst. Zu jeder Geometrie eines Gebäudes oder Grundstücks wurde z.B. der Eigentümer gespeichert. Besitzt ein Eigentümer mehrere Häuser oder Grundstücke, taucht der Name und die Adresse des Eigentümers mehrfach in unserer Tabelle auf. Die Eigentümerdaten sind [[:de:Redundanz|redundant]]! Ändert sich z.B. die Adresse eines Eigentümers der mehrere Grundstücke besitzt, müssen alle Datensätze des Eigentümers geändert werden, was zu Fehlern führen kann. Wird ein Datensatz übersehen, ist die Tabelle inkonsistent.
  
Gegeben: Tabelle strassen_nor mit vier Straßen:
+
{|
 +
|[[Image:PostGIS Tutorial Die Firma GlobalPlayer besitzt 2 Grundstücke.jpg|thumb|left|409px|Die Firma GlobalPlayer besitzt 2 Grundstücke]]
 +
|}
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
Sinnvoller wäre es, die Eigentümerdaten in einer Tabelle abzulegen und die Geometrien in einer zweiten Tabelle.
Tabelle strassen_nor
+
  
Gesucht:  
+
{|
 +
|[[Image:PostGIS Tutorial Eigentümertabelle ohne Geometrien (eigentuemer nor).jpg|thumb|left|442px|Eigentümertabelle ohne Geometrien (eigentuemer_nor)]]
 +
|}
  
* Die Straßenlänge jeder Straße.
+
{|
* Die Gesamtlänge aller Straßen.
+
|[[Image:PostGIS Tutorial Grundstückstabelle ohne direkte Eigentümer (grund fs nor).jpg|thumb|left|367px|Grundstückstabelle ohne direkte Eigentümer (grund_fs_nor)]]
* View mit Straßennamen, Längen und Geometrien (siehe auch Kapitel 4).  
+
|}
  
Lösung 1:
+
Die Verknüpfung der beiden Tabellen erfolgt über [[:de:Primärschlüssel|Primär]]- (ps) und [[:de:Fremdschlüssel|Fremdschlüssel]] (fs). Die Tabelle mit den Geometrien enthält als Fremdschlüssel den Primärschlüssel der Eigentümertabelle. Die Firma GlobalPlayer (ps = 30 der Eigentümertabelle) besitzt demnach 2 Grundstücke ( ps = 100 und 300 der Grundstückstabelle)!
 +
Sollen alle Grundstücke und die dazugehörigen Eigentümer aufgelistet werden, müssen beide Tabellen verbunden werden (join):
  
* SELECT name, Length ( geom ) AS laenge FROM strassen_nor;
+
<source lang="mysql">
 +
SELECT e.name, e.ort, g.geom
 +
FROM eigentuemer_nor AS e, grund_fs_nor AS g
 +
WHERE e.ps = g.fs;
 +
</source>
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{|
Berechnete Straßenlängen
+
|[[Image:PostGIS Tutorial Ergebnis der SELECT-Anfrage.jpg|thumb|left|489px|Ergebnis der SELECT-Anfrage]]
 +
|}
  
Lösung 2:
+
Sollen diese Grundstücke in [[OpenJUMP]] dargestellt werden, muss eine Sicht (View; siehe Kapitel 4) erstellt werden:
  
* SELECT Sum ( Length ( geom ) ) AS gesamtlaenge FROM strassen_nor;
+
<source lang="mysql">
 +
CREATE VIEW v_eigen_fs_nor ( name, ort, telef, geom ) AS
 +
SELECT e.name, e.ort, e.telef, g.geom
 +
FROM eigentuemer_nor AS e, grund_fs_nor AS g
 +
WHERE e.ps = g.fs;
 +
</source>
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{|
Gesamtlänge aller Straßen in der Tabelle
+
|[[Image:PostGIS Tutorial Alle Grundstücke mit Eigentümer.jpg|thumb|left|591px|Alle Grundstücke mit Eigentümer]]
 +
|}
  
Lösung 3:
+
Sollen nur die Grundstücke der Firma GlobalPlayer dargestellt werden, muss noch eine Bedingung an die '''<tt>SELECT</tt>'''-Anweisung angehängt werden ('''<tt>AND e.name = 'GlobalPlayer'</tt>'''):
  
* CREATE VIEW v_strassen_nor_laenge ( Name, Laenge) AS
+
<source lang="mysql">
SELECT name, Length ( geom ), geom FROM strassen_nor;
+
CREATE VIEW v_eigen_glob__fs_nor ( name, ort, telef, geom ) AS
 +
SELECT e.name, e.ort, e.telef, g.geom
 +
FROM eigentuemer_nor AS e, grund_fs_nor AS g
 +
WHERE e.ps = g.fs AND e.name = 'GlobalPlayer';
 +
</source>
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{|
View v_strassen_nor_laenge in OpenJUMP
+
|[[Image:PostGIS Tutorial Die Grundstücke der Firma GlobalPlayer.jpg|thumb|left|591px|Die Grundstücke der Firma GlobalPlayer]]
== Abstand Distance ( )  ==
+
|}
  
Die Funktion Distance ( ) berechnet den Abstand zwischen zwei Geometrien.
 
  
Distance ( geom1, geom2 ) : Double Precision
+
'''Source(s):'''  [http://downloadranking.com/support.php  GIS Lösungen]
  
ParameterTypBeschreibung
 
geom1GEOMETRY erste Geometrie
 
geom2GEOMETRY zweite Geometrie
 
  
Beispiel: Von der Schule Lütjenmoor sollen die Entfernungen zu den Haltestellen ermittelt werden.
+
= Analysefunktionen =
  
Gegeben: Die Tabelle schulen_nor mit den Schulen und die Tabelle haltestellen_nor mit den Haltestellen.
+
== Allgemeines ==
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
Die Geometrien für die folgenden Beispiele wurden mit Hilfe von [[OpenJUMP]] erstellt. Hierzu wurde eine DGK5 von Norderstedt als Digitalisierungsvorlage verwendet.
Tabelle schulen_nor
+
Diese Karte wird von einem [[WMS]]-Server mit der URL
 +
http://gis.rzcn.haw-hamburg.de/cgi-bin/mapserv.exe?map=c:/mapserver/wms/htdocs/norderstedt.map
 +
zur Verfügung gestellt.
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{|
Tabelle haltestellen_nor
+
|[[Image:PostGIS Tutorial Rasterkarte als Digitalisierungsvorlage.jpg|thumb|left|591px|Rasterkarte als Digitalisierungsvorlage]]
 +
|}
  
Gesucht: Die Entfernungen der Haltestellen zur Schule Lütjenmoor.
+
== Längenberechnung Length ( ) ==
Lösung:
+
  
* SELECT s.name, h.linie, Distance ( s.geom, h.geom ) AS entfernung
+
Die Funktion '''<tt>Length ( )</tt>''' berechnet die Länge eines Linienzuges (LineString).
  
FROM schulen_nor AS s, haltestellen_nor AS h
+
Length ( Linestring ) : Double Precision
WHERE s.name = 'Lütjenmoor'
+
ORDER BY entfernung;
+
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{| {{prettytable}}
Linie 123 liegt am nächsten zur Schule
+
|- {{highlight1}}
== Flächenberechnung Area ( ) ==
+
!Parameter
 +
!Typ
 +
!Beschreibung
 +
|----
 +
|Linestring
 +
|GEOMETRY
 +
|Linienzug
 +
|}
  
Die Funktion Area ( ) berechnet den Flächeninhalt eines POLYGONS.
+
====Beispiel====
  
Area ( Polygon ) : Double Precision
+
'''Gegeben:'''
  
ParameterTypBeschreibung
+
Tabelle strassen_nor mit vier Straßen:
PolygonGEOMETRYGeschlossenes Polygon
+
  
Beispiel:
+
{|
 +
|[[Image:PostGIS Tutorial Tabelle strassen nor.jpg|thumb|left|396px|Tabelle strassen_nor]]
 +
|}
  
Gegeben: Tabelle grundstuecke_nor mit vier Grundstücken:
+
'''Gesucht:'''
 +
* Die Straßenlänge jeder Straße.
 +
* Die Gesamtlänge aller Straßen.
 +
* View mit Straßennamen, Längen und Geometrien (siehe auch Kapitel 4).
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
'''Lösung 1:'''
Tabelle grundstuecke_nor
+
Gesucht:
+
  
* Die Fläche jedes Grundstücks.
+
<source lang="mysql">
* Die Gesamtfläche der Grundstücke der Familie Mayer.
+
SELECT name, Length ( geom ) AS laenge FROM strassen_nor;
* View mit Eigentümer, Flächen und Geometrien der Familie Mayer.
+
</source>
  
Lösung 1:
+
{|
 +
|[[Image:PostGIS Tutorial Berechnete Straßenlängen.jpg|thumb|left|290px|Berechnete Straßenlängen]]
 +
|}
  
* SELECT eigentuemer, Area ( geom ) AS flaeche FROM grundstuecke_nor;
+
'''Lösung 2:'''
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
<source lang="mysql">
  Grundstücke mit berechneten Flächen
+
  SELECT Sum ( Length ( geom ) ) AS gesamtlaenge FROM strassen_nor;
 +
</source>
  
Lösung 2:
+
{|
 +
|[[Image:PostGIS Tutorial Gesamtlänge aller Straßen in der Tabelle.jpg|thumb|left|235px|Gesamtlänge aller Straßen in der Tabelle]]
 +
|}
  
* SELECT eigentuemer, Sum ( Area ( geom ) ) AS gesamtflaeche
+
'''Lösung 3:'''
  
FROM grundstuecke_nor
+
<source lang="mysql">
WHERE eigentuemer = 'Mayer'
+
CREATE VIEW v_strassen_nor_laenge ( Name, Laenge) AS
GROUP BY eigentuemer;
+
SELECT name, Length ( geom ), geom FROM strassen_nor;
 +
</source>
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{|
Die Gesamtfläche der Grundstücke der Familie Mayer
+
|[[Image:PostGIS Tutorial View v strassen nor laenge in OpenJUMP.jpg|thumb|left|591px|View v_strassen_nor_laenge in [[OpenJUMP]]]]
 +
|}
  
Lösung 3:
+
== Abstand Distance ( )  ==
  
* CREATE VIEW v_mayer ( eigentuemer, flaechen ) AS
+
Die Funktion '''<tt>Distance ( )</tt>''' berechnet den Abstand zwischen zwei Geometrien.
  
SELECT eigentuemer, Area ( geom ), geom
+
Distance ( geom1, geom2 ) : Double Precision
FROM grundstuecke_nor
+
WHERE eigentuemer = 'Mayer';
+
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{| {{prettytable}}
 +
|- {{highlight1}}
 +
!Parameter
 +
!Typ
 +
!Beschreibung
 +
|----
 +
|geom1
 +
|GEOMETRY
 +
|erste Geometrie
 +
|----
 +
|geom2
 +
|GEOMETRY
 +
|zweite Geometrie
 +
|}
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
====Beispiel====
SELECT * FROM v_mayer;
+
  
View v_mayer in OpenJUMP
+
Von der Schule Lütjenmoor sollen die Entfernungen zu den Haltestellen ermittelt werden.
== Distanzbereich Buffer ( ) ==
+
  
Die Funktion Buffer ( ) erzeugt ein POLYGON mit einem Abstand zu einer gegebenen Geometrie.
+
'''Gegeben:'''
  
Buffer ( Geometrie, Abstand [, AnzSeg ] ) : POLYGON
+
Die Tabelle schulen_nor mit den Schulen und die Tabelle haltestellen_nor mit den Haltestellen.
  
ParameterTypBeschreibung
+
{|
GeometrieGEOMETRYPOINT, LINESTRING oder POLYGON
+
|[[Image:PostGIS Tutorial Tabelle schulen nor.jpg|thumb|left|515px|Tabelle schulen_nor]]
AbstandDouble PrecisionAbstand zur gegebenen Geometrie
+
|}
AnzSegIntegerAnzahl der Segmente des berechneten Polygons
+
== Beispiel POINT: ==
+
  
Gegeben: Tabelle baeume_nor mit Bäumen und Kronendurchmesser:
+
{|
 +
|[[Image:PostGIS Tutorial Tabelle haltestellen nor.jpg|thumb|left|549px|Tabelle haltestellen_nor]]
 +
|}
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
'''Gesucht:'''
Tabelle baeume_nor
+
* Die Entfernungen der Haltestellen zur Schule Lütjenmoor.
  
Gesucht: View mit Geometrien der Bäume in Abhängigkeit des Kronendurchmessers.
+
'''Lösung:'''
Lösung:
+
  
* CREATE VIEW v_buffer_baeume_nor ( name, krone ) AS  
+
<source lang="mysql">
 +
SELECT s.name, h.linie, Distance ( s.geom, h.geom ) AS entfernung
 +
FROM schulen_nor AS s, haltestellen_nor AS h
 +
WHERE s.name = 'Lütjenmoor'
 +
ORDER BY entfernung;
 +
</source>
  
SELECT name, krone, SetSRID ( Buffer ( geom, krone / 2. ), 31467 )
+
{|
FROM baeume_nor;
+
|[[Image:PostGIS Tutorial Linie 123 liegt am nächsten zur Schule.jpg|thumb|left|352px|Linie 123 liegt am nächsten zur Schule]]
 +
|}
  
Hinweis:
+
== Flächenberechnung Area ( ) ==
  
* An die Funktion Buffer ( ) wird die Geometrie der Bäume (hier POINT) und der Kronendurchmesser übergeben. Die von Buffer ( ) erzeugte Geometrie wird ein kreisförmiges Polygon mit dem Radius krone / 2. sein.
+
Die Funktion '''<tt>Area ( )</tt>''' berechnet den Flächeninhalt eines POLYGONS.
* Die Funktion Buffer ( ) wird innerhalb der Funktion SetSRID ( ) aufgerufen. Die Funktion SetSRID ( ) weist der von Buffer ( ) erzeugten Geometrie den SRID von 31467 zu (siehe auch Kapitel 2.1),
+
  
In OpenJUMP können dann die Bäume in Abhängigkeit des Kronendurchmessers dargestellt werde.
+
Area ( Polygon ) : Double Precision
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{| {{prettytable}}
Buffer um die Bäume in Abhängigkeit des Kronendurchmessers
+
|- {{highlight1}}
 +
!Parameter
 +
!Typ
 +
!Beschreibung
 +
|----
 +
|Polygon
 +
|GEOMETRY
 +
|Geschlossenes Polygon
 +
|}
  
== Beispiel LINESTRING: ==
+
====Beispiel====
  
Gegeben: Tabelle strassen_nor
+
'''Gegeben:'''
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
Tabelle grundstuecke_nor mit vier Grundstücken:
Tabelle strassen_nor
+
  
Gesucht: View mit Geometrie der Straße Kohfurth, die auf 20 m verbreitert werden soll.
+
{|
 +
|[[Image:PostGIS Tutorial Tabelle grundstuecke_nor.jpg|thumb|left|395px|Tabelle grundstuecke_nor]]
 +
|}
  
Lösung:
+
'''Gesucht:'''
 +
* Die Fläche jedes Grundstücks.
 +
* Die Gesamtfläche der Grundstücke der Familie Mayer.
 +
* View mit Eigentümer, Flächen und Geometrien der Familie Mayer.
  
* CREATE VIEW v_kohfurth AS
+
'''Lösung 1:'''
  
SELECT name, SetSRID ( Buffer ( geom, 20. ), 31467 ) AS geom
+
<source lang="mysql">
FROM strassen_nor
+
SELECT eigentuemer, Area ( geom ) AS flaeche FROM grundstuecke_nor;
WHERE name = 'Kohfurth';
+
</source>
 +
{|
 +
|[[Image:PostGIS Tutorial Grundstücke mit berechneten Flächen.jpg|thumb|left|305px|Grundstücke mit berechneten Flächen]]
 +
|}
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
'''Lösung 2:'''
Buffer um die Straße Kohfurth
+
  
== Schnittmenge Intersection ( ) ==
+
<source lang="mysql">
 +
SELECT eigentuemer, Sum ( Area ( geom ) ) AS gesamtflaeche
 +
FROM grundstuecke_nor
 +
WHERE eigentuemer = 'Mayer'
 +
GROUP BY eigentuemer;
 +
</source>
  
Die Funktion Intersection ( ) berechnet die Schnittmenge zweier Geometrien. Das Ergebnis ist entweder eine neue oder eine leere (EMPTY) Geometrie. Mit der Funktion IsEmpty ( geometry ) kann geprüft werden, ob die Geometrie leer ist.
+
{|
 +
|[[Image:PostGIS Tutorial Die Gesamtfläche der Grundstücke der Familie Mayer.jpg|thumb|left|324px|Die Gesamtfläche der Grundstücke der Familie Mayer]]
 +
|}
  
Intersection ( geom1, geom2 ) : GEOMETRY oder EMPTY
+
'''Lösung 3:'''
  
ParameterTypBeschreibung
+
<source lang="mysql">
geom1GEOMETRYerste Geometrie
+
CREATE VIEW v_mayer ( eigentuemer, flaechen ) AS
geom2GEOMETRY zweite Geometrie
+
SELECT eigentuemer, Area ( geom ), geom
 +
FROM grundstuecke_nor
 +
WHERE eigentuemer = 'Mayer';
 +
</source>
  
Beispiel:
+
{|
Die Straße Berliner Allee soll verbreitert werden. Gesucht sind alle Grundstücke, die von der Verbreiterung betroffen sind.
+
|[[Image:PostGIS Tutorial SELECT FROM v mayer.jpg|thumb|left|500px|SELECT * FROM v_mayer;]]
 +
|}
  
Gegeben: Eine Tabelle mit dem Polygon der verbreiterten Straße (b_BerlinerAllee; Buffer der Straße) und eine Tabelle mit den Geometrien der Grundstücke (grundstuecke_nor).
+
{|
 +
|[[Image:PostGIS Tutorial View v_mayer in OpenJUMP.jpg|thumb|left|591px|View v_mayer in [[OpenJUMP]]]]
 +
|}
  
Gesucht: Die Schnittmenge des Polygons mit den Grundstücken.
+
== Distanzbereich Buffer ( ) ==
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
Die Funktion '''<tt>Buffer ( )</tt>''' erzeugt ein POLYGON mit einem Abstand zu einer gegebenen Geometrie.
Schnittmenge zwischen verbreiterter Berliner Allee und betroffenen Grundstücken wird gesucht
+
Lösung:
+
  
Die Tabelle grundstuecke_nor enthält 4 Grundstücke mit den entsprechenden Geometrien. Die Tabelle b_BerlinerAllee enthält die Buffer-Geometrie. Wird eine SELECT-Anfrage über beide Tabellen ausgeführt (join), erhält man das Kreuzprodukt aus der Zeilenanzahl beider Tabellen, also 4 Ergebnisse. Zwei Geometrien müssen leer (EMPTY) sein, weil zwei Grundstücke nicht in der Schnittmenge liegen!
+
Buffer ( Geometrie, Abstand [, AnzSeg ] ) : POLYGON
  
* SELECT Intersection ( g.geom, b.geom )
+
{| {{prettytable}}
 +
|- {{highlight1}}
 +
!Parameter
 +
!Typ
 +
!Beschreibung
 +
|----
 +
|Geometrie
 +
|GEOMETRY
 +
|POINT, LINESTRING oder POLYGON
 +
|----
 +
|Abstand
 +
|Double Precision
 +
|Abstand zur gegebenen Geometrie
 +
|----
 +
|AnzSeg
 +
|Integer
 +
|Anzahl der Segmente des berechneten Polygons
 +
|}
  
FROM grundstuecke_nor AS g, b_BerlinerAllee AS b;
+
====Beispiel POINT====
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
'''Gegeben:'''
Kreuzprodukt mit 2 leeren Geometrien
+
  
Die leeren (EMPTY) Geometrien müssen noch durch eine WHERE-Klausel und der IsEmpty ( ) PostGIS-Funktion entfernt werden.
+
Tabelle baeume_nor mit Bäumen und Kronendurchmesser:
  
* SELECT Intersection ( g.geom, b.geom )
+
{|
 +
|[[Image:PostGIS Tutorial Tabelle baeume nor.jpg|thumb|left|559px|Tabelle baeume_nor]]
 +
|}
  
FROM grundstuecke_nor AS g, b_BerlinerAllee AS b
+
'''Gesucht:'''
WHERE IsEmpty ( Intersection ( g.geom, b.geom ) ) = FALSE;
+
* View mit Geometrien der Bäume in Abhängigkeit des Kronendurchmessers.
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
'''Lösung:'''
Die gesuchte Schnittmenge
+
Sollen noch die Eigentümer angezeigt und der SRID verändert werden, so sieht die SQL-Anweisung wie folgt aus:
+
  
* SELECT g.eigentuemer, SetSRID ( Intersection ( g.geom, b.geom ), 31467 ) AS geom
+
<source lang="mysql">
 +
CREATE VIEW v_buffer_baeume_nor ( name, krone ) AS
 +
SELECT name, krone, SetSRID ( Buffer ( geom, krone / 2. ), 31467 )
 +
FROM baeume_nor;
 +
</source>
  
FROM grundstuecke_nor AS g, b_BerlinerAllee AS b
+
'''Hinweis:'''
WHERE IsEmpty ( Intersection ( g.geom, b.geom ) ) = FALSE;
+
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
* An die Funktion '''<tt>Buffer ( )</tt>''' wird die Geometrie der Bäume (hier POINT) und der Kronendurchmesser übergeben. Die von '''<tt>Buffer ( )</tt>''' erzeugte Geometrie wird ein kreisförmiges Polygon mit dem Radius krone / 2. sein.
Schnittmenge mit Eigentümer
+
* Die Funktion '''<tt>Buffer ( )</tt>''' wird innerhalb der Funktion '''<tt>SetSRID ( )</tt>''' aufgerufen. Die Funktion '''<tt>SetSRID ( )</tt>''' weist der von '''<tt>Buffer ( )</tt>''' erzeugten Geometrie den SRID von 31467 zu (siehe auch Kapitel 2.1),
  
Zur Darstellung in OpenJUMP erzeugen wir eine Sicht:
+
In [[OpenJUMP]] können dann die Bäume in Abhängigkeit des Kronendurchmessers dargestellt werde.
  
* CREATE VIEW v_intersection ( name, geom ) AS
+
{|
 +
|[[Image:PostGIS Tutorial Buffer um die Bäume in Abhängigkeit des Kronendurchmessers.jpg|thumb|left|591px|Buffer um die Bäume in Abhängigkeit des Kronendurchmessers]]
 +
|}
  
SELECT g.eigentuemer, SetSRID ( Intersection ( g.geom, b.geom ), 31467 ) AS geom
+
==== Beispiel LINESTRING: ====
FROM grundstuecke_nor AS g, b_BerlinerAllee AS b
+
WHERE IsEmpty ( Intersection ( g.geom, b.geom ) ) = FALSE;
+
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
'''Gegeben:'''
Schulze und Mayer sind betroffen
+
== Konvexe Hülle ConvexHull ( ) ==
+
  
Die Funktion ConvexHull ( ) berechnet eine konvexe Hülle um eine oder mehrere Geometrien. Eine konvexe Hülle um eine Punktmenge ist das kürzeste Polygon, das diese Punktmenge umschließt. Spannt man z.B. ein Gummiband um die Punktmenge, so erhält man eine konvexe Hülle. Zur Veranschaulichung legen wir eine konvexe Hülle (rotes Polygon), um Geometrien vom Typ POINT:
+
Tabelle strassen_nor
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{|
Konvexe Hülle (rotes Polygon) um eine Punktmenge
+
|[[Image:PostGIS_Tutorial_Tabelle_strassen_nor.jpg|thumb|left|396px|Tabelle strassen_nor]]
 +
|}
  
ConvexHull ( geom ) : POLYGON
+
'''Gesucht:'''
 +
* View mit Geometrie der Straße Kohfurth, die auf 20 m verbreitert werden soll.
  
ParameterTypBeschreibung
+
'''Lösung:'''
geomGEOMETRYGeometrie, um die eine konvexe Hülle gelegt werdensoll.
+
  
Hinweis:
+
<source lang="mysql">
Soll eine konvexe Hülle um eine Menge von Punkten (POINT) gelegt werden, müssen die Punkte mit der Funktion GeomUnion ( geometry set ) zu einer Geometrie zusammengefasst werden.
+
CREATE VIEW v_kohfurth AS
Beispiel:
+
SELECT name, SetSRID ( Buffer ( geom, 20. ), 31467 ) AS geom
Bei einem kleinen Wäldchen in Norderstedt sind nur die Bäume in einer Tabelle erfasst. Das Wäldchen soll eingezäunt werden. Gesucht ist der kürzeste Zaun und die eingezäunte Fläche.
+
FROM strassen_nor
 +
WHERE name = 'Kohfurth';
 +
</source>
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{|
Kleines Wäldchen in der Tabelle waldgebiet1_nor
+
|[[Image:PostGIS Tutorial Buffer um die Straße Kohfurth.jpg|thumb|left|591px|Buffer um die Straße Kohfurth]]
 +
|}
  
Gegeben: Eine Tabelle (waldgebiet1_nor) mit den Geometrien der Bäume.
+
== Schnittmenge Intersection ( ) ==
  
Gesucht: Konvexe Hülle um die Bäume.
+
Die Funktion '''<tt>Intersection ( )</tt>''' berechnet die [[:de:Schnittmenge|Schnittmenge]] zweier Geometrien. Das Ergebnis ist entweder eine neue oder eine leere '''<tt>(EMPTY)</tt>''' Geometrie. Mit der Funktion '''<tt>IsEmpty ( geometry )</tt>''' kann geprüft werden, ob die Geometrie leer ist.
  
Lösung:
+
Intersection ( geom1, geom2 ) : GEOMETRY oder EMPTY
Die Punkte der Tabelle waldgebiet1_nor müssen erst mit der Funktion GeomUnion ( geometry set ) zu einer Geometrie zusammengefasst werden. Danach kann die konvexe Hülle berechnet werden. Dies kann alles in einer SQL-Anweisung geschehen.
+
  
* SELECT ConvexHull ( GeomUnion ( geom ) ) FROM waldgebiet1_nor;
+
{| {{prettytable}}
 +
|- {{highlight1}}
 +
!Parameter
 +
!Typ
 +
!Beschreibung
 +
|----
 +
|geom1
 +
|GEOMETRY
 +
|erste Geometrie
 +
|----
 +
|geom2
 +
|GEOMETRY
 +
|zweite Geometrie
 +
|}
  
Soll die Fläche berechnet werden, muss nur die Funktion Area ( ) aufgerufen werden:
+
====Beispiel====
  
* SELECT Area ( ConvexHull ( GeomUnion ( geom ) ) ) AS flaeche FROM waldgebiet1_nor;
+
Die Straße Berliner Allee soll verbreitert werden. Gesucht sind alle Grundstücke, die von der Verbreiterung betroffen sind.
  
Zur Darstellung in OpenJUMP berechnet man die konvexe Hülle mit den Punkten aus der Tabelle waldgebiet1_nor und erzeugt daraus eine Sicht (View).
+
'''Gegeben:'''
  
* CREATE VIEW v_waldconvex ( geom ) AS
+
Eine Tabelle mit dem Polygon der verbreiterten Straße (b_BerlinerAllee; Buffer der Straße) und eine Tabelle mit den Geometrien der Grundstücke (grundstuecke_nor).
  
SELECT ConvexHull ( GeomUnion ( geom ) ) FROM waldgebiet1_nor;
+
'''Gesucht:'''
 +
* Die Schnittmenge des Polygons mit den Grundstücken.
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
{|
Konvexe Hülle um das kleine Waldgebiet
+
|[[Image:PostGIS Tutorial Schnittmenge zwischen verbreiterter Berliner Allee und betroffenen Grundstücken wird gesucht.jpg|thumb|left|591px|Schnittmenge zwischen verbreiterter Berliner Allee und betroffenen Grundstücken wird gesucht]]
 +
|}
  
Leider kann man aus der konvexen Hülle (POLYGON) nicht direkt die Länge des Polygons mit der Funktion Length ( ) berechnen, sondern muss zuerst einen Linienzug (LINESTRING) aus dem POLYGON machen. Dazu dient unter anderem die Funktion Boundary ( ). Da die Funktion Boundary ( ) ein MULTIPOLYGON als Argument benötigt, muss die Funktion multi ( ) benutzt werden. Auf die Funktion Boundary ( ) und multi ( ) wird im Moment nicht näher eingegangen.
+
'''Lösung:'''
  
Die Zaunlänge um das Wäldchen kann also folgendermaßen ermittelt werden:
+
Die Tabelle grundstuecke_nor enthält 4 Grundstücke mit den entsprechenden Geometrien. Die Tabelle b_BerlinerAllee enthält die Buffer-Geometrie. Wird eine SELECT-Anfrage über beide Tabellen ausgeführt (join), erhält man das Kreuzprodukt aus der Zeilenanzahl beider Tabellen, also 4 Ergebnisse. Zwei Geometrien müssen leer '''<tt>(EMPTY)</tt>''' sein, weil zwei Grundstücke nicht in der Schnittmenge liegen!
  
* SELECT Length ( Boundary ( multi ( geom ) ) ) AS Zaunlaenge FROM v_waldconvex;
+
<source lang="mysql">
 +
SELECT Intersection ( g.geom, b.geom )
 +
FROM grundstuecke_nor AS g, b_BerlinerAllee AS b;
 +
</source>
  
== Contains ( ) und Within ( ) ==
+
{|
 +
|[[Image:PostGIS Tutorial Kreuzprodukt mit 2 leeren Geometrien.jpg|thumb|left|335px|Kreuzprodukt mit 2 leeren Geometrien]]
 +
|}
  
* Die Funktion Contains ( ) prüft, ob die erste Geometrie geom1 die zweite Geometrie geom2 enthält.
+
Die leeren '''<tt>(EMPTY)</tt>''' Geometrien müssen noch durch eine '''<tt>WHERE</tt>'''-Klausel und der '''<tt>IsEmpty ( )</tt>''' PostGIS-Funktion entfernt werden.
* Die Funktion Within ( ) prüft, ob die zweite Geometrie geom2 die erste Geometrie geom1 enthält.  
+
  
Als Ergebnis wird ein Wert vom Typ BOOLEAN zurückgegeben (TRUE, FALSE);
+
<source lang="mysql">
 +
SELECT Intersection ( g.geom, b.geom )
 +
FROM grundstuecke_nor AS g, b_BerlinerAllee AS b
 +
WHERE IsEmpty ( Intersection ( g.geom, b.geom ) ) = FALSE;
 +
</source>
  
Contains ( geom1, geom2 ) : Boolean oder Within ( geom1, geom2 ) : Boolean
+
{|
 +
|[[Image:PostGIS Tutorial Die gesuchte Schnittmenge.jpg|thumb|left|329px|Die gesuchte Schnittmenge]]
 +
|}
  
ParameterTypBeschreibung
+
Sollen noch die Eigentümer angezeigt und der SRID verändert werden, so sieht die SQL-Anweisung wie folgt aus:
geom1GEOMETRYerste Geometrie
+
geom2GEOMETRYzweite Geometrie
+
  
Beispiel : Gesucht sind alle Bäume, die auf privaten Grundstücken stehen.
+
<source lang="mysql">
 +
SELECT g.eigentuemer, SetSRID ( Intersection ( g.geom, b.geom ), 31467 ) AS geom
 +
FROM grundstuecke_nor AS g, b_BerlinerAllee AS b
 +
WHERE IsEmpty ( Intersection ( g.geom, b.geom ) ) = FALSE;
 +
</source>
  
Gegeben: Die Tabelle grundstuecke_nor mit den Geometrien und Eigentümern der privaten Grundstücke und die Tabelle baeume_nor mit den Geometrien und Attributen der Bäume.
+
{|
 +
|[[Image:PostGIS Tutorial Schnittmenge mit Eigentümer.jpg|thumb|left|429px|Schnittmenge mit Eigentümer]]
 +
|}
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
Zur Darstellung in [[OpenJUMP]] erzeugen wir eine Sicht:
Sieben von neun Bäumen stehen auf den privaten Grundstücken
+
Gesucht: Alle Bäume, die auf den Grundstücken stehen.
+
  
Lösung mit Contains ( ):
+
<source lang="mysql">
 +
CREATE VIEW v_intersection ( name, geom ) AS
 +
SELECT g.eigentuemer, SetSRID ( Intersection ( g.geom, b.geom ), 31467 ) AS geom
 +
FROM grundstuecke_nor AS g, b_BerlinerAllee AS b
 +
WHERE IsEmpty ( Intersection ( g.geom, b.geom ) ) = FALSE;
 +
</source>
  
* SELECT gr.eigentuemer, b.name
+
{|
FROM grundstuecke_nor AS gr, baeume_nor AS b
+
|[[Image:PostGIS Tutorial Schulze und Mayer sind betroffen.jpg|thumb|left|591px|Schulze und Mayer sind betroffen]]
WHERE Contains ( gr.geom, b.geom ) = TRUE;
+
|}
  
Hier wird geprüft, ob die Geometrien der Grundstücke die Geometrien der Bäume enthalten.
+
== Konvexe Hülle ConvexHull ( ) ==
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
Die Funktion '''<tt>ConvexHull ( )</tt>''' berechnet eine konvexe Hülle um eine oder mehrere Geometrien. Eine konvexe Hülle um eine Punktmenge ist das kürzeste Polygon, das diese Punktmenge umschließt. Spannt man z.B. ein Gummiband um die Punktmenge, so erhält man eine konvexe Hülle. Zur Veranschaulichung legen wir eine konvexe Hülle (rotes Polygon), um Geometrien vom Typ POINT:
Sieben Bäume stehen auf den privaten Grundstücken
+
  
Lösung mit Within ( ):
+
{|
 +
|[[Image:PostGIS Tutorial Konvexe Hülle (rotes Polygon) um eine Punktmenge.jpg|thumb|left|591px|Konvexe Hülle (rotes Polygon) um eine Punktmenge]]
 +
|}
  
* SELECT gr.eigentuemer, b.name
+
ConvexHull ( geom ) : POLYGON
  
FROM grundstuecke_nor AS gr, baeume_nor AS b
+
{| {{prettytable}}
WHERE Within ( b.geom, gr.geom ) = TRUE;
+
|- {{highlight1}}
 +
!Parameter
 +
!Typ
 +
!Beschreibung
 +
|----
 +
|geom
 +
|GEOMETRY
 +
|Geometrie, um die eine konvexe Hülle gelegt werdensoll.
 +
|}
  
Hier wird geprüft, ob die Geometrien der Bäume in den Geometrien der Grundstücke enthalten sind.
+
'''Hinweis:'''
  
Hinweis: Es muss darauf geachtet werden, ob die Prüfung sinnvoll ist. Punktgeometrien können z.B. niemals Polygone enthalten. Die WHERE-Bedingung wäre immer FALSE!
+
Soll eine konvexe Hülle um eine Menge von Punkten (POINT) gelegt werden, müssen die Punkte mit der Funktion '''<tt>GeomUnion ( geometry set )</tt>''' zu einer Geometrie zusammengefasst werden.
  
== Glossar ==
+
====Beispiel====
  
CRS: Coordiante Reference System
+
Bei einem kleinen Wäldchen in Norderstedt sind nur die Bäume in einer Tabelle erfasst. Das Wäldchen soll eingezäunt werden. Gesucht ist der kürzeste Zaun und die eingezäunte Fläche.
  
EPSG: European Petroleum Survey Group; heute OGP (Oil &amp; Gas Producers) Surveying &amp; Positioning Committee. [http://www.epsg.org/">www.epsg.org]
+
{|
 +
|[[Image:PostGIS Tutorial Kleines Wäldchen in der Tabelle waldgebiet1 nor.jpg|thumb|left|591px|Kleines Wäldchen in der Tabelle waldgebiet1_nor]]
 +
|}
  
Das Oil &amp; Gas Producers Surveying and Positioning Committee pflegt und veröffentlicht Parameter und Beschreibungen für Koordinatenreferenzsysteme. Diese Parameter werden unter einer Kennung zusammengefasst, dem Spatial Reference System Identifier (SRID). Diese Kennungen werden z.B. in OGC konformen Diensten (z.B. WMS) und in PostGIS verwendet und ausgewertet.
+
'''Gegeben:'''
(Siehe auch OGC: „Coordinate Transformation Services“).
+
  
Beispiel:EPSG: 4326 = Geografische Koordinaten im WGS84 Bezugssystem
+
Eine Tabelle (waldgebiet1_nor) mit den Geometrien der Bäume.
EPSG: 31466 = Gauß-Krüger, 2. Streifen
+
EPSG: 31467 = Gauß-Krüger, 3. Streifen
+
EPSG: 31468 = Gauß-Krüger, 4. Streifen
+
Die entsprechenden Dateien mit den Datensätzen (EPSG geodetic parameter dataset) können von der Seite [http://www.epsg.org/ http://www.epsg.org/] geladen werden.
+
  
Feature (Objekt):  
+
'''Gesucht:'''
 +
* Konvexe Hülle um die Bäume.
  
* Features sind abstrahierte Objekte der realen Welt. Zum Beispiel werden Straßen als Linienzüge, Gebäude als Flächen oder Bäume als Punkte abstrahiert und dargestellt.
+
'''Lösung:'''
  
In OpenJUMP hat jedes Feature ein räumliches Attribut (Geometrie) und keins oder mehrere nicht-räumliche Attribute (non-spatial attributs, Fachdaten, Sachdaten) z.B. Straßenname, Eigentümer, Baumhöhe.
+
Die Punkte der Tabelle waldgebiet1_nor müssen erst mit der Funktion '''<tt>GeomUnion ( geometry set )</tt>''' zu einer Geometrie zusammengefasst werden. Danach kann die konvexe Hülle berechnet werden. Dies kann alles in einer SQL-Anweisung geschehen.
  
* Eine Gruppe von räumlichen Elementen, die zusammen eine Einheit der realen Welt repräsentieren. Oft synonym verwendet mit dem Ausdruck Objekt. Kann auch zu komplexen Features (Objekten), bestehend aus mehr als einer Gruppe von räumlichen Elementen, zusammengesetzt werden.
+
<source lang="mysql">
 +
SELECT ConvexHull ( GeomUnion ( geom ) ) FROM waldgebiet1_nor;
 +
</source>
  
(Lexikon der Geoinformatik, 2001)
+
Soll die Fläche berechnet werden, muss nur die Funktion '''<tt>Area ( )</tt>''' aufgerufen werden:
  
* A geographic feature is „an abstraction of a real world phenomeon ... associated with a location relative to Earth“. A feature has spatial attributes (polygons, points, etc.) and non-spatial attributes (strings, dates, numbers). (JUMP Workbench User's Guide, 2004)
+
<source lang="mysql">
 +
SELECT Area ( ConvexHull ( GeomUnion ( geom ) ) ) AS flaeche FROM waldgebiet1_nor;
 +
</source>
  
GeometryCollection: Zusammenfassung von mehreren Features auf einem Layer zu einem Feature.
+
Zur Darstellung in [[OpenJUMP]] berechnet man die konvexe Hülle mit den Punkten aus der Tabelle waldgebiet1_nor und erzeugt daraus eine Sicht (View).
  
GNU General Public License: Lizenzierung freier Software; [http://www.fsf.org/licensing/licenses/gpl.html http://www.fsf.org/licensing/licenses/gpl.html]
+
<source lang="mysql">
 +
CREATE VIEW v_waldconvex ( geom ) AS
 +
SELECT ConvexHull ( GeomUnion ( geom ) ) FROM waldgebiet1_nor;
 +
</source>
  
JUMP: Unified Mapping Platform; Geografisches Informationssystem; [http://www.jump-project.org/ http://www.jump-project.org/]  
+
{|
 +
|[[Image:PostGIS Tutorial Konvexe Hülle um das kleine Waldgebiet.jpg|thumb|left|591px|Konvexe Hülle um das kleine Waldgebiet]]
 +
|}
  
Mapserver: Entwicklungsumgebung für die Erstellung von Internet-Anwendungen mit dynamischen Karteninhalten; [http://mapserver.gis.umn.edu/ http://mapserver.gis.umn.edu/]
+
Leider kann man aus der konvexen Hülle (POLYGON) nicht direkt die Länge des Polygons mit der Funktion '''<tt>Length ( )</tt>''' berechnen, sondern muss zuerst einen Linienzug (LINESTRING) aus dem POLYGON machen. Dazu dient unter anderem die Funktion '''<tt>Boundary ( )'''<tt>'''. Da die Funktion '''<tt>Boundary ( )</tt>''' ein MULTIPOLYGON als Argument benötigt, muss die Funktion '''<tt>multi ( )</tt>''' benutzt werden. Auf die Funktion '''<tt>Boundary ( )</tt>''' und '''<tt>multi ( )</tt>''' wird im Moment nicht näher eingegangen.
  
OGC: Open Geospatial Consortium; [http://www.opengeospatial.org/ http://www.opengeospatial.org/]
+
Die Zaunlänge um das Wäldchen kann also folgendermaßen ermittelt werden:
Internationales Normierungsgremium für Standards und Schnittstellen von GIS und Location Based Services (LBS) Anwendungen. Vereinigung von Firmen und Forschungseinrichtungen.
+
  
OGP: Oil &amp; Gas Producer; [http://www.ogp.org.uk/ http://www.ogp.org.uk/]
+
<source lang="mysql">
 +
SELECT Length ( Boundary ( multi ( geom ) ) ) AS Zaunlaenge FROM v_waldconvex;
 +
</source>
  
OGP Surveying and Positioning Committee: ehemalig EPSG, [http://www.epsg.org/ http://www.epsg.org/]
+
== Contains ( ) und Within ( ) ==
  
OpenGIS: siehe OGC; [http://www.opengeospatial.org/ http://www.opengeospatial.org/]
+
* Die Funktion '''<tt>Contains ( )</tt>''' prüft, ob die erste Geometrie geom1 die zweite Geometrie geom2 enthält.
 +
* Die Funktion '''<tt>Within ( )</tt>''' prüft, ob die zweite Geometrie geom2 die erste Geometrie geom1 enthält.
  
OpenJUMP: Geografisches Informationssystem; Erweiterung von JUMP; [http://openjump.org/wiki/show/HomePage http://openjump.org/wiki/show/HomePage]
+
Als Ergebnis wird ein Wert vom Typ '''<tt>BOOLEAN</tt>''' zurückgegeben (TRUE, FALSE);
  
Open Source: Quelloffenheit; [http://de.wikipedia.org/wiki/Open_source http://de.wikipedia.org/wiki/Open_source]
+
Contains ( geom1, geom2 ) : Boolean oder Within ( geom1, geom2 ) : Boolean
  
PostGIS: Erweiterung von PostgreSQL um geografische Objekte; [http://postgis.refractions.net/ http://postgis.refractions.net/]
+
{| {{prettytable}}
 +
|- {{highlight1}}
 +
!Parameter
 +
!Typ
 +
!Beschreibung
 +
|----
 +
|geom1
 +
|GEOMETRY
 +
|erste Geometrie
 +
|----
 +
|geom2
 +
|GEOMETRY
 +
|zweite Geometrie
 +
|}
  
PostgreSQL: Objektrelationales Datenbankmanagementsystem; [http://www.postgresql.org/ http://www.postgresql.org/]
+
====Beispiel====
  
Refractions Research: Kanadische Firma, die JUMP mitentwickelt hat; [http://www.refractions.net/ http://www.refractions.net/]
+
Gesucht sind alle Bäume, die auf privaten Grundstücken stehen.
  
Spatial attributes: Räumliche Attribute (Punkt, Linie, Fläche).
+
'''Gegeben:'''
  
Spatial information: Geoinformation, Rauminformation
+
Die Tabelle grundstuecke_nor mit den Geometrien und Eigentümern der privaten Grundstücke und die Tabelle baeume_nor mit den Geometrien und Attributen der Bäume.
  
SRID: Spatial Reference System Identifier; Kennung für Räumliches Bezugssystem
+
{|
 +
|[[Image:PostGIS Tutorial Sieben von neun Bäumen stehen auf den privaten Grundstücken.jpg|thumb|left|591px|Sieben von neun Bäumen stehen auf den privaten Grundstücken]]
 +
|}
  
SRS: Spatial Reference System: Räumliches Bezugssystem
+
'''Gesucht:'''
 +
* Alle Bäume, die auf den Grundstücken stehen.
  
SVG: Scaleable Vector Graphics; vom W3C empfohlenes Grafikformat; [http://www.w3.org/Graphics/SVG/ http://www.w3.org/Graphics/SVG/]
+
'''Lösung mit '''<tt>Contains ( )</tt>''':'''
Vertex, vertices: Knoten, Eckpunkt.
+
  
Vivid Solutions: Kanadische Firma, die JUMP mitentwickelt hat; [http://www.vividsolutions.com/ http://www.vividsolutions.com/]
+
<source lang="mysql">
 +
SELECT gr.eigentuemer, b.name
 +
FROM grundstuecke_nor AS gr, baeume_nor AS b
 +
WHERE Contains ( gr.geom, b.geom ) = TRUE;
 +
</source>
  
W3C: World Wide Web Consortium; [http://www.w3.org/ http://www.w3.org/]
+
Hier wird geprüft, ob die Geometrien der Grundstücke die Geometrien der Bäume enthalten.
  
Well-Known Binary (WKB): Binäre Repräsentationen für Geometrien, die in dem OpenGIS Dokument„OpenGIS Simple Features Specification For SQL“ definiert sind.
+
{|
 +
|[[Image:PostGIS Tutorial Sieben Bäume stehen auf den privaten Grundstücken.jpg|thumb|left|278px|Sieben Bäume stehen auf den privaten Grundstücken]]
 +
|}
  
Well-Known Text (WKT): Textliche Darstellung von Geometrien, die in dem OpenGIS Dokument„OpenGIS Simple Features Specification For SQL“ definiert sind.
+
'''Lösung mit '''<tt>Within ( )</tt>''':'''
Ein Punkt (Point) wird z.B. als 'POINT (10 15)' dargestellt.
+
  
[[Image:XXXXX|thumb|400px|left|bbbbb]]
+
<source lang="mysql">
 +
SELECT gr.eigentuemer, b.name
 +
FROM grundstuecke_nor AS gr, baeume_nor AS b
 +
WHERE Within ( b.geom, gr.geom ) = TRUE;
 +
</source>
  
Geometrietypen im WKT-Format (Quelle: OpenGIS Simple Features Specification for SQL)
+
Hier wird geprüft, ob die Geometrien der Bäume in den Geometrien der Grundstücke enthalten sind.
  
WKB: siehe Well-Known Binary
+
'''Hinweis:'''
 +
Es muss darauf geachtet werden, ob die Prüfung sinnvoll ist. Punktgeometrien können z.B. niemals Polygone enthalten. Die '''<tt>WHERE</tt>'''-Bedingung wäre immer FALSE!
  
WKT: siehe Well-Known Text
 
  
WMS: Web Map Service; Internet-Dienst, der auf standardisierte Anfragen standardisierte Daten zur Kartenbild-Darstellung liefert. Dieser Dienst ist als OGC Standard definiert.
 
== Literaturverzeichnis ==
 
  
Aquino, J., Davis M. (2004):
+
= Literaturverzeichnis =
JUMP Workbench User's Guide, Vivid Solutions
+
  
Aquino, J., Kim D. (2003):  
+
* Aquino, J., Davis M. (2004): JUMP Workbench User's Guide, Vivid Solutions
JUMP Developer's Guide, Vivid Solutions
+
  
Bill, R. (1999):  
+
* Aquino, J., Kim D. (2003): JUMP Developer's Guide, Vivid Solutions
Grundlagen der Geo-Informationssysteme, Band 1, Wichmann Verlag
+
  
Bill, R. (1999):  
+
* Bill, R. (1999): Grundlagen der Geo-Informationssysteme, Band 1, Wichmann Verlag
Grundlagen der Geo-Informationssysteme, Band 2, Wichmann Verlag
+
  
Bill R., Zehner M. L. (2001):  
+
* Bill, R. (1999): Grundlagen der Geo-Informationssysteme, Band 2, Wichmann Verlag
Lexikon der Geoinformatik, Wichmann Verlag
+
  
Eisentraut, P. (2003):  
+
* Bill R., Zehner M. L. (2001): Lexikon der Geoinformatik, Wichmann Verlag
PostgreSQL Das Offizielle Handbuch, mitp-Verlag Bonn
+
  
Gemeinschaftsprojekt von CCGIS und terrestris:
+
* Eisentraut, P. (2003): PostgreSQL Das Offizielle Handbuch, mitp-Verlag Bonn
Praxishandbuch WebGIS mit Freier Software [http://www.terrestris.de/hp/shared/downloads/Praxishandbuch_WebGIS_Freie_Software.pdf http://www.terrestris.de/hp/shared/downloads/Praxishandbuch_WebGIS_Freie_Software.pdf]
+
  
Lake, R., Burggraf D. S.,Trninic M., Rae L. (2004):
+
* Gemeinschaftsprojekt von CCGIS und terrestris: [[:Image:Praxishandbuch WebGIS Freie Software.pdf|Praxishandbuch WebGIS mit Freier Software]]
Geography Mark-Up Language (GML), John Wiley &amp; Sons, Ltd
+
  
Lange, N. (2002):  
+
* Lake, R., Burggraf D. S.,Trninic M., Rae L. (2004): Geography Mark-Up Language (GML), John Wiley &amp; Sons, Ltd
Geoinformatik in Theorie und Praxis, Springer-Verlag Berlin Heidelberg New York
+
  
OGC (2003):  
+
* Lange, N. (2002): Geoinformatik in Theorie und Praxis, Springer-Verlag Berlin Heidelberg New York
OpenGIS Geography Markup Language (GML) Implementation Specification, Open GIS Consortium
+
  
OGC (2001):
+
* OGC (2003): OpenGIS Geography Markup Language (GML) Implementation Specification, Open GIS Consortium
OpenGIS Implementation Specification: Coordinate Transformation Services, Open GIS Consortium
+
  
OGC (1999):  
+
* OGC (2001): OpenGIS Implementation Specification: Coordinate Transformation Services, Open GIS Consortium
OpenGIS Simple Features Specification For SQL Revision 1.1, Open GIS Consortium
+
  
OGC (2004):  
+
* OGC (1999): OpenGIS Simple Features Specification For SQL Revision 1.1, Open GIS Consortium
Web Map Service (WMS), Version: 1.3, Open GIS Consortium
+
  
OGC (2005)
+
* OGC (2004): Web Map Service (WMS), Version: 1.3, Open GIS Consortium
OpenGIS Implementation Specification for Geographic information, Open GIS Consortium
+
  
* Simple feature access – Part 1: Common architecture
+
* OGC (2005) OpenGIS Implementation Specification for Geographic information, Open GIS Consortium
* Simple feature access – Part 2: SQL option
+
:* Simple feature access – Part 1: Common architecture
 +
:* Simple feature access – Part 2: SQL option
  
Refractions Research (2005):  
+
* Refractions Research (2005): PostGIS Manual
PostGIS Manual
+
  
RRZN (2004):  
+
* RRZN (2004): SQL Grundlagen und Datenbankdesign, Regionales Rechenzentrum / Universität Hannover
SQL Grundlagen und Datenbankdesign, Regionales Rechenzentrum / Universität Hannover  
+
  
The PostgreSQL Global Development Group (2005):  
+
* The PostgreSQL Global Development Group (2005): PostgreSQL 8.1.0 Documentation
PostgreSQL 8.1.0 Documentation
+
 
== Linksammlung ==
+
= Linksammlung =
  
 
JUMP[http://www.jump-project.org/ http://www.jump-project.org/]
 
JUMP[http://www.jump-project.org/ http://www.jump-project.org/]
  
Jump Pilot Project[http://jump-pilot.sourceforge.net/ http://jump-pilot.sourceforge.net/]  
+
Jump Pilot Project[http://jump-pilot.sourceforge.net/ http://jump-pilot.sourceforge.net/]
  
MapServer[http://www.umn-mapserver.de/ http://www.umn-mapserver.de/]  
+
MapServer[http://www.umn-mapserver.de/ http://www.umn-mapserver.de/]
  
OGP Surveying &amp; Positioning Committee[http://www.epsg.org/ http://www.epsg.org/]  
+
OGP Surveying &amp; Positioning Committee[http://www.epsg.org/ http://www.epsg.org/]
  
Open Geospatial Consortium[http://www.opengeospatial.org/ http://www.opengeospatial.org/]  
+
Open Geospatial Consortium[http://www.opengeospatial.org/ http://www.opengeospatial.org/]
  
OpenJUMP[http://openjump.org/wiki/show/HomePage http://openjump.org/wiki/show/HomePage]  
+
[[OpenJUMP]][http://openjump.org/wiki/show/HomePage http://openjump.org/wiki/show/HomePage]
  
PIROL, Fachhochschule Osnabrück[http://www.al.fh-osnabrueck.de/jump-download.html http://www.al.fh-osnabrueck.de/jump-download.html]  
+
PIROL, Fachhochschule Osnabrück[http://www.al.fh-osnabrueck.de/jump-download.html http://www.al.fh-osnabrueck.de/jump-download.html]
  
PostGIS[http://postgis.refractions.net/ http://postgis.refractions.net/]  
+
PostGIS[http://postgis.refractions.net/ http://postgis.refractions.net/]
  
 
PostgreSQL[http://www.postgresql.org/ http://www.postgresql.org/]
 
PostgreSQL[http://www.postgresql.org/ http://www.postgresql.org/]
 +
 +
[[Kategorie:PostGIS]]
 +
[[Kategorie:Tutorial]]
 +
[[Kategorie:Literatur]]
 +
[[Kategorie:OpenJUMP]]

Aktuelle Version vom 1. August 2013, 05:31 Uhr

PostGIS Tutorial (Grundlagen)

PostGIS Tutorial img 0.jpg


Source(s): GIS Lösungen


Version 2/2006
Uwe Dalluege
HCU Hamburg
Dept. Geomatik


Autor:
Dipl.-Ing. Uwe Dalluege
HafenCity Universität Hamburg
Department Geomatik
Hebebrandstr. 1
22297 Hamburg
E-Mail: uwe.dalluege@hcu-hamburg.de


Nutzungsbedingungen:
Dieser Text ist urheberrechtlich geschützt und wird unter der GNU Free Documentation License freigegeben
(http://www.gnu.org/licenses/fdl.txt).


Mit freundlicher Unterstützung von (in alphabetischer Reihenfolge):
Dipl.-Ing. Jürgen Faber
Dipl.-Ing. Kay Zobel


HCU Hamburg, Dept. Geomatik


Source(s): GIS Lösungen


Bevor die Post abgeht

PostGIS erweitert das objektrelationale Datenbankmanagementsystem PostgreSQL um GIS-Funktionalitäten, die der OpenGIS Spezifikation „OpenGIS Simple Features Specification For SQL“ folgen. PostGIS wurde von der kanadischen Firma Refractions Research entwickelt und unterliegt der GNU General Public License. Es gibt über 200 Funktionen, mit denen man z.B. räumliche Analysen durchführen oder Geometrie-Objekte bearbeiten und manipulieren kann.

Die besonderen Merkmale von PostGIS sind:

Um die Funktionalität von PostGIS besser demonstrieren zu können, werden hier das Tool pgAdmin III und das Programm OpenJUMP verwendet. Mit pgAdmin III kann man unter anderem eine Verbindung zum Datenbankserver aufbauen, Datenbanken verwalten, Tabellen darstellen oder auch SQL-Anweisungen ausführen. OpenJUMP ist ein Geoinformationssystem, mit dem man unter anderem auch PostGIS-Tabellen darstellen kann. Eine Beschreibung zu OpenJUMP und PostGIS-Anbindung finden Sie in dem OpenJUMP Tutorial (Grundlagen) in Kapitel 10.

Dieses Tutorial setzt Grundkenntnisse in SQL und OpenJUMP voraus!


Source(s): GIS Lösungen


Die pgAdmin III Oberfläche

Verbindung zum Datenbankserver aufbauen

Bevor wir mit PostGIS arbeiten können, müssen wir eine Verbindung zum Datenbankserver (kurz Server) aufbauen. Dazu müssen folgende Informationen bekannt sein:

  • der Name (Address; hier tarzan) oder die IP-Adresse des Datenbankservers
  • die Portnummer, unter der PostgreSQL angesprochen wird (Port; hier 5432)
  • der Datenbankname (Maintenance DB; hier db_s1234567)
  • der Benutzername (Username; hier s1234567)
  • das Benutzerpasswort (Password)

Nach dem Start von pgAdmin III klicken Sie auf den Stecker-Knopf (Add a connection to a server) und stellen eine Verbindung zum Server her.

Add a connection to a server


Source(s): GIS Lösungen


Die Baumstruktur

Im linken Fenster des pgAdmin Tools wird die Baumstruktur der Datenbankserver dargestellt. In der unteren Abbildung wurde nur die Verbindung zu einem Server aufgebaut (PostGIS-Server). Unterhalb der Serverebene befindet sich die Datenbankebene (Databases). In unserem Beispiel befinden sich sieben Datenbanken, wobei wir mit der Datenbank db_s1234567 arbeiten wollen. Unterhalb der Datenbank (hier db_s1234567) befinden sich vier Ebenen mit den Bezeichnungen Casts, Languages, Schemas und Replication. Hier wird nur die Ebene Schemas beschrieben, weil sich dort unter der Ebene public unsere Tabellen (Tables) verbergen, mit denen wir arbeiten wollen.

Die Tabellen befinden sich unter dem Schema public

Unter Tables findet man die eigenen Tabellen und zwei Systemtabellen von PostGIS mit den Namen geometry_columns und spatial_ref_sys.

In der Tabelle geometry_columns werden die Tabellen verwaltet, die mit Hilfe von PostGIS-Funktionen erstellt wurden. In der Tabelle spatial_ref_sys stehen Projektionsparameter für die Transformation der Geometrien.


Source(s): GIS Lösungen


Das SQL-Fenster (Query Tool)

SQL-Anweisungen werden in einem separaten Fenster (Query Tool) eingegeben, das über Tools>Querytool oder mit PgAdmin SQL Query Icon aufgerufen wird. Das Fenster teilt sich in ein EDITOR-Fenster (oberer Bereich) und ein Informationsfenster auf. Im EDITOR-Fenster können SQL-Anweisungen eingegeben, korrigiert und gespeichert werden. Im Informationsfenster stehen die Ergebnisse der Anfrage an die Datenbank. Es können ein oder mehrere SQL-Anweisungen eingegeben werden, die mit Query>Execute oder über bbbbb ausgeführt werden. Alle Eingaben können über File>Save as... in eine Datei gespeichert werden und mit File>Open geladen werden.

SELECT-Anfrage mit Ergebnis


Source(s): GIS Lösungen


Testdaten

In Testdaten_PostGIS_Tutorial.zip befindet sich eine SQL-Datei und JUMP-Dateien mit den Geometrien für die Beispiele des PostGIS Tutorials. Allerdings müssen die Layer (jml-Dateien) aus OpenJUMP in eine [[PostGIS]-Datenbank übertragen werden, um die SQL-Anweisungen nachvollziehen zu können (Siehe PostGIS-Tutorial 3.2 Erfassung von Daten).


Source(s): GIS Lösungen


Funktionen zur Dateneingabe

Mit Hilfe der PostGIS Funktionen können Geometrien erzeugt und auf bestehende Geometrien Analysen durchgeführt werden. Viele Funktionen basieren auf den OpenGIS Spezifikationen die im OpenGIS-Dokument „OpenGIS Simple Features Specification For SQL“ beschrieben sind. Anhand von Beispielen werden einige Funktionen beschrieben und angewendet. Eine vollständige Beschreibung der Funktionen befindet sich einmal im PostGIS Manual und im oben erwähnten OpenGIS-Dokument.


Source(s): GIS Lösungen


Geometrien

Es sind drei verschiedene Basis-Geometrietypen definiert: POINT (Punkt), LINESTRING (Linienzug) und POLYGON (Fläche). Von diesen Basistypen sind vier weitere Geometrietypen abgeleitet: MULTIPOINT, MULTILINESTRING, MULTIPOLYGON und GEOMETRYCOLLECTION.

Geometrietypen (Quelle: JUMP, Technical Report)

Innerhalb einer Datenbanktabelle (Relation) können die Geometrien entweder im Textformat vorliegen (Well-known Text, WKT) oder im binären Format (Well-known Binary, [[WKB]]). Der Vorteil des WKT Formats liegt darin, dass mit einem einfachen Editor SQL-Statements erstellt werden können, um Geometrien zu erzeugen.


Source(s): GIS Lösungen


Beispiel

Ein Punkt (Point) wird im WKT Format wie folgt in einer Tabelle gespeichert:

'POINT ( 122.123 376.985 )'
Geometrietypen im WKT-Format (Quelle: OpenGIS Simple Features Specification for SQL)

Neben den Koordinaten muss auch das räumliche Bezugssystem (Spatial Referencing System, SRS) angegeben werden. In der Tabelle spatial_ref_sys sind Informationen über verschiedene räumliche Bezugssysteme gespeichert, die über einen Schlüssel angesprochen werden. Dieser Schlüssel wird Spatial Reference System Identifier (SRID) genannt. Z.B. haben wir für eine Gauß-Krüger Projektion im 3. Streifen einen SRID von 31467.


Source(s): GIS Lösungen


Tabelle mit Geometriespalte erstellen

Eine Tabelle kann Sachdaten und Geometriedaten enthalten. Die Tabellenspalten für die Sachdaten werden mit einer normalen SQL CREATE-Anweisung festgelegt. Die Spalte für die Geometriedaten muss mit der PostGIS-Funktion (OpenGIS) AddGeometryColumn ( ) erzeugt werden, wobei pro select-Statement nur eine Geometriespalte angelegt werden kann. Es sind also zwei Schritte notwendig, um eine Tabelle mit einer Geometriespalte zu erzeugen:

 CREATE TABLE ...
 SELECT AddGeometryColumn ( ... )


Source(s): GIS Lösungen


AddGeometryColumn ( )

Die Funktion AddGeometryColumn ( ) kann mit verschiedenen Parametern aufgerufen werden:

AddGeometryColumn ( Schemaname, Tabellenname, Spaltenname, SRID, Geometrietyp, Dimension )

oder wenn die Tabelle im Standardschema (public) erstellt werden soll:

AddGeometryColumn ( Tabellenname, Spaltenname, SRID, Geometrietyp, Dimension )
Parameter Typ Beschreibung
Schemaname VARCHAR    Das Schema, unter der die Tabelle erstellt werden soll
Tabellenname    VARCHAR Name der Tabelle
Spaltenname VARCHAR Name der Geometriespalte
SRID INTEGER Spatial Reference System Identifier, z.B. 31467 für Gauß-Krüger oder -1 wenn nicht gesetzt.
Geometrietyp VARCHAR z.B. 'POINT', 'LINESTRING', 'POLYGON'
Dimension INTEGER Dimension der Punkte (2 oder 3)


Source(s): GIS Lösungen


Beispiel POINT

Es soll eine Tabelle mit Bäumen erstellt werden. Die Bäume sollen als Punkt (POINT) mit einem Primärschlüssel und dem Namen gespeichert werden. Zuerst erstellen wir eine Tabelle mit der SQL-Anweisung CREATE:

 CREATE TABLE baeume ( ps INTEGER, name VARCHAR );

Dann erzeugen wir die Geometriespalte mit der SELECT-Anweisung und der Funktion AddGeometryColumn ( ):

 SELECT AddGeometryColumn ( 'baeume', 'geom', -1, 'POINT', 2 );

Beispiel LINESTRING:

Es soll eine Tabelle mit Straßen und Straßennamen erstellt werden. Die Straßen sollen als LINESTRING gespeichert werden.

 CREATE TABLE strassen ( ps INTEGER, name VARCHAR );
 SELECT AddGeometryColumn ( 'strassen', 'geom', -1, 'LINESTRING', 2 );


Source(s): GIS Lösungen


Beispiel POLYGON

Es soll eine Tabelle mit Grundstücken und Eigentümern erstellt werden. Die Grundstücke werden als POLYGON gespeichert.

 CREATE TABLE grundstuecke ( ps INTEGER, eigentuemer VARCHAR );
 SELECT AddGeometryColumn ( 'grundstuecke', 'geom', -1, 'POLYGON', 2 );


Source(s): GIS Lösungen


Geometriedaten in Tabelle einfügen

Nachdem die Tabelle mit

 CREATE TABLE baeume ( ps INTEGER, name VARCHAR );
 SELECT AddGeometryColumn ( 'baeume', 'geom', -1, 'POINT', 2 );

oder

 CREATE TABLE strassen ( ps INTEGER, name VARCHAR );
 SELECT AddGeometryColumn ( 'strassen', 'geom', -1, 'LINESTRING', 2 );

oder

 CREATE TABLE grundstuecke ( ps INTEGER, eigentuemer VARCHAR );
 SELECT AddGeometryColumn ( 'grundstuecke', 'geom', -1, 'POLYGON', 2 );

erstellt wurde (siehe Kapitel 2.2.1), sollen Daten in die Tabelle geschrieben werden. Die Geometriedaten sollen im WKT-Format gespeichert werden. Dazu benötigen wir die Funktion GeometryFromText ( ).


Source(s): GIS Lösungen


GeometryFromText ( )

Die Funktion GeometryFromText ( ) erzeugt ein Objekt vom Typ Geometry. Die Geometriedaten werden im WKT-Format übergeben.

GeometryFromText ( text, SRID )
Parameter Typ Beschreibung
text VARCHAR Geometrie im WKT-Format, z.B. 'POINT ( 10 20 )'
SRID INTEGER Spatial Reference System Identifier, z.B. 31467 für Gauß-Krüger oder -1 wenn nicht gesetzt.


Source(s): GIS Lösungen


Beispiel POINT

In die Tabelle baeume (siehe Kapitel 2.3) sollen der Primärschlüssel, der Baumname und die Koordinaten des Baumes P = ( 10, 20 ) eingefügt werden.

 INSERT INTO baeume VALUES ( 1234, 'Eiche', GeometryFromText ( 'POINT ( 10 20 )', -1 ) );

Hinweis:

  • Die Koordinaten eines Punktes sind durch ein Leerzeichen getrennt!


Source(s): GIS Lösungen


Beispiel LINESTRING

In die Tabelle strassen (siehe Kapitel 2.3) sollen der Primärschlüssel, der Straßenname und die Koordinaten der Straßenachse P1 = ( 30, 35 ); P2 = ( 45, 57 ); P3 = ( 60, 83 ) eingefügt werden.

 INSERT INTO strassenVALUES ( 4567, 'Hofweg', GeometryFromText ( 'LINESTRING ( 30 35, 45 57, 60 83 )', -1 ) );

Hinweis:

  • Die Koordinaten eines Punktes sind durch ein Leerzeichen getrennt!
  • Die Punkte sind durch Komma getrennt.


Source(s): GIS Lösungen


Beispiel POLYGON

In die Tabelle grundstuecke (siehe Kapitel 2.3) sollen der Primärschlüssel, der Eigentümer und die Koordinaten des Grundstücks P1 = ( 75, 20 ); P2 = ( 80, 30 ); P3 = ( 90, 22 ) P4 = ( 85, 10 ); P5 = P1 = ( 75, 20 ) eingefügt werden.

 INSERT INTO grundstueckeVALUES ( 10, 'Mayer', GeometryFromText ( 'POLYGON ( ( 75 20, 80 30, 90 22, 85 10, 75 20 ) )', -1 ) );

Hinweis:

  • Die Koordinaten eines Punktes sind durch ein Leerzeichen getrennt!
  • Die Punkte sind durch Komma getrennt.
  • Die Koordinaten des Polygons stehen in zwei öffnenden und zwei schließenden Klammern.


Source(s): GIS Lösungen


Tabelle mit Geometriespalte löschen

Durch die Funktion AddGeometryColumn ( ) wird eine Datenzeile in die Tabelle geometry_columns geschrieben, die Informationen für PostGIS über die neu angelegte Tabelle enthält. Würde man diese neu angelegte Tabelle mit der SQL-Anweisung DROP TABLE tabellenname löschen, würde die Systemtabelle geometry_columns nicht aktualisiert werden. Die entsprechende Datenzeile würde nicht gelöscht werden! Eine Tabelle mit einer Geometriespalte muss daher mit der Funktion DropGeometryTable ( ) gelöscht werden.


Source(s): GIS Lösungen


DropGeometryTable ( )

Die Funktion DropGeometryTable ( ) löscht eine Tabelle mit Geometriespalte und den entsprechenden Eintrag in der Systemtabelle geometry_columns.

DropGeometryTable ( Schemaname, Tabellenname )

oder

DropGeometryTable ( Tabellenname )
Parameter Typ Beschreibung
Schemaname VARCHAR Schemaname unter der sich die Tabelle befindet
Tabellenname VARCHAR Zu löschende Tabelle


Source(s): GIS Lösungen


Beispiel

Die Tabelle baeume soll gelöscht werden:

 SELECT DropGeometryTable ( 'baeume' );


Source(s): GIS Lösungen


OpenJUMP

Darstellung von Tabellen

Nachdem die Tabelle baeume mit folgenden Anweisungen erstellt und mit Daten gefüllt wurde (drei Bäume),

 CREATE TABLE baeume ( ps INTEGER, name VARCHAR );
 SELECT AddGeometryColumn ( 'baeume', 'geom', -1, 'POINT', 2 );
 INSERT INTO baeume VALUES ( 1234, 'Eiche', GeometryFromText ( 'POINT ( 10 20 )', -1 ) );
 INSERT INTO baeume VALUES ( 2234, 'Buche', GeometryFromText ( 'POINT ( 40 30 )', -1 ) );
 INSERT INTO baeume VALUES ( 3234, 'Linde', GeometryFromText ( 'POINT ( 20 40 )', -1 ) );

soll die Tabelle in OpenJUMP dargestellt werden.

Eine ausführliche Beschreibung zur Konfiguration von OpenJUMP und PostGIS finden Sie im OpenJUMP Tutorial (Grundlagen) Kapitel 10. Mit File>Load Dataset(s)... erscheint ein Fenster, in dem unter Format: PostGIS Table ausgewählt werden muss, um die Maske zur Eingabe der Datenbankserverdaten zu erhalten.

Die Tabelle baeume aus der Datenbank db_s1234567 soll geladen werden
Die Tabelle baeume aus der Datenbank db_s1234567 soll geladen werden

In OpenJUMP wird für jede Tabelle ein neuer Layer mit dem Namen der Tabelle erstellt, d.h. auf dem Layer baeume finden wir unsere drei Bäume wieder. Mit RechtsKlick auf den Layernamen und View/Edit Attributes werden die Attribute der Tabelle baeume angezeigt.

Attribute und Geometrien der Tabelle baeume


Source(s): GIS Lösungen


Erfassung von Daten

Geometrien und Sachdaten, die in OpenJUMP erfasst wurden, können in PostGIS-Tabellen gespeichert werden. Hierbei wird jeder Layer in einer eigenen Tabelle gespeichert. Eine ausführliche Beschreibung zur Konfiguration von OpenJUMP und PostGIS finden Sie im OpenJUMP Tutorial (Grundlagen) Kapitel 10.

Um einen Layer in einer PostGIS-Tabelle speichern zu können, muss jeder Geometrie ein eindeutiger Schlüssel, z.B. der Primärschlüssel, zugeordnet werden. Mit Rechtsklick auf den Layernamen und View/Edit Schema wird das Schema für die PostGIS-Tabelle erstellt (siehe OpenJUMP Tutorial, Kapitel 6). Das Schema muss mindestens aus einem eindeutigen Schlüssel bestehen. Mit View/Edit Attributes werden die entsprechenden Sachdaten erfasst (siehe OpenJUMP Tutorial, Kapitel 7).

Datei:PostGIS Tutorial Schema mit Primärschlüssel (ps) des Layers Gebaeude.jpg
Schema mit Primärschlüssel (ps) des Layers Gebaeude

Vor dem Sichern der Tabelle muss der Spatial Reference System Identifier (SRID) (siehe Kapitel 2.2.1) für den zu sichernden Layer gesetzt werden. Mit Rechtsklick Layername>Change SRID wird der Wert gesetzt.

Change SRID

Mit File>Save dataset as... wird der markierte Layer in einer PostGIS-Tabelle gesichert. Hinter Unique Column: steht der Spaltenname des Primärschlüssels (hier ps). Der zu sichernde Layername wird hinter Table: eingegeben (hier gebaeude).

Layer gebaeude in einer PostGIS-Tabelle sichern
Layer gebaeude in einer PostGIS-Tabelle sichern
Tabelle gebaeude in der Datenbank db_s1234567


Source(s): GIS Lösungen


Sichten (Views)

Grundlagen

In den bisherigen Beispielen wurden alle Datensätze einer Tabelle in OpenJUMP] dargestellt. Es wurden z.B. alle Bäume der Tabelle baeume oder alle Gebäude der Tabelle gebaeude auf jeweils einem Layer dargestellt. Für eine sinnvolle Analyse ist das nicht ausreichend! Man möchte z.B. nur die Eichen sehen oder nur die Gebäude, die Herrn oder Frau Mayer gehören. Vielleicht möchte man auch alle Eichen sehen, die auf dem Grundstück von Frau Schulze stehen. In diesem Fall benötigt man Daten aus zwei oder mehreren Tabellen. Es soll also nur eine bedingte Sicht (View) auf die Tabellen dargestellt werden! Mit der SQL-Anweisung CREATE VIEW ... werden solche Sichten erstellt. Das Beispiel bezieht sich auf die Tabelle baeume (siehe Kapitel 3.1).


Source(s): GIS Lösungen


Beispiel

 CREATE VIEW v_baeume ( Baumnamen ) AS
 SELECT name, geom FROM baeume
 WHERE name = 'Eiche';
v_baeume = Name der Sicht; das Präfix v_ dient nur zur besseren Unterscheidung.
( Baumname ) = Spaltenname der ersten Spalte in der Sicht.
  Hier können mehrere Namen durch Komma  getrennt stehen.
name = Spaltenname aus der Tabelle baeume
geom = Spaltenname der Geometriespalte der Tabelle baeume

In diesem Beispiel wird eine Sicht mit dem Namen v_baeume auf die Tabelle baeume erstellt, wo nur die Eichen von Interesse sind. Um die Tabelle in OpenJUMP darstellen zu können, darf natürlich die Geometriespalte (hier geom) hinter der SELECT-Anweisung der Sicht nicht fehlen. Die Sicht v_baeume kann man mit der SELECT-Anweisung anzeigen:

 SELECT * FROM v_baeume;
Ergebnis der SELECT-Anfrage auf die Sicht v_baeume

Es wird nur ein Datensatz (Tupel) angezeigt, weil die Tabelle baeume nur eine Eiche enthält!


Source(s): GIS Lösungen


Sichten in pgAdmin III

In de:pgAdmin III tauchen die Sichten (Views) nicht unter Tables, sondern unter Views auf:

Die Sicht v_baeume unter der Ebene Views


Source(s): GIS Lösungen


Sichten in OpenJUMP darstellen

Sichten mit einer Geometriespalte können in OpenJUMP nur dargestellt, aber nicht erzeugt werden. Zur Darstellung muss nur in der Eingabemaske Load Dataset(s) anstelle des Tabellennamens der Name der Sicht eingegeben werden. In unserem Beispiel sehen wir dann nur eine einsame Eiche!

Einsame Eiche der Sicht v_baeume
Einsame Eiche der Sicht v_baeume


Source(s): GIS Lösungen


Verbund von Tabellen (Join)

Bisher wurden die Sachdaten und Geometrien in einem Datensatz (Tupel) zusammengefasst. Zu jeder Geometrie eines Gebäudes oder Grundstücks wurde z.B. der Eigentümer gespeichert. Besitzt ein Eigentümer mehrere Häuser oder Grundstücke, taucht der Name und die Adresse des Eigentümers mehrfach in unserer Tabelle auf. Die Eigentümerdaten sind redundant! Ändert sich z.B. die Adresse eines Eigentümers der mehrere Grundstücke besitzt, müssen alle Datensätze des Eigentümers geändert werden, was zu Fehlern führen kann. Wird ein Datensatz übersehen, ist die Tabelle inkonsistent.

Sinnvoller wäre es, die Eigentümerdaten in einer Tabelle abzulegen und die Geometrien in einer zweiten Tabelle.

Datei:PostGIS Tutorial Eigentümertabelle ohne Geometrien (eigentuemer nor).jpg
Eigentümertabelle ohne Geometrien (eigentuemer_nor)
Datei:PostGIS Tutorial Grundstückstabelle ohne direkte Eigentümer (grund fs nor).jpg
Grundstückstabelle ohne direkte Eigentümer (grund_fs_nor)

Die Verknüpfung der beiden Tabellen erfolgt über Primär- (ps) und Fremdschlüssel (fs). Die Tabelle mit den Geometrien enthält als Fremdschlüssel den Primärschlüssel der Eigentümertabelle. Die Firma GlobalPlayer (ps = 30 der Eigentümertabelle) besitzt demnach 2 Grundstücke ( ps = 100 und 300 der Grundstückstabelle)! Sollen alle Grundstücke und die dazugehörigen Eigentümer aufgelistet werden, müssen beide Tabellen verbunden werden (join):

 SELECT e.name, e.ort, g.geom
 FROM eigentuemer_nor AS e, grund_fs_nor AS g
 WHERE e.ps = g.fs;
Ergebnis der SELECT-Anfrage

Sollen diese Grundstücke in OpenJUMP dargestellt werden, muss eine Sicht (View; siehe Kapitel 4) erstellt werden:

 CREATE VIEW v_eigen_fs_nor ( name, ort, telef, geom ) AS
 SELECT e.name, e.ort, e.telef, g.geom
 FROM eigentuemer_nor AS e, grund_fs_nor AS g
 WHERE e.ps = g.fs;

Sollen nur die Grundstücke der Firma GlobalPlayer dargestellt werden, muss noch eine Bedingung an die SELECT-Anweisung angehängt werden (AND e.name = 'GlobalPlayer'):

 CREATE VIEW v_eigen_glob__fs_nor ( name, ort, telef, geom ) AS
 SELECT e.name, e.ort, e.telef, g.geom
 FROM eigentuemer_nor AS e, grund_fs_nor AS g
 WHERE e.ps = g.fs AND e.name = 'GlobalPlayer';


Source(s): GIS Lösungen


Analysefunktionen

Allgemeines

Die Geometrien für die folgenden Beispiele wurden mit Hilfe von OpenJUMP erstellt. Hierzu wurde eine DGK5 von Norderstedt als Digitalisierungsvorlage verwendet. Diese Karte wird von einem WMS-Server mit der URL http://gis.rzcn.haw-hamburg.de/cgi-bin/mapserv.exe?map=c:/mapserver/wms/htdocs/norderstedt.map zur Verfügung gestellt.

Rasterkarte als Digitalisierungsvorlage

Längenberechnung Length ( )

Die Funktion Length ( ) berechnet die Länge eines Linienzuges (LineString).

Length ( Linestring ) : Double Precision
Parameter Typ Beschreibung
Linestring GEOMETRY Linienzug

Beispiel

Gegeben:

Tabelle strassen_nor mit vier Straßen:

Tabelle strassen_nor

Gesucht:

  • Die Straßenlänge jeder Straße.
  • Die Gesamtlänge aller Straßen.
  • View mit Straßennamen, Längen und Geometrien (siehe auch Kapitel 4).

Lösung 1:

 SELECT name, Length ( geom ) AS laenge FROM strassen_nor;

Lösung 2:

 SELECT Sum ( Length ( geom ) ) AS gesamtlaenge FROM strassen_nor;

Lösung 3:

 CREATE VIEW v_strassen_nor_laenge ( Name, Laenge) AS
 SELECT name, Length ( geom ), geom FROM strassen_nor;
View v_strassen_nor_laenge in OpenJUMP

Abstand Distance ( )

Die Funktion Distance ( ) berechnet den Abstand zwischen zwei Geometrien.

Distance ( geom1, geom2 ) : Double Precision
Parameter Typ Beschreibung
geom1 GEOMETRY erste Geometrie
geom2 GEOMETRY zweite Geometrie

Beispiel

Von der Schule Lütjenmoor sollen die Entfernungen zu den Haltestellen ermittelt werden.

Gegeben:

Die Tabelle schulen_nor mit den Schulen und die Tabelle haltestellen_nor mit den Haltestellen.

Tabelle schulen_nor
Tabelle haltestellen_nor

Gesucht:

  • Die Entfernungen der Haltestellen zur Schule Lütjenmoor.

Lösung:

 SELECT s.name, h.linie, Distance ( s.geom, h.geom ) AS entfernung
 FROM schulen_nor AS s, haltestellen_nor AS h
 WHERE s.name = 'Lütjenmoor'
 ORDER BY entfernung;

Flächenberechnung Area ( )

Die Funktion Area ( ) berechnet den Flächeninhalt eines POLYGONS.

Area ( Polygon ) : Double Precision
Parameter Typ Beschreibung
Polygon GEOMETRY Geschlossenes Polygon

Beispiel

Gegeben:

Tabelle grundstuecke_nor mit vier Grundstücken:

Tabelle grundstuecke_nor

Gesucht:

  • Die Fläche jedes Grundstücks.
  • Die Gesamtfläche der Grundstücke der Familie Mayer.
  • View mit Eigentümer, Flächen und Geometrien der Familie Mayer.

Lösung 1:

 SELECT eigentuemer, Area ( geom ) AS flaeche FROM grundstuecke_nor;

Lösung 2:

 SELECT eigentuemer, Sum ( Area ( geom ) ) AS gesamtflaeche
 FROM grundstuecke_nor
 WHERE eigentuemer = 'Mayer'
 GROUP BY eigentuemer;
Datei:PostGIS Tutorial Die Gesamtfläche der Grundstücke der Familie Mayer.jpg
Die Gesamtfläche der Grundstücke der Familie Mayer

Lösung 3:

 CREATE VIEW v_mayer ( eigentuemer, flaechen ) AS
 SELECT eigentuemer, Area ( geom ), geom
 FROM grundstuecke_nor
 WHERE eigentuemer = 'Mayer';
SELECT * FROM v_mayer;
View v_mayer in OpenJUMP

Distanzbereich Buffer ( )

Die Funktion Buffer ( ) erzeugt ein POLYGON mit einem Abstand zu einer gegebenen Geometrie.

Buffer ( Geometrie, Abstand [, AnzSeg ] ) : POLYGON
Parameter Typ Beschreibung
Geometrie GEOMETRY POINT, LINESTRING oder POLYGON
Abstand Double Precision Abstand zur gegebenen Geometrie
AnzSeg Integer Anzahl der Segmente des berechneten Polygons

Beispiel POINT

Gegeben:

Tabelle baeume_nor mit Bäumen und Kronendurchmesser:

Tabelle baeume_nor

Gesucht:

  • View mit Geometrien der Bäume in Abhängigkeit des Kronendurchmessers.

Lösung:

 CREATE VIEW v_buffer_baeume_nor ( name, krone ) AS
 SELECT name, krone, SetSRID ( Buffer ( geom, krone / 2. ), 31467 )
 FROM baeume_nor;

Hinweis:

  • An die Funktion Buffer ( ) wird die Geometrie der Bäume (hier POINT) und der Kronendurchmesser übergeben. Die von Buffer ( ) erzeugte Geometrie wird ein kreisförmiges Polygon mit dem Radius krone / 2. sein.
  • Die Funktion Buffer ( ) wird innerhalb der Funktion SetSRID ( ) aufgerufen. Die Funktion SetSRID ( ) weist der von Buffer ( ) erzeugten Geometrie den SRID von 31467 zu (siehe auch Kapitel 2.1),

In OpenJUMP können dann die Bäume in Abhängigkeit des Kronendurchmessers dargestellt werde.

Datei:PostGIS Tutorial Buffer um die Bäume in Abhängigkeit des Kronendurchmessers.jpg
Buffer um die Bäume in Abhängigkeit des Kronendurchmessers

Beispiel LINESTRING:

Gegeben:

Tabelle strassen_nor

Tabelle strassen_nor

Gesucht:

  • View mit Geometrie der Straße Kohfurth, die auf 20 m verbreitert werden soll.

Lösung:

 CREATE VIEW v_kohfurth AS
 SELECT name, SetSRID ( Buffer ( geom, 20. ), 31467 ) AS geom
 FROM strassen_nor
 WHERE name = 'Kohfurth';

Schnittmenge Intersection ( )

Die Funktion Intersection ( ) berechnet die Schnittmenge zweier Geometrien. Das Ergebnis ist entweder eine neue oder eine leere (EMPTY) Geometrie. Mit der Funktion IsEmpty ( geometry ) kann geprüft werden, ob die Geometrie leer ist.

Intersection ( geom1, geom2 ) : GEOMETRY oder EMPTY
Parameter Typ Beschreibung
geom1 GEOMETRY erste Geometrie
geom2 GEOMETRY zweite Geometrie

Beispiel

Die Straße Berliner Allee soll verbreitert werden. Gesucht sind alle Grundstücke, die von der Verbreiterung betroffen sind.

Gegeben:

Eine Tabelle mit dem Polygon der verbreiterten Straße (b_BerlinerAllee; Buffer der Straße) und eine Tabelle mit den Geometrien der Grundstücke (grundstuecke_nor).

Gesucht:

  • Die Schnittmenge des Polygons mit den Grundstücken.
Datei:PostGIS Tutorial Schnittmenge zwischen verbreiterter Berliner Allee und betroffenen Grundstücken wird gesucht.jpg
Schnittmenge zwischen verbreiterter Berliner Allee und betroffenen Grundstücken wird gesucht

Lösung:

Die Tabelle grundstuecke_nor enthält 4 Grundstücke mit den entsprechenden Geometrien. Die Tabelle b_BerlinerAllee enthält die Buffer-Geometrie. Wird eine SELECT-Anfrage über beide Tabellen ausgeführt (join), erhält man das Kreuzprodukt aus der Zeilenanzahl beider Tabellen, also 4 Ergebnisse. Zwei Geometrien müssen leer (EMPTY) sein, weil zwei Grundstücke nicht in der Schnittmenge liegen!

 SELECT Intersection ( g.geom, b.geom )
 FROM grundstuecke_nor AS g, b_BerlinerAllee AS b;
Kreuzprodukt mit 2 leeren Geometrien

Die leeren (EMPTY) Geometrien müssen noch durch eine WHERE-Klausel und der IsEmpty ( ) PostGIS-Funktion entfernt werden.

 SELECT Intersection ( g.geom, b.geom )
 FROM grundstuecke_nor AS g, b_BerlinerAllee AS b
 WHERE IsEmpty ( Intersection ( g.geom, b.geom ) ) = FALSE;
Die gesuchte Schnittmenge

Sollen noch die Eigentümer angezeigt und der SRID verändert werden, so sieht die SQL-Anweisung wie folgt aus:

 SELECT g.eigentuemer, SetSRID ( Intersection ( g.geom, b.geom ), 31467 ) AS geom
 FROM grundstuecke_nor AS g, b_BerlinerAllee AS b
 WHERE IsEmpty ( Intersection ( g.geom, b.geom ) ) = FALSE;

Zur Darstellung in OpenJUMP erzeugen wir eine Sicht:

 CREATE VIEW v_intersection ( name, geom ) AS
 SELECT g.eigentuemer, SetSRID ( Intersection ( g.geom, b.geom ), 31467 ) AS geom
 FROM grundstuecke_nor AS g, b_BerlinerAllee AS b
 WHERE IsEmpty ( Intersection ( g.geom, b.geom ) ) = FALSE;
Schulze und Mayer sind betroffen

Konvexe Hülle ConvexHull ( )

Die Funktion ConvexHull ( ) berechnet eine konvexe Hülle um eine oder mehrere Geometrien. Eine konvexe Hülle um eine Punktmenge ist das kürzeste Polygon, das diese Punktmenge umschließt. Spannt man z.B. ein Gummiband um die Punktmenge, so erhält man eine konvexe Hülle. Zur Veranschaulichung legen wir eine konvexe Hülle (rotes Polygon), um Geometrien vom Typ POINT:

ConvexHull ( geom ) : POLYGON
Parameter Typ Beschreibung
geom GEOMETRY Geometrie, um die eine konvexe Hülle gelegt werdensoll.

Hinweis:

Soll eine konvexe Hülle um eine Menge von Punkten (POINT) gelegt werden, müssen die Punkte mit der Funktion GeomUnion ( geometry set ) zu einer Geometrie zusammengefasst werden.

Beispiel

Bei einem kleinen Wäldchen in Norderstedt sind nur die Bäume in einer Tabelle erfasst. Das Wäldchen soll eingezäunt werden. Gesucht ist der kürzeste Zaun und die eingezäunte Fläche.

Gegeben:

Eine Tabelle (waldgebiet1_nor) mit den Geometrien der Bäume.

Gesucht:

  • Konvexe Hülle um die Bäume.

Lösung:

Die Punkte der Tabelle waldgebiet1_nor müssen erst mit der Funktion GeomUnion ( geometry set ) zu einer Geometrie zusammengefasst werden. Danach kann die konvexe Hülle berechnet werden. Dies kann alles in einer SQL-Anweisung geschehen.

 SELECT ConvexHull ( GeomUnion ( geom ) ) FROM waldgebiet1_nor;

Soll die Fläche berechnet werden, muss nur die Funktion Area ( ) aufgerufen werden:

 SELECT Area ( ConvexHull ( GeomUnion ( geom ) ) ) AS flaeche FROM waldgebiet1_nor;

Zur Darstellung in OpenJUMP berechnet man die konvexe Hülle mit den Punkten aus der Tabelle waldgebiet1_nor und erzeugt daraus eine Sicht (View).

 CREATE VIEW v_waldconvex ( geom ) AS
 SELECT ConvexHull ( GeomUnion ( geom ) ) FROM waldgebiet1_nor;

Leider kann man aus der konvexen Hülle (POLYGON) nicht direkt die Länge des Polygons mit der Funktion Length ( ) berechnen, sondern muss zuerst einen Linienzug (LINESTRING) aus dem POLYGON machen. Dazu dient unter anderem die Funktion Boundary ( )<tt>. Da die Funktion <tt>Boundary ( ) ein MULTIPOLYGON als Argument benötigt, muss die Funktion multi ( ) benutzt werden. Auf die Funktion Boundary ( ) und multi ( ) wird im Moment nicht näher eingegangen.

Die Zaunlänge um das Wäldchen kann also folgendermaßen ermittelt werden:

 SELECT Length ( Boundary ( multi ( geom ) ) ) AS Zaunlaenge FROM v_waldconvex;

Contains ( ) und Within ( )

  • Die Funktion Contains ( ) prüft, ob die erste Geometrie geom1 die zweite Geometrie geom2 enthält.
  • Die Funktion Within ( ) prüft, ob die zweite Geometrie geom2 die erste Geometrie geom1 enthält.

Als Ergebnis wird ein Wert vom Typ BOOLEAN zurückgegeben (TRUE, FALSE);

Contains ( geom1, geom2 ) : Boolean oder Within ( geom1, geom2 ) : Boolean
Parameter Typ Beschreibung
geom1 GEOMETRY erste Geometrie
geom2 GEOMETRY zweite Geometrie

Beispiel

Gesucht sind alle Bäume, die auf privaten Grundstücken stehen.

Gegeben:

Die Tabelle grundstuecke_nor mit den Geometrien und Eigentümern der privaten Grundstücke und die Tabelle baeume_nor mit den Geometrien und Attributen der Bäume.

Datei:PostGIS Tutorial Sieben von neun Bäumen stehen auf den privaten Grundstücken.jpg
Sieben von neun Bäumen stehen auf den privaten Grundstücken

Gesucht:

  • Alle Bäume, die auf den Grundstücken stehen.

Lösung mit Contains ( ):

 SELECT gr.eigentuemer, b.name
 FROM grundstuecke_nor AS gr, baeume_nor AS b
 WHERE Contains ( gr.geom, b.geom ) = TRUE;

Hier wird geprüft, ob die Geometrien der Grundstücke die Geometrien der Bäume enthalten.

Datei:PostGIS Tutorial Sieben Bäume stehen auf den privaten Grundstücken.jpg
Sieben Bäume stehen auf den privaten Grundstücken

Lösung mit Within ( ):

 SELECT gr.eigentuemer, b.name
 FROM grundstuecke_nor AS gr, baeume_nor AS b
 WHERE Within ( b.geom, gr.geom ) = TRUE;

Hier wird geprüft, ob die Geometrien der Bäume in den Geometrien der Grundstücke enthalten sind.

Hinweis: Es muss darauf geachtet werden, ob die Prüfung sinnvoll ist. Punktgeometrien können z.B. niemals Polygone enthalten. Die WHERE-Bedingung wäre immer FALSE!


Literaturverzeichnis

  • Aquino, J., Davis M. (2004): JUMP Workbench User's Guide, Vivid Solutions
  • Aquino, J., Kim D. (2003): JUMP Developer's Guide, Vivid Solutions
  • Bill, R. (1999): Grundlagen der Geo-Informationssysteme, Band 1, Wichmann Verlag
  • Bill, R. (1999): Grundlagen der Geo-Informationssysteme, Band 2, Wichmann Verlag
  • Bill R., Zehner M. L. (2001): Lexikon der Geoinformatik, Wichmann Verlag
  • Eisentraut, P. (2003): PostgreSQL Das Offizielle Handbuch, mitp-Verlag Bonn
  • Lake, R., Burggraf D. S.,Trninic M., Rae L. (2004): Geography Mark-Up Language (GML), John Wiley & Sons, Ltd
  • Lange, N. (2002): Geoinformatik in Theorie und Praxis, Springer-Verlag Berlin Heidelberg New York
  • OGC (2003): OpenGIS Geography Markup Language (GML) Implementation Specification, Open GIS Consortium
  • OGC (2001): OpenGIS Implementation Specification: Coordinate Transformation Services, Open GIS Consortium
  • OGC (1999): OpenGIS Simple Features Specification For SQL Revision 1.1, Open GIS Consortium
  • OGC (2004): Web Map Service (WMS), Version: 1.3, Open GIS Consortium
  • OGC (2005) OpenGIS Implementation Specification for Geographic information, Open GIS Consortium
  • Simple feature access – Part 1: Common architecture
  • Simple feature access – Part 2: SQL option
  • Refractions Research (2005): PostGIS Manual
  • RRZN (2004): SQL Grundlagen und Datenbankdesign, Regionales Rechenzentrum / Universität Hannover
  • The PostgreSQL Global Development Group (2005): PostgreSQL 8.1.0 Documentation

Linksammlung

JUMPhttp://www.jump-project.org/

Jump Pilot Projecthttp://jump-pilot.sourceforge.net/

MapServerhttp://www.umn-mapserver.de/

OGP Surveying & Positioning Committeehttp://www.epsg.org/

Open Geospatial Consortiumhttp://www.opengeospatial.org/

OpenJUMPhttp://openjump.org/wiki/show/HomePage

PIROL, Fachhochschule Osnabrückhttp://www.al.fh-osnabrueck.de/jump-download.html

PostGIShttp://postgis.refractions.net/

PostgreSQLhttp://www.postgresql.org/